【问题标题】:Ejabberd sequential vs parallel serverEjabberd 顺序与并行服务器
【发布时间】:2021-11-18 08:55:33
【问题描述】:

正如 Joe 的书中所定义的那样,TCP 并行服务器处理这样的连接:

{ok, Listen}=gen_tcp:listen(....),
spawn(fun() ->parallel(Listen) end).

parallel(Listen) ->
{ok, Socket}=gen_tcp:accept(Listen),
spawn(fun() ->parallel(Listen) end),
doSomething(Socket).

doSomething(....) ->
.... 

这是逻辑,当一个监听器接受一个连接时,它会在处理这个接受的连接之前产生一个监听新传入连接的进程,这是并行规则,好的。 在代表服务器网络层的 EJABBERD 模块 ejabberd_listener.erl 中,这是我发现的:

case listen_tcp(Port, SockOpts) of
    {ok, ListenSocket} ->
.... 
    
    accept(ListenSocket, Module, State, Sup, Interval, Proxy), 

.... 
accept(ListenSocket, Module,... ) ->

case gen_tcp:accept(ListenSocket) of
    {ok, Socket} ->
%%%% a lot of work
....
accept(ListenSocket, Module,.... );

所以这是一个顺序监听器,它比并行运行慢,那么为什么他们不使用并行机制来提高效率和性能呢?我是 ejabberd 的新手,我可能会遗漏一些东西

【问题讨论】:

    标签: erlang elixir ejabberd scalability erlang-otp


    【解决方案1】:

    我假设您正在谈论此代码:[1]。

    在这种情况下,如果您仔细观察,再进一步观察,函数start_connection 被称为[2]。 在该函数内部,使用了一个动态主管并添加了一个子项 [3]。您在这里没有使用spawn 原语,但它是由supervisor:start_child 函数[4] 抽象出来的。

    所以简而言之,是的,每个连接都是同时处理的,除了这里每个进程都被添加到一个动态主管,而不是由 spawn 原语创建的普通进程。

    [1]https://github.com/processone/ejabberd/blob/c3169e9eeab15f47b33a14a6b93cec67c38193a6/src/ejabberd_listener.erl#L235

    [2]https://github.com/processone/ejabberd/blob/c3169e9eeab15f47b33a14a6b93cec67c38193a6/src/ejabberd_listener.erl#L266

    [3]https://github.com/processone/ejabberd/blob/c3169e9eeab15f47b33a14a6b93cec67c38193a6/src/ejabberd_listener.erl#L316

    [4]http://erlang.org/doc/design_principles/sup_princ.html

    【讨论】:

      猜你喜欢
      • 2017-05-11
      • 2016-09-22
      • 2020-06-28
      • 2018-06-08
      • 1970-01-01
      • 2018-06-05
      • 2015-11-05
      • 1970-01-01
      • 2016-12-27
      相关资源
      最近更新 更多