Why ZeroMQ

Brandon Rozek

June 16, 2019

I’ve been playing around with ZeroMQ recently and it’s been really exciting. This blog post is going to outline why I think you should be using ZeroMQ today.

First of all, before you compare this to other products like RabbitMQ, DDS, etc. Realize that this is a static library that you link to in your application as opposed to a broker you run. This means that you can get the benefits with this library for very little overhead.

Easier Sockets

Instead of talking about how easy ZeroMQ is to use, I’m going to just show you the code to implement a server-client relationship in Python.

Server.py

import zmq
import time

port = "5556"
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:%s" % port)

while True:
    msg = socket.recv()
    print(msg)
    time.sleep(1)
    socket.send_string("Server Message To Client")

Client.py

import zmq
import time

port = "5556"
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:%s" % port)

while True:
    socket.send_string("client message to server")
    time.sleep(1)
    msg = socket.recv()
    print(msg)

And just like that we have a way to transport messages back and forth. No need to make a special header before each message to know the appropriate size of the packets. ZeroMQ abstracts those details from you.

Different Transports Available

You’re not limited to only TCP. You can use inproc for thread-to-thread messaging, ipc for inter-process communication, and epgm or pgm for multicast messaging. Most of the time, just changing the connection string in socket.connect just works!

Common Networking Patterns Built In

Sometimes we just want a dumb pipe between two ends (pipe) but most of the times we’re writing applications that follow the server-client or publisher-subscriber architecture. That gets defined in context.socket.

Ex: context.socket(zmq.PAIR)