ZeroMQ:发布订阅套接字

时间:2015-07-28 17:23:48

标签: python sockets zeromq

我正试图在 PUB/SUB 套接字方案中实现ZeroMQ发布 - 订阅原型的性能,并且存在很大问题。我正在尽快发布消息,然后尽快订阅和处理它。

出版商:

import zmq
import time
MAX = 100000
context = zmq.Context()
pub_sock = context.socket(zmq.PUB)
pub_sock.bind("ipc:///home/pub")

time.sleep(1)
var1 = 1
starttime = time.time()
while var1 != MAX+1:
    pub_sock.send_string('Msg: dummy message')
    var1 += 1

totaltime = time.time() - starttime

print "total time: %s" % totaltime
print "Message/second: %s" % float(MAX/totaltime)

订户:

import zmq
import time
MAX = 100000
context = zmq.Context()
sub_sock = context.socket(zmq.SUB)
sub_sock.connect("ipc:///home/pub")
sub_sock.setsockopt(zmq.SUBSCRIBE, 'Msg')

try:
    rawData = sub_sock.recv_string()
    starttime = time.time()
    counter = 1
    while counter != MAX:
        rawData = sub_sock.recv_string()
        counter += 1

except KeyboardInterrupt:
    pass


totaltime = time.time() - starttime
print "total time: %s" % totaltime
if sum == MAX:
    print "all messages recieved"
else:
    print "data has been lost"

问题是有时发布者比订阅者快得多,队列将达到高水位标记,我将丢失消息。如果发生这种情况,订阅者循环将永远不会退出,然后我将需要使用键盘中断来结束它并找出收到的消息数。

我不想增加HWM ,因为默认值1000也是我想用于实际软件的,所以我希望在期间保持1000基准。

我已经查看了ZMQ的内置性能测试脚本({strong> local_thr 文件夹中的remote_thrperf脚本),但它们是用C(我想要python脚本性能测试),他们也使用 PUSH-PULL 套接字,而不是PUB-SUB套接字。一旦到达HWM,PUSH-PULL套接字就会阻塞,因此ZMQ性能测试脚本不会因为丢弃而导致消息丢失。这只会减慢这个过程。

我希望有类似的行为,但使用 PUB-SUB 套接字。

显然,ZeroMQ中没有规定在达到HWM时将PUB-SUB的行为更改为阻止。

这里有替代方法来实现流量控制吗?

一个相关问题: 如果我运行1个发布者和1个订阅者,则消息很少丢失。 当我运行1个发布者和3个订阅者(所有订阅者订阅同一主题)时,大约10%的消息丢失(在所有订阅者上)。我试图通过在循环中引入虚拟语句来减少发布者,并且为了在所有订阅者上实现无消息丢失,我不得不减少近1/3。 Is this normal?似乎消息一次一个地传递给订阅者(而不是并行传递),因此花费了三倍的时间。

谢谢。

0 个答案:

没有答案