我在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文档似乎暗示一个侦听套接字就足够了,除非我有很多客户端 我误解了吗?
答案 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
信令。