我是否需要为少数ZeroMQ客户端启动多个服务器端工作人员?

时间:2017-11-24 02:32:56

标签: erlang zeromq chumak

我在erlang中使用Chumak,打开 ROUTER 套接字。

我有一小撮(4个左右)客户端使用Python zmq库向此服务器发送 REQ 请求。

大多数情况下,一切正常,但有时客户端会出现断开连接问题(自动重新连接在客户端代码中,并且可以正常工作)。我发现当一个客户端连接发生错误时,它似乎也转移到其他客户端,我得到了很多 ** {{noproc,{gen_server,call,[<0.31596.16>,incomming_queue_out]}},
在服务器上。

在服务器端,我只是打开一个chumak套接字并循环:

{ok, Sock} = chumak:socket( router ),
{ok, _}    = chumak:bind( Sock, tcp, "0.0.0.0", ?PORT ),
spawn_link( fun() -> loop( Sock ) end ),
...

loop( CmdSock ) ->
    {ok, [Identity, <<>>, Data]} = chumak:recv_multipart( Sock ),
    ...   

ZeroMQ文档似乎暗示一个侦听套接字就足够了,除非我有很多客户端 我误解了吗?

1 个答案:

答案 0 :(得分:1)

不,不需要增加Socket个实例

的数量

抽象很有助于减少了解典型用户的所有细节需求。只要这样的用户不得不进行性能调整或调试事件,这种生活便利就会停止。

让我们以这种方式迈出一步:
- 除非要移动一些乳齿象大小的数据有效载荷,否则只需要一个ROUTER - AccessPoint进入 Socket - 例如,数十,客户端数百,数千REQ - AccessPoints - 但是,这些数字会增加ROUTER - 侧 Context -instance的性能范围要求,以便能够处理所有可扩展的形式通信原型(pre处理,以便在适当的时间和公平的时尚发生。

这意味着,人们可以很快意识到产生Context的好处 - 在我的所有高性能设置中使用 zmq.AFFINITY < / strong>映射,以便在最高优先级Socket - 实例上确实挤出最大性能,而让非关键资源共享Context - 实例的共同子集IO-线程池。

接下来是 RAM
是的,这些玩具占据了记忆 检查所有.{RCV|SND}BUF.MAXMSGSIZE.{SND|RCV}HWM.BACKLOG.CONFLATE

接下来是 LINK-MANAGEMENT

不要犹豫,优化.IMMEDIATE.{RCV|SND}BUF.RECONNECT_IVL.RECONNECT_IVL_MAX.TCP_KEEPALIVE.TCP_KEEPALIVE_CNT.TCP_KEEPALIVE_INTVL.TCP_KEEPALIVE_IDLE

在实例化时始终设置.LINGER,因为辍学者不再是致命的。

接下来可能会出现一些防御和性能帮手工具:

.PROBE_ROUTER.TCP_ACCEPT_FILTER.TOS.HANDSHAKE_IVL

下一步?

如果游戏中没有与内存相关的问题,并且一旦提到重新连接,我怀疑是设置.IMMEDIATE +可能让ROUTER受益于明确的PROBE_ROUTER信令。