Я тестирую производительность zmq, посылая 100000 сообщений.Клиент подсчитывает полученные сообщения и измеряет использованное время.На моей локальной машине клиент получал каждое сообщение, но на VPS (я пробовал несколько разных моделей) некоторые сообщения были отброшены.Не уверен, что что-то не так с VPS или что-то не так с zmq.
Отправитель:
import zmq
import random
import cbor
import time
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://127.0.0.1:27700")
time.sleep(2)
socket.send_multipart([b'test.latency', b'start'])
for i in range(100000):
s = str(random.random())
socket.send_multipart([b'test.latency', s.encode()])
socket.send_multipart([b'test.latency', b'end'])
Получатель:
import datetime
import zmq
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://127.0.0.1:27700")
socket.setsockopt(zmq.SUBSCRIBE, 'test.latency'.encode())
s = None
count = 0
while True:
try:
topic, msg = socket.recv_multipart()
count += 1
if msg == b'start': s = datetime.datetime.now()
if msg == b'end': break
except Exception: pass
print(count) # should be 100002
print((datetime.datetime.now() - s).total_seconds())
Правильный счет, напечатанный получателем, должен быть 100002(включая начало и конец).
===== update ======
Эту проблему можно решить, установив для HWM значение 0.
Добавьте socket.setsockopt(zmq.SNDHWM, 0)
и socket.setsockopt(zmq.RCVHWM, 0)
в отправителя и получателя соответственно.
Но странно, по документу HWM по умолчанию равен 0. ZMQ_HWM