On 10/07/2012 11:00 AM, Chuck Remes wrote:
On Jul 10, 2012, at 10:31 AM, Edwin Amsler wrote:
On 10/07/2012 1:59 AM, Paul Colomiets wrote:
Hi Edwin,
The behavior is intentional for pub/sub sockets. If you'd have only
one subscriber you could use push/pull. Push sockets block when reach
high water mark, so are Req sockets.
The pub/sub sockets can't reliably block in general case because there
could be multiple subscribers, only one of which reaches high water
mark. Partially this comes from implementation: when you do zmq_send()
I never want them to block. That'd kind of break my program's state
machine. What I'd like, is to know when the high water mark was
reached with a send() error, and and EAGAIN errno so that I can
/choose/ whether or not I'd like to throw away the message. Right
now, the message is just silently cast away further down the stack as
far as I can tell.
I need to stress a particular detail here. The socket has a separate
HWM for *each* connected subscriber because each one has its own
outgoing queue. If you were to receive EAGAIN (or an error return
code) from zmq_send() when a subset of subscribers hit their HWM, your
published message would still be received by subscribers that have not
fallen behind. It does *not* drop the message for all subscribers,
just those that have entered the HWM exceptional state.
I don't think you can (even with a patch specific to your use case)
rely on this behavior to achieve your goal.
Well, that's depressing. I'm using "epgm://" here, and I know that
OpenPGM itself has no concept of connected clients. Are there still
individual queues for clients in this case?
zeromq starts to push message to the pipe for each connected
subscribers, if one of the pipes full, there is no way to rollback
messages already put into pipes, if it would it's not clear whether
single slow subscriber should stop the publisher. Also pgm sockets
can't have backpressure AFAIU.
Is there a way to detect if a pipe is full, and return a send() error
then? As I said, I feel that pub sockets should never block (that's
why I changed from using OpenPGM alone to ZeroMQ actually, though
I've found yet more reasons to stay).
Not at this time. However, there has been some work done by others to
let developers receive notification for specific internal library
events. I'm certain it would be possible to add this type of event as
a notification.
Also, PUB sockets never block.
You can try to implement the behavior as a socket option (it can't be
default behavior), but you have to be aware of the problems above (And
I don't know if core developers are willing to accept the patch).
That's more what I'm worried about. I'm quite confident there's no
way to handle this yet, and I feel that I'm not the only one who'd
like to have some sense of how fast a pub socket is truthfully
sending data. The implementation on the API side should be solid
since the send() error, EAGAIN method is how all ZMQ_NOBLOCK sockets
work already. It's just that send() doesn't error when a PUB socket
starts throwing away data (I know that's the case for sure on Windows
at least).
What we really need is a better mechanism for handling this type of
situation than HWM. One particular thought is described here:
http://unprotocols.org/blog:15
This can be implemented today using DEALER/ROUTER sockets.
You may also be interested in the Suicidal Snail pattern described in
the guide.
http://zguide.zeromq.org/page:all#Slow-Subscriber-Detection-Suicidal-Snail-Pattern
If you haven't read the guide yet, you should do so before getting too
much deeper into your problem space. It will save you a lot of time.
Good advice. I made it about three chapters in. I really need to go
digest it though.
cr
_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev
_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev