ZeroMQ HEARTBEAT sockopts() 设置如何工作?
How do ZeroMQ HEARTBEAT sockopts() settings work?
我正在使用 python 的 pyzmq==22.2.1,它应该支持 ZeroMQ 4.2.0(根据 API)
我正在尝试使用心跳套接字选项(ZMQ_HEARTBEAT_IVL
、ZMQ_HEARTBEAT_TIMEOUT
和 ZMQ_HEARTBEAT_TTL
)。但是,当我设置这些套接字选项时,我没有收到预期的 TimeoutException 或套接字上的任何异常。它似乎只是坐在那里什么都不做。
设置这些套接字选项后的预期行为是什么?
在服务器端,服务器如何检测客户端超时并错过了客户端的心跳,反之亦然(是否有异常或应该抛出的东西或其他东西?)。
我在下面设置了一个简单的路由器经销商回显示例:
# Server Code:
import zmq
c = zmq.Context()
s = c.socket(zmq.ROUTER)
s.setsockopt(zmq.HEARTBEAT_IVL, 1000)
s.setsockopt(zmq.HEARTBEAT_TIMEOUT, 5000)
s.setsockopt(zmq.HEARTBEAT_TTL, 5000)
s.bind('tcp://127.0.0.1:5555')
while True:
id, data = s.recv_multipart()
s.send_multipart([id, data], zmq.NOBLOCK)
# Client Code
import zmq
import time
c = zmq.Context()
s = c.socket(zmq.DEALER)
s.HEARTBEAT_IVL = 1000
s.HEARTBEAT_TIMEOUT = 5000
s.connect('tcp://127.0.0.1:5555')
i = 0
while True:
s.send(str(i).encode())
print(s.recv())
i += 1
time.sleep(1)
Q : What is the expected behaviour after setting these socket options ?
A :
嗯,
上述设置有双重效果。一,这实际上适用于您的设置目标(即发送和发送(最有可能 ZMTP/3.1)ZMTP_PING
面向连接的服务子层“ZMTP/3.1-服务包”和相互地,不确定,但大多数情况下,充分形成“ZMTP/{3.1|2.x|1.0}-服务包”(希望交付)回来。这些“服务包”在有线线路上可见(如果存在 - inproc://
-transport-class 和 vmci://
-transport-class 也没有典型用户可以挂机和嗅探流量的实际线路,但是某种用于 RAM 映射的指针杂技),因此协议分析器将“看到”它们的 ID 解码,如下所示:
a local-initiator
MAY send:
+------+----+
| %xNN | 24 |
+------+----+
0 1
flags size
+------+---+---+---+---+
| %xNN | P | I | N | G |
+------+---+---+---+---+
2 3 4 5 6
ZMTP/3.1-Command name "PING"
+---+---+
| |
+---+---+
7 8 ping-ttl 2B
MAY be zero
MAY be ttl stored as [0:15], being a 16-bit TTL in 1/100 [s] ~ max 6553 [s]
ttl provides a strong hint
to the other peer to disconnect
if no further traffic is received after that time.
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 0 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
ping-context (max 16B)
MAY be zero
MAY be context-specific context-payload, not more than 16B
a remote-peer
SHALL respond:
+------+----+
| %xNN | 22 |
+------+----+
0 1
flags size
+------+---+---+---+---+
| %xNN | P | O | N | G |
+------+---+---+---+---+
2 3 4 5 6
ZMTP/3.1-Command name "PONG"
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 0 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
ping-context (echoed as obtained from PING)
ZMTP/3.1 v/s ZMTP/3.0 v/s ZMTP/2.x v/s ZMTP/1.0 差异和细节在版本协商阶段得到解决,一旦连接设置服务的子层执行所有低级所需的握手(重新)协商,试图就版本、授权和安全相关原则达成一致
第二个效果(在 Context()
引擎实例的引擎盖下执行协商)是您永远不会看到与 ZeroMQ-(abstract)-Message-Transport-Protocol 的任何直接交互( ZMTP ) 定义了服务设置和维护流程。
我们只是享受(以上 ZMTP 生成的)公开的 API-调用来设置、配置和利用“我们的”用户级操作的信令/消息传递基础设施元平面,这是基于所有已知的- 如何“隐藏”在引擎盖下(并且应该保持如此 - 当然,除非有人决定卷起袖子并帮助开发 ZeroMQ 系统以实现其下一代)
Q : ( is there an exception or something that's supposed to be thrown or something ? )
一个:
这就是为什么必须首先告知上述所有内容的原因,作为正当的推理,对于您的第二个问题应该有一个公平和诚实的答案。
我正在使用 python 的 pyzmq==22.2.1,它应该支持 ZeroMQ 4.2.0(根据 API)
我正在尝试使用心跳套接字选项(ZMQ_HEARTBEAT_IVL
、ZMQ_HEARTBEAT_TIMEOUT
和 ZMQ_HEARTBEAT_TTL
)。但是,当我设置这些套接字选项时,我没有收到预期的 TimeoutException 或套接字上的任何异常。它似乎只是坐在那里什么都不做。
设置这些套接字选项后的预期行为是什么? 在服务器端,服务器如何检测客户端超时并错过了客户端的心跳,反之亦然(是否有异常或应该抛出的东西或其他东西?)。
我在下面设置了一个简单的路由器经销商回显示例:
# Server Code:
import zmq
c = zmq.Context()
s = c.socket(zmq.ROUTER)
s.setsockopt(zmq.HEARTBEAT_IVL, 1000)
s.setsockopt(zmq.HEARTBEAT_TIMEOUT, 5000)
s.setsockopt(zmq.HEARTBEAT_TTL, 5000)
s.bind('tcp://127.0.0.1:5555')
while True:
id, data = s.recv_multipart()
s.send_multipart([id, data], zmq.NOBLOCK)
# Client Code
import zmq
import time
c = zmq.Context()
s = c.socket(zmq.DEALER)
s.HEARTBEAT_IVL = 1000
s.HEARTBEAT_TIMEOUT = 5000
s.connect('tcp://127.0.0.1:5555')
i = 0
while True:
s.send(str(i).encode())
print(s.recv())
i += 1
time.sleep(1)
Q : What is the expected behaviour after setting these socket options ?
A :
嗯,
上述设置有双重效果。一,这实际上适用于您的设置目标(即发送和发送(最有可能 ZMTP/3.1)ZMTP_PING
面向连接的服务子层“ZMTP/3.1-服务包”和相互地,不确定,但大多数情况下,充分形成“ZMTP/{3.1|2.x|1.0}-服务包”(希望交付)回来。这些“服务包”在有线线路上可见(如果存在 - inproc://
-transport-class 和 vmci://
-transport-class 也没有典型用户可以挂机和嗅探流量的实际线路,但是某种用于 RAM 映射的指针杂技),因此协议分析器将“看到”它们的 ID 解码,如下所示:
a local-initiator
MAY send:
+------+----+
| %xNN | 24 |
+------+----+
0 1
flags size
+------+---+---+---+---+
| %xNN | P | I | N | G |
+------+---+---+---+---+
2 3 4 5 6
ZMTP/3.1-Command name "PING"
+---+---+
| |
+---+---+
7 8 ping-ttl 2B
MAY be zero
MAY be ttl stored as [0:15], being a 16-bit TTL in 1/100 [s] ~ max 6553 [s]
ttl provides a strong hint
to the other peer to disconnect
if no further traffic is received after that time.
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 0 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
ping-context (max 16B)
MAY be zero
MAY be context-specific context-payload, not more than 16B
a remote-peer
SHALL respond:
+------+----+
| %xNN | 22 |
+------+----+
0 1
flags size
+------+---+---+---+---+
| %xNN | P | O | N | G |
+------+---+---+---+---+
2 3 4 5 6
ZMTP/3.1-Command name "PONG"
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 0 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
ping-context (echoed as obtained from PING)
ZMTP/3.1 v/s ZMTP/3.0 v/s ZMTP/2.x v/s ZMTP/1.0 差异和细节在版本协商阶段得到解决,一旦连接设置服务的子层执行所有低级所需的握手(重新)协商,试图就版本、授权和安全相关原则达成一致
第二个效果(在 Context()
引擎实例的引擎盖下执行协商)是您永远不会看到与 ZeroMQ-(abstract)-Message-Transport-Protocol 的任何直接交互( ZMTP ) 定义了服务设置和维护流程。
我们只是享受(以上 ZMTP 生成的)公开的 API-调用来设置、配置和利用“我们的”用户级操作的信令/消息传递基础设施元平面,这是基于所有已知的- 如何“隐藏”在引擎盖下(并且应该保持如此 - 当然,除非有人决定卷起袖子并帮助开发 ZeroMQ 系统以实现其下一代)
Q : ( is there an exception or something that's supposed to be thrown or something ? )
一个:
这就是为什么必须首先告知上述所有内容的原因,作为正当的推理,对于您的第二个问题应该有一个公平和诚实的答案。