[zeromq-dev] how to reliably wait for SUBscribers to connect before sending messages

Mykola Ostrovskyy spambox03 at mail.ru
Fri Jan 5 11:55:55 CET 2018


This is kind of a classic issue with PUB-SUB. You will have quite some
results by googling for "zeromq reliable pub-sub".

AFAIK, the proper solution is to have an additional communication channel
with a stronger message delivery guarantee (e.g. REQ-REP). The PUB server
can broadcast some dummy messages and wait on REP socket for replies. As
soon as client connects with SUB, subscribes, and start to receive the
dummy messages, it sends over REQ socket a request for the actual data.

This approach may require quite some design changes, which is not always
welcome. If you need this only for testing purposes, you could try to go
with a socket monitor instead. There are ZMQ_EVENT_ACCEPTED and
ZMQ_EVENT_HANDSHAKE_SUCCEED events. Listening for them on PUB socket will
give you an idea when client connects. But I believe there still will be
some time window before client subscription is handled, so you may still
need some delay before starting to send messages on PUB.


2018-01-05 11:03 GMT+02:00 Francesco <francesco.montorsi at gmail.com>:

> Hi all,
> I have some unit tests around the ZMQ wrappers I wrote for PUB/SUB sockets
> (these wrappers integrate functionalities specific to my use case).
> In these unit tests I spawn a thread that creates a PUB socket and another
> one creating a SUB socket. In the PUB thread I do zmq_bind(), then sleep
> for a SETTLE_TIME and then I start sending messages with zmq_msg_send().
> In the SUB I just do zmq_connect() and then immediately zmq_msg_recv().
> The problem is when I run such unit tests under valgrind. In that case I
> noticed that randomly my settle time of 1sec is not enough: the unit tests
> fail because the SUB receives 0 messages instead of N>0.
> A simple fix would be to increase the settle time. However since I repeat
> that kind of tests hundreds of times, that means increasing testing time a
> lot.
> I think my problem is that I need to wait after the zmq_bind() and before
> zmq_msg_send() some time to allow ZMQ background threads to actually
> connect the PUB and SUB sockets together.
> Is there a better way to test if there are pending connections in ZMQ
> background threads rather than waiting a (random) amount of time?
> Thanks,
> Francesco
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org
> https://lists.zeromq.org/mailman/listinfo/zeromq-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20180105/db8bda2c/attachment.htm>

More information about the zeromq-dev mailing list