ZeroMQ HEARTBEAT sockopts() 设置如何工作?

How do ZeroMQ HEARTBEAT sockopts() settings work?

我正在使用 python 的 pyzmq==22.2.1,它应该支持 ZeroMQ 4.2.0(根据 API)

我正在尝试使用心跳套接字选项(ZMQ_HEARTBEAT_IVLZMQ_HEARTBEAT_TIMEOUTZMQ_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 ? )

一个:
这就是为什么必须首先告知上述所有内容的原因,作为正当的推理,对于您的第二个问题应该有一个公平和诚实的答案。