[zeromq-dev] Behavior of Labels, Identities, and Socket Types in 3.0
Gregory Szorc
gregory.szorc at gmail.com
Tue Oct 25 01:08:51 CEST 2011
I went to upgrade an application from 2.1.9 to 3.0.3 and was thoroughly
confused regarding the messaging patterns of XREQ, XREP, ROUTER, and
DEALER sockets.
First, XREQ used to be an alias to DEALER and XREP was an alias for
ROUTER. Now, in 3.0 they have different semantics. Wuh!? This is
extremely confusing. I understand wanting to rename XREQ and XREP to the
more user friendly DEALER and ROUTER names in 2.1. But then to revive
the old-style names in 3.0 while introducing different behavior? Is it
too late to request that XREQ and XREP (or ROUTER and DEALER) disappear
from 3.0 and be named to something new which accurately differentiates
them from anything before?
Now, the most confusing aspect of 3.0 has been the behavior of
identities and labels in multi-part messages. I always thought the
identity-messages-followed-by-empty-message-followed-by-payload-messages
was a little awkward. So, I welcome 3.0's idea of adding a label bit to
the wire format and denoting these "routing" messages specially (i.e.
determinable from API call) rather than by convention. However, I think
the current execution/implementation is extremely confusing.
Either the zmq_socket man page sections for DEALER [1] and ROUTER [2] or
the implementation in 3.0 is completely wrong. The docs and a mailing
list post [3] indicate that the behavior of ROUTER and DEALER are
unchanged from 2.1 to 3.0. So, I thought as long as I made the stated
upgrades from 2.1 to 3.0 [4], I wouldn't need to change anything else.
In reality, I'm seeing a mix of old and new behavior in my sockets!
My topology is as follows:
[client] [broker] [worker]
REQ -> ROUTER <-> DEALER <-> ROUTER
When shuffling messages from the router to dealer in the broker, I
noticed that each message sent by the client translated into:
16 byte regular message - 4 byte label message - initial client payload
By the time the message gets to the worker (I had to rewrite my "proxy"
function to preserve the label flag), things look like:
16 byte - 16 byte - 4 byte + label - payload message
The only difference from 2.1 is the 3rd message is a 4 byte label
message rather than an empty message.
I thought the behavior of ROUTER and DEALER were unchanged from 2.1? Is
the fact I'm using a REQ changing things? If REQ and REP are built on
XREQ and XREP (as the docs say), that must mean they are using labels,
and not the empty message convention. Is DEALER supposed to convert this
label message to the empty message convention? Should this happen inside
libzmq, or must an application be responsible for this conversion logic?
If an application is responsible, could you please post the rules for
converting message patterns between the various socket types in 3.0?
Speaking of labels, how important is the 4 byte label message I'm
seeing. If I want to perform custom routing inside my application (so
messages can take an independent socket path back to the originating
peer), what parts of the label do I need to preserve? Is the 4 byte
label message a delimiter/throwaway message like the 0 byte message in
2.1? Is it always 4 bytes?
What are the rules on mixing ROUTER/DEALER and XREQ/XREP? zmq_socket's
man page says they aren't compatible with each other. Yet, REQ and REP
are compatible with ROUTER and DEALER. If REQ and REP are built upon
XREQ and XREP, that implies XREQ and XREP are compatible with ROUTER and
DEALER: you just need to send some leading message parts (like in 2.1).
What's the true story?
There's a lot of questions in the previous paragraphs. I guess what I'm
trying to say is I have no clue how things work in 3.0. Can the 3.0
behavior please be clarified?
[1] https://github.com/zeromq/zeromq3-0/blob/master/doc/zmq_socket.txt#L132
[2] https://github.com/zeromq/zeromq3-0/blob/master/doc/zmq_socket.txt#L162
[3] http://lists.zeromq.org/pipermail/zeromq-dev/2011-September/013313.html
[4] http://www.zeromq.org/docs:3-0-upgrade
Gregory Szorc
gregory.szorc at gmail.com
More information about the zeromq-dev
mailing list