ØMQ/3.0 Roadmap
Note: this page has no current value, it exists for historical reasons only. 3.0 was largely experimental and was abandoned because it was too incompatible with 2.1.
For reference, here's the list of changes introduced by ØMQ/3.0:
- Obsolete constants ZMQ_UPSTREAM and ZMQ_DOWNSTREAM removed. Use ZMQ_PUSH and ZMQ_PULL instead.
- Timeout in zmq_poll is in milliseconds instead of microseconds. This makes zmq_poll() compliant with POSIX poll()
- ZMQ_MCAST_LOOP removed. There's no support for multicast over loopback any more. Use IPC or TCP isntead.
- Pre-built devices and zmq_device() removed. Should be made available as a separate project(s).
- ZMQ_SWAP removed. Writing data to disk should be done on top of 0MQ, on inside it.
- C++ binding removed from the core. Now it's a separate project, same way as any other binding.
- zmq_send/zmq_recv was renamed zmq_sendmsg/zmq_recvmsg.
- POSIX-compliant zmq_send and zmq_recv introduced (uses raw buffer instead of message object).
- ZMQ_RECOVERY_IVL and ZMQ_RECOVERY_IVL_MSEC reconciled. The new option is named ZMQ_RECOVERY_IVL and the unit is milliseconds.
- Option types changed. Most of the numeric types are represented as 'int'.
- ZMQ_HWM split into ZMQ_SNDHWM and ZMQ_RCVHWM. This allows to control message flow separately for each direction.
- ZMQ_NOBLOCK renamed ZMQ_DONTWAIT. That makes it POSIX-compliant.
- ZMQ_MULTICAST_HOPS socket option added. Sets the appropriate field in IP headers of PGM packets.
- Subscription forwarding. Instead of filtering on consumer, subscription is moved as far as possible towards publisher and filtering is done there.
- ZMQ_XPUB, ZMQ_XSUB introduced. Allow to create subscription-forwarding-friendly intermediate devices.
- Add sockopt ZMQ_RCVTIMEO/ZMQ_SNDTIMEO. Allow to set timeout for blocking send/recv calls.
- LABEL flag added to the wire format. The flag distinguishes message parts used by 0MQ (labels) from user payload message parts.
- New wire format for REQ/REP pattern. First, bottom-of-the-stack message part is not needed any more — LABEL flag is used instead. Second, peer IDs are 32-bit integers rather than UUIDs.
- REQ socket drops duplicate replies.
- Outstanding requests & replies associated with a client are dropped when the clients dies. Performance optimisation.
- Introduce ZMQ_ROUTER and ZMQ_DEALER sockets. These mimic the functionality of ZMQ_ROUTER and ZMQ_DEALER in 0MQ/2.1.x. Guarantees backward compatibility for exsiting code.
- Removed dependency on OS socketpair buffer size. No more asserts in mailbox.cpp because of low system limit of sockepair buffer size.
- Make pkg-config dependency conditional.
Comments: 2
page revision: 46, last edited: 27 Apr 2012 07:07

What's the rationale for moving the devices into a separate project? That just seems like a PITA to me?
And would it be possible to optimize the case where multiple subscribers within a single context subscribe to the same publisher, to the point where multiplexing to the subscriber is done at the context, instead of pulling in all messages over the wire once for each subscriber?
It's mostly about being able to improve the device layers independently from the libzmq core. It's been hard to improve these device layers as part of libzmq core, mainly because the core API is considered sacred in ways that other stuff isn't. I.e. one does not touch a core API except between major versions. So, one does not touch devices if they are part of the core, except between major versions.
Edit: note, in 3.1 I added zmq_device back into the core library.
Portfolio