ÃMQ Is Not a Neutral Carrier
A common question that newcomers to ÃMQ ask (itâs one Iâve asked myself) is, âHow do I write an XYZ server in ÃMQ?â For example, âHow do I write an HTTP server in ÃMQ?â The implication is that if we use normal sockets to carry HTTP requests and responses, we should be able to use ÃMQ sockets to do the same, only much faster and better.
The answer used to be, âThis is not how it works.â ÃMQ is not a neutral carrier; it imposes a framing on the transport protocols it uses. This framing is not compatible with existing protocols, which tend to use their own framing. For example, compare an HTTP request (Figure 2-2) and a ÃMQ request (Figure 2-3), both over TCP/IP. The HTTP request uses CRLF (carriage return line feed) as its simplest framing delimiter, whereas ÃMQ uses a length-specified frame.
Figure 2-2. HTTP on the wire
Figure 2-3. ÃMQ on the wire
So, you could write an HTTP-like protocol using ÃMQ, using for example the request-reply socket pattern. But it would not be HTTP.
Since ÃMQ v3.3, however, ÃMQ has a socket option called
ZMQ_ROUTER_RAW
that lets you read and write data without the ÃMQ framing. You could use this to read and write proper HTTP requests and responses. Hardeep Singh contributed this change so that he could ...
Get ZeroMQ now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.