我有几个使用zmq
Python模块的ZeroMQ REQ客户端。我有一个用Erlang编写的服务器,它使用chumak
为这些客户端实现REP。
当一个客户端出现导致双重请求的网络问题时(例如Wi-Fi停机一秒),chumak库出错,崩溃,服务器必须重启(这是自动完成的)到期到chumak库崩溃。发生这种情况时,每个客户都会暂时关闭(打印“断开连接;重新连接”的消息)。
担心的是当单个客户端行为不端时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}]}]}
答案 0 :(得分:1)
我认为这是Chumak的一个错误。由于chumak_peer
和chumak_socket
运行并发,如果chumak_peer
在gen_server:call(PeerPid, incoming_queue_out)
之前崩溃,chumak_socket
将无法正常运行。
我已经向Chumak的作者提交了一个补丁。 请看here。