我正试图在 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_thr
,perf
脚本),但它们是用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?
似乎消息一次一个地传递给订阅者(而不是并行传递),因此花费了三倍的时间。
谢谢。