【发布时间】:2021-11-30 06:56:37
【问题描述】:
我知道 ejabberd 服务器是高效的,并且专为高性能和容错而设计,但我不明白为什么我看到它的侦听器模块按顺序处理连接,在 Joe Armestrong 的书中我看到并行服务器的工作方式如下:
{ok, Listen}=gen_tcp:listen(....),
spawn(fun() ->parallel(Listen) end).
parallel(Listen) ->
{ok, Socket}=gen_tcp:accept(Listen),
spawn(fun() ->parallel(Listen) end),
handling(Socket).
handling(Socket) ->
....
但是在名为 ejabberd_listener.erl 的 EJABBERD 侦听器中,侦听机制很简单:主管有工人子级,每个子级代表一个模块侦听器及其侦听选项(端口、网络协议、IP、...),有 4 个或 5 个孩子和所有孩子在开始时运行两个函数之一:TCP 或 UDP,最后一个表示传入连接的侦听函数,当接受连接并创建 Socket 时,侦听器将 Socket 作为参数传递给模块的启动函数并继续接受其他连接,代码中最重要的部分是:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
init_tcp(PortIP, Module, Opts, SockOpts, Port, IPS) ->
%% Some of work
....
ListenSocket = listen_tcp(PortIP, Module, SockOpts, Port, IPS),
%% Some of work
....
accept(ListenSocket, Module,.... ),
%% Some of work
....
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
listen_tcp(....) ->
Res = gen_tcp:listen(....),
%% Some of work
....
case Res of {ok, ListenSocket} ->Listensocket;
%% Some of work
....
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
accept(ListenSocket, Module,... ) ->
case gen_tcp:accept(ListenSocket) of
{ok, Socket} ->
%% Some of work
....
Module:start(....,Socket,....),
%% Some of work
....
accept(ListenSocket, Module,.... );
很明显,这是一个顺序监听器,它的运行速度比并行慢,那么为什么他们不使用并行机制来提高效率和性能呢?可能是我搞砸了,或者这是因为它是社区版,你需要修改代码,所以谁有使用 Erlang 和 Ejabberd 的经验可以帮助我吗?
【问题讨论】:
标签: sockets erlang elixir ejabberd erlang-otp