Erlang 当一个客户端行为不当时,Chumak会断开所有客户端的连接

Erlang 当一个客户端行为不当时,Chumak会断开所有客户端的连接,erlang,zeromq,chumak,Erlang,Zeromq,Chumak,我有几个使用zmqPython模块的zeromqreq客户机。我有一个用Erlang编写的服务器,它使用chumak为这些客户机实现REP 当一个客户端出现网络问题导致双重请求(例如,Wi-Fi中断一秒钟)时,chumak库出错、崩溃,并且由于chumak库崩溃,服务器必须重新启动(这是自动完成的)。发生这种情况时,每个客户端都会有一个短暂的hickup(打印一条“断开连接;重新连接”的消息) 令人担忧的是,当单个客户端行为不当时(例如,发送双重请求),chumak会崩溃。这在最好的情况下是令人

我有几个使用
zmq
Python模块的zeromqreq客户机。我有一个用Erlang编写的服务器,它使用
chumak
为这些客户机实现REP

当一个客户端出现网络问题导致双重请求(例如,Wi-Fi中断一秒钟)时,chumak库出错、崩溃,并且由于chumak库崩溃,服务器必须重新启动(这是自动完成的)。发生这种情况时,每个客户端都会有一个短暂的hickup(打印一条“断开连接;重新连接”的消息)

令人担忧的是,当单个客户端行为不当时(例如,发送双重请求),chumak会崩溃。这在最好的情况下是令人讨厌的,在最坏的情况下是DoS条件。由于错误在chumak库中(粘贴在下面),我想知道这是不可避免的,还是我可以做些什么来缓解这个问题

=ERROR REPORT==== 6-Jan-2018::18:43:37 ===
** Generic server <0.6905.501> terminating 
** Last message in was {queue_ready,"node3",<0.10180.501>}
** When Server state == {state,chumak_router,
                            {chumak_router,[],
                                {lbs,
                                    #{"node1" => [<0.26044.506>],
                                      "node2" => [<0.21607.505>],
                                      "node3" => [<0.10180.501>],
                                      "node4" => [<0.6607.501>],
                                      "node5" => [<0.6654.501>]},
                                    #{<0.6607.501> => "node4",
                                      <0.6654.501> => "node5",
                                      <0.10180.501> => "node3",
                                      <0.21607.505> => "node2",
                                      <0.26044.506> => "node1"}},
                                {from,
                                    {<0.6901.501>,
                                     #Ref<0.3489020567.326893569.74040>}},
                                {[],[]}},
                            #{}}
** Reason for termination == 
** {{noproc,{gen_server,call,[<0.10180.501>,incomming_queue_out]}},
    [{gen_server,call,2,[{file,"gen_server.erl"},{line,206}]},
     {chumak_router,recv_message,2,
                    [{file,"/opt/system/system_server/src/_build/default/lib/chumak/src/chumak_router.erl"},
                     {line,101}]},
     {chumak_router,queue_ready,3,
                    [{file,"/opt/system/system_server/src/_build/default/lib/chumak/src/chumak_router.erl"},
                     {line,91}]},
     {chumak_socket,queue_ready,3,
                    [{file,"/opt/system/system_server/src/_build/default/lib/chumak/src/chumak_socket.erl"},
                     {line,221}]},
     {gen_server,try_dispatch,4,[{file,"gen_server.erl"},{line,616}]},
     {gen_server,handle_msg,6,[{file,"gen_server.erl"},{line,686}]},
     {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,247}]}]}
=错误报告===2018年1月6日::18:43:37===
**通用服务器终止
**中的最后一条消息是{queue_ready,“node3”,}
**当服务器状态={state,chumak_路由器,
{chumak_路由器,[],
{lbs,
#{“node1”=>[],
“节点2”=>[],
“节点3”=>[],
“节点4”=>[],
“node5”=>[]},
#{=>“节点4”,
=>“节点5”,
=>“节点3”,
=>“节点2”,
=>“节点1”},
{从,
{,
#Ref}},
{[],[]}},
#{}}
**终止原因==
**{{noproc,{gen_server,call,[,incomming_queue_out]},
[{gen_server,call,2,[{file,“gen_server.erl”},{line,206}]},
{chumak_路由器,接收消息,2,
[{file,“/opt/system/system\u server/src/\u build/default/lib/chumak/src/chumak\u router.erl”},
{line,101}]},
{chumak_路由器,队列准备就绪,3,
[{file,“/opt/system/system\u server/src/\u build/default/lib/chumak/src/chumak\u router.erl”},
{line,91}]},
{chumak_套接字,队列准备就绪,3,
[{file,“/opt/system/system_server/src/_build/default/lib/chumak/src/chumak_socket.erl”},
{line,221}]},
{gen_server,try_dispatch,4,[{file,“gen_server.erl”},{line,616}]},
{gen_server,handle_msg,6,[{file,“gen_server.erl”},{line,686}]},
{proc_lib,init_p_do_apply,3,[{file,“proc_lib.erl”},{line,247}]}

我认为这是Chumak的一个缺陷。因为
chumak_peer
chumak_socket
运行并发,如果
chumak_peer
gen_server:call(PeerPid,incoming_queue_out)
之前崩溃,
chumak_socket
将无法正常运行

我已经向Chumak的作者提交了一个补丁。
请看。

谢谢。FWIW我在服务器(Erlang)端切换到ezmq,看起来工作正常。