[zeromq-dev] Pattern help

Lindley French lindleyf at gmail.com
Wed Dec 18 00:34:53 CET 2013

I'm trying to figure out the appropriate pattern to use here, and I'd like
some assistance getting started down the right path.

I have two types of messages: shared data, and one-shot data. The idea is
to make the one-shot messages as small as possible by sending data that is
common to many of them only once as shared data, and then referring to it
by a simple integer in the one-shot message. This is background; my
question focuses on the shared data.

I would like to send a block of shared data from host 1 to host 2, along
with the integer used to represent it. Host 2 sends back an "I have X"
message indicating it received the shared data. Host 1 is comforted.

However, it's possible a shared data message could be lost for a variety of
reasons even when tcp is the underlying transport. If this occurs,
potentially many one-shot messages will become useless, so I can't tolerate
it. My thinking is that if a one-shot message arrives at host 2 with an
unknown shared data id, host 2 should send a message to host 1 saying "I
don't have X", and host 1 will then resend it. Host 1 can assume that an "I
don't have X" message won't arrive (or can be ignored) once an "I have X"
message arrives.

Now, the problem is that sending shared data X must occur in two separate
places: up front, at the caller's request, and also upon receipt of an "I
don't have X" message. This is a complication because the natural
inclination is for these two things to occur in separate threads, but we
can't share zmq sockets across threads without a mutex. I don't mind
mutexes, but I'm trying to see if there is a better approach. It occurred
to me that perhaps the caller's initial request on host 1 should be passed
to an inproc socket which spits it out identically to an "I don't have X"
message from host 2 so it can be handled the same way.

This implies to me that host 1 should use a ROUTER socket, since that is
the only way to have two incoming connections (tcp and inproc) but ensure
all outgoing messages are directed over tcp. However, host 2 also needs a
ROUTER socket because it needs to know where to send "I don't have X"
requests, and host 1 can't be hard-coded. The client requests on host 1 can
go into an inproc DEALER socket I suppose.

Am I thinking about this correctly?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20131217/75fb8e61/attachment.htm>

More information about the zeromq-dev mailing list