[zeromq-dev] Subscriptions and HWMs

Martin Sustrik sustrik at 250bpm.com
Tue Feb 7 23:04:43 CET 2012


Hi Staffan,

> I'm taking a look at fixing https://zeromq.jira.com/browse/LIBZMQ-299,
> and I'm not quite sure how to tackle it.
>
> There are two problems concerning HWMs and (X)SUB as I see it:
>
> 1. Subscriptions are silently dropped if the SNDHWM is reached. I don't
> know if that's the intended behaviour. If it is, it should probably be
> more clearly documented that subscriptions might be dropped.

It definitely doesn't look like good behaviour. We should decide what 
the right behaviour is though :)

> I know there was talk about making setsockopt(ZMQ_SUBSCRIBE, ...)
> blocking [1], which would solve the "problem" of new subscriptions being
> silently dropped.

Agreed. However, imagine the case where there are multiple publishers 
connected to a single subscriber. In such case we may run into the 
problem of stuck publisher. Ie. if one of the publishers doesn't process 
subscriptions the buffers will ultimately get full and the subscriber 
won't be able to send more subscriptions/unsubscriptions even to other 
well-behaving publishers!

A solution in a short run may be to disconnect the publisher when it 
refuses to process subscriptions (consider it either hung or malevolent).

Solution in the long run is probably separation of "message 
distribution" pattern (one source publishes to multiple destinations) 
and "message aggregation" pattern (many sources publishing to a single 
destination).

> 2. If you have a SNDHWM set on a (X)SUB socket you're quite likely to
> get an assertion at xsub.cpp:218 whenever a pipe is attached or
> hiccuped.

Ack. The cheap and dirty fix to this problem would be to automatically 
set SNDHWM on xsub/sub sockets to infinity (in xsub_t constructor).

> If loosing subscriptions upon reaching the SNDHWM is the expected
> behaviour then 2 is easily fixable by just removing the assertion. If
> not... then I'm not sure how to tackle it.
>
> Bypassing the HWM for subscription messages is one option, but has its
> own caveats.

Right. It can cause process to run out of memory. Still better than the 
assertion probably.

> Keeping track of which subscriptions has been sent is another
> possibility.

What's the idea here?

Martin



More information about the zeromq-dev mailing list