ZeroMQ:有人可以解释一下HWM的工作原理吗?

时间:2017-05-23 22:19:14

标签: zeromq pyzmq

我正在尝试使用ZeroMQ,我有一个 PUSH 应用程序,可以发送大约370,000条消息,每条消息大小为10Kb。

context = zmq.Context()
socket  = context.socket( zmq.PUSH )
socket.bind( "tcp://127.0.0.1:5557" )

no_msgs =      0
i       = 370000

fd  = open( "input_text_files/file1.txt", 'r' )
msg = fd.read()

while i >  0:
    print "Sending data of size" , len( msg )
    rc       = socket.send( msg )
    no_msgs += 1
    if rc == None:
        print True
    if rc == -1:
        print "ERROR!!"

    i = i-1

PULL 应用程序刚刚收到循环中的消息:

context = zmq.Context()
socket  = context.socket( zmq.PULL )
socket.connect( "tcp://127.0.0.1:5557" )

no_msgs = 1
i       = 1

while True:
    msg      = socket.recv()
    no_msgs += 1
    print "Received msg", i
    print "Received %s" %( len( msg ) )
    i = i + 1

使用此设置时,会丢失消息,即PULL套接字未收到所有370,000条消息。我在socket.hwm = 10套接字上添加了PUSH,并收到了所有370,000封邮件。有人可以向我解释这是如何工作的吗?

1 个答案:

答案 0 :(得分:1)

嗯,HighWaterMarks是一套精致的设置:

ZeroMQ .Context() 实例

的“幕后工作”

可能是,开始阅读有关ZeroMQ内部的内容,接下来尝试区分非阻塞v / s阻塞操作模式。

  

ZMQ_RCVBUF: Set kernel receive buffer size | default -1 == O/S def'd
  ZMQ_RCVHWM: Set high water mark for inbound messages | default 1000
  ZMQ_SNDBUF: Set kernel transmit buffer size | default -1 == O/S def'd
  ZMQ_SNDHWM: Set high water mark for outbound messages| default 1000

     

ZMQ_SNDHWM选项应为指定套接字上的出站消息设置高水位标记。高水位标记是对于指定套接字正在与之通信的任何单个对等方,内存在内存中排队的未完成消息的最大数量的硬限制。值为零意味着没有限制。

     

如果达到此限制,套接字应进入异常状态,并且根据套接字类型,ØMQ应采取适当的措施,例如阻止丢弃已发送的消息。有关为每种套接字类型采取的确切操作的详细信息,请参阅zmq_socket(3)中的各个套接字说明。

     

ØMQ不保证套接字将接受ZMQ_SNDHWM个消息,并且实际限制可能会低60-70%,具体取决于消息流套接字。

ZMQ_PUSH:

  

管道节点使用类型为ZMQ_PUSH的套接字将消息发送到下游管道节点。消息被循环到所有连接的下游节点。此套接字类型未实现zmq_recv()函数。

     

ZMQ_PUSH套接字因所有下游节点达到高水位而进入静音状态时,或者如果没有下游节点 at所有,然后套接字上的任何zmq_send(3) 操作都应阻止,直到静音状态结束或至少有一个下游节点可用于发送;消息不会被丢弃。

ZMQ_RECVHWM: ... PULL侧设置

  

ZMQ_RCVHWM 选项应为指定套接字上的入站消息设置高水位标记。 高水位标记是对于指定套接字正在与之通信的任何单个对等方,ØMQ应在内存中排队的未完成消息的最大数量的硬限制。值为零意味着没有限制   如果达到此限制,套接字应进入异常状态,并且根据套接字类型,ØMQ应采取适当的措施,例如阻止或丢弃发送的消息。有关为每种套接字类型采取的确切操作的详细信息,请参阅zmq_socket(3)中的各个套接字说明。