ejabberd如何实现IQ Handler的并行执行?
相关背景
我通过IQ discipline文档来了解IQ Handler。
IQ discipline定义了IQ Handler(一个函数)的执行方式,包含以下几种类型:
- no_queue:所有匹配该Handler的IQ请求在调用进程内顺序执行,速度快但会阻塞调用方。
- one_queue:为Handler创建一个进程,所有匹配的IQ请求都转发到该进程。缺点是如果处理速度不足,进程消息队列可能过载,最坏情况会因OOM(内存不足)导致模拟器崩溃。
- N :: integer():为Handler创建N个并行进程,所有匹配的IQ请求随机转发到其中一个进程。解决了one_queue的消息队列溢出问题,但无法保证IQ请求的顺序,部分场景可能受影响。N值不宜过大,因为从进程池选取进程的复杂度为O(N),实际设置超过50无明显收益。
- parallel:每个匹配的IQ请求都创建一个进程来执行Handler。不推荐使用,因为无节制创建进程通常是不良实践。
文档显示IQ Handler支持并行执行,其文档中的参数如下:
gen_iq_handler:add_iq_handler(Type :: ejabberd_local | ejabberd_sm, Host :: binary(), Namespace :: binary(), Module :: module(), Function :: atom(), IQDisc :: gen_iq_handler:type()) -> ok
但在master分支的gen_iq_handler.erl中,该API已被废弃:
%%==================================================================== %% Deprecated API %%==================================================================== -spec add_iq_handler(module(), binary(), binary(), module(), atom(), any()) -> ok. add_iq_handler(Component, Host, NS, Module, Function, _Type) - add_iq_handler(Component, Host, NS, Module, Function).
问题
我想了解如何实现IQ Handler的并行执行,已做过以下尝试:
- 查阅ejabberd官方文档
- 在Stack Overflow和GitHub搜索相关问题
- 在ejabberd讨论区发布相关问题
我预期可通过Erlang语法实现并行执行,但不知具体操作方法。
内容的提问来源于stack exchange,提问作者poporu
相关产品推荐
相关产品推荐

