【发布时间】:2019-12-24 21:41:27
【问题描述】:
我正在使用简单的一对一 PUSH/PULL worker/server python 代码来发送和接收消息。
worker 使用PUSH 套接字向PULL 服务器发送消息。服务器处理单元不如worker强大,因此当发送太多消息时,服务器的RAM开始增长,直到系统杀死所有东西。
我尝试如下设置接收器高水位线:
worker_sock_in = ZMQ_CTXT.socket(zmq.PULL)
worker_sock_in.setsockopt(zmq.LINGER, 1000))
worker_sock_in.setsockopt(zmq.RCVTIMEO, 1000)) # detects if the link is broken
worker_sock_in.setsockopt(zmq.RCVHWM, 1000)
worker_sock_in_port = worker_sock_in.bind_to_random_port(listen_addr, port_start, port_end)
以下代码用于worker创建和发送消息:
sock_dest = ZMQ_CTXT.socket(zmq.PUSH)
sock_dest.setsockopt(zmq.LINGER, 1000))
sock_dest.setsockopt(zmq.SNDTIMEO, 1000)) # detects if the link is broken
sock_dest.setsockopt(zmq.SNDHWM, 0) # never block on sending msg
sock_dest.connect(sock_dest_address)
# sends a msg
self.sock_dest.send(msg, zmq.NOBLOCK)
它似乎解决了这个问题,但我的猜测是溢出消息只是被服务器丢弃了,这在我的情况下是不可接受的。
我的开发基于此thread,但我不确定是否理解答案的附加信息部分。
所以问题是,在 noblock 推/拉 zeromq 套接字上达到的 HWM 的真实行为是什么?有没有办法让推拉基础设施保证所有发送的消息都将由拉套接字接收而不会膨胀其内存或阻止发件人?
【问题讨论】:
标签: python zeromq distributed-system pyzmq low-latency