DZone
Java Zone
Thanks for visiting DZone today,
Edit Profile
  • Manage Email Subscriptions
  • How to Post to DZone
  • Article Submission Guidelines
Sign Out View Profile
  • Post an Article
  • Manage My Drafts
Over 2 million developers have joined DZone.
Log In / Join
  • Refcardz
  • Trend Reports
  • Webinars
  • Zones
  • |
    • Agile
    • AI
    • Big Data
    • Cloud
    • Database
    • DevOps
    • Integration
    • IoT
    • Java
    • Microservices
    • Open Source
    • Performance
    • Security
    • Web Dev
DZone > Java Zone > ØMQ - Fast, Broker-Free Messaging

ØMQ - Fast, Broker-Free Messaging

Mitch Pronschinske user avatar by
Mitch Pronschinske
·
Jul. 28, 10 · Java Zone · Interview
Like (0)
Save
Tweet
19.66K Views

Join the DZone community and get the full member experience.

Join For Free
ZeroMQ (or ØMQ) is an open source messaging library supported by the iMatix Corporation.  It has been described as messaging middleware, TCP on steroids, and now is just "a new layer on the networking stack."  Basically it allows you to design a complex communication system simply and programmatically by giving you a special socket interface.  Nicholas Piël recently introduced this new 'MQ' that fills a different use case than complete messaging systems such as RabbitMQ or ActiveMQ.  Here are a few basic descriptive points:

  • Sends and receives messages asynchronously (a.k.a. "message queueing").
  • Supports different messaging patterns such as point-to-point, publish-subscribe, request-reply, paralellized pipeline and more.
  • Is fast. 13.4 usec end-to-end latencies and over 8M messages a second today (InfiniBand).
  • Is thin. The core requires just a couple of pages in resident memory.
  • Supports different transport protocols: TCP, PGM, IPC, and more.
  • Runs on HP-UX, Linux, Mac OS X, NetBSD, OpenVMS, Solaris, Windows, AIX, and more.
  • Supports microarchitectures such as x86, AMD64, SPARC, IA-64, ARM, and more.
  • Is fully distributed: no central servers to crash, millions of WAN and LAN nodes.
  • ZeroMQ bindings exist for: Ada, C, C++, Common Lisp, Erlang, Go, Haskell, Java, Lua, .NET, OOC, Perl, PHP, Python, and Ruby.

ZeroMQ is between a low level Berkeley socket interface and a high level messaging system.  It takes the ease of implementation from the high level and some of the flexibility and performance from the low level.  It's also a lot faster than most AMQP messaging systems because it can use intelligent message batching and efficient transports like reliable Multicast or the Y-suite IPC transport.

Sending messages with ZeroMQ is very simple compared to raw socket implementations (where you must constantly feed the socket buffer).  When you fire an asynchronous send call, ZeroMQ will queue the message in a separate thread and handle all of the work - perfect for an event-based framework.  ZeroMQ is also versatile enough to let you encode the message however you like (JSON, BSON, Protocol Buffers, or Thrift).

This Python code shows you how you could create a broadcasting server for live football/soccer events:
import zmq
from random import choice
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://127.0.0.1:5000")

countries = ['netherlands','brazil','germany','portugal']
events = ['yellow card', 'red card', 'goal', 'corner', 'foul']

while True:
msg = choice( countries ) +" "+ choice( events )
print "->",msg
socket.send( msg )
In terms of scalability, ZeroMQ sockets may look low level, but they actually have quite a few features and can, for example, connect to multiple end points and automatically load balance messages over those points.  It can also collect messages from multiple sources through a single socket.  Because of ZeroMQ's brokerless design, it has no single point of failure.  

You should really take a look at Nicholas Piël's blog post, which describes how to implement a message layer with ZeroMQ using several common paradigms.

ZeroMQ is distributed under the LGPL and contributions are made under the MIT (X11) license.
ZeroMQ

Opinions expressed by DZone contributors are their own.

Popular on DZone

  • Pattern Matching for Switch
  • Why Performance Projects Fail
  • Implementing RBAC Configuration for Kubernetes Applications
  • How to Leverage Method Chaining To Add Smart Message Routing in Java

Comments

Java Partner Resources

X

ABOUT US

  • About DZone
  • Send feedback
  • Careers
  • Sitemap

ADVERTISE

  • Advertise with DZone

CONTRIBUTE ON DZONE

  • Article Submission Guidelines
  • MVB Program
  • Become a Contributor
  • Visit the Writers' Zone

LEGAL

  • Terms of Service
  • Privacy Policy

CONTACT US

  • 600 Park Offices Drive
  • Suite 300
  • Durham, NC 27709
  • support@dzone.com
  • +1 (919) 678-0300

Let's be friends:

DZone.com is powered by 

AnswerHub logo