Fue hace más de 2 años cuando publicamos este post sobre ZeroMQ.

Mucho después vuelvo a plantearme el uso de ZeroMQ, como ya han hecho productos como Storm, dotCloud, Mongrel2, ZeroRPC o SaltStack.

Como ya comentábamos ZeroMQ es una librería de mensajería que permite diseñar sistemas de comunicación de forma sencilla. Es importante advertir que no es un sistema de mensajería en sí como pueda ser AMQP, si no una librería para construirlas.

Sus 3 principales características están:

· Rendimiento:

o No tiene el overhead de otros protocolos como JMS, AMQP,…

o Usa transportes eficientes como Multicast o IPC

o Usa Batching

· Simplicidad: API muy simple

· Escalabilidad: a través de su diseño brokerless

Además:

· Actúa como framework de concurrencia.

· Más rápido que TCP para productos en cluster

· Capaz de intercambiar mensajes dentro de un mismo proceso, IPC, TCP y multicast.

· Soporta mensajería Publish-Suscribe y Request-Reply.

· Soporte I/O asíncrono

· Binding para más de 30 lenguajes incluidos C,C++, Java,.Net,… http://www.zeromq.org/bindings:_start

· Soporte para la mayoría de Sistemas operativos como Linux, AIX, Windows,

· Software LGPL con soporte comercial desde iMatix

Los pasos para implementar una capa de mensajería sobre ZeroMQ son:

· Elegir un transporte

· Configurar la infraestructura

· Elegir un patrón de mensajería

ELEGIR UN TRANSPORTE:

ZeroMQ provee 4 transportes:

· INPROC: modelo de comunicación dentro del mismo proceso

· IPC

· MULTICAST via PGM, puede encapsularse en UDP

· TCP

Normalmente el transporte TCP es la mejor opción ya que ofrece rendimiento y es robusto, aunque MULTICAST es interesante en muchos casos.

CONFIGURAR LA INFRAESTRUCTURA:

ZeroMQ ofrece:

· QUEUE para patron de mensajería Request/Response

· FORWARDER para mensajería Publish/Suscribe

· STREAMER para patron de mensajería Pipeline

ELEGIR UN PATRÓN DE MENSAJERÍA

ZeroMQ soporta estos patrones

· REQUEST/REPLY: bidireccional, load balanced

· PUBLISH/SUBSCRIBE

· UPSTREAM / DOWNSTREAM, distribuye datos a nodos en un pipeline

· PAIR, counicación entre peers

La mejor forma de ver estos conceptos con ZeroMQ es a través de sus ejemplos.

Desde el Hello World enviado desde un cliente hacia un Servidor:

Por ejemplo en un escenario Request-Reply (el usado en Servidores HTTP, POP,…):

En este patrón existe un estado asociado a que una Request debe tener una Respuesta. ZeroMQ simplifica mucho su uso.

· El cliente usa una petición de tipo REQ haciendo un send() sobre el Socket

En el ejemplo el cliente conecta a dos servers (en puerto 5000 y 6000).

· El servidor usa un Socket de tipo REP a través de un recv() para leer la petición y responder.

En el ejemplo servidor arranca en puerto 5000

En un escenario Publish-Suscribe:

Es un paradigma muy usado en la actualidad.

El Servidor ZeroMQ que soporta este escenario sería como este:

El servidor generará eventos para las diferentes countries y los enviará por el socket de tipo PUB.

El cliente tendría este aspecto:

En el ejemplo el cliente se ha suscrito a eventos para 2 countries. El cliente crea un socket de tipo RECV conectado al Servidor de tipo Broadcast

Existen bindings para diversos lenguajes, si hablamos de Java tenemos jzmq, los pasos para instalarlo están aquí: http://www.zeromq.org/bindings:java

Si queremos usarlo desde navegador podemos usar la librería Javascript: ZmqSocket.js, como Javascript no soporta conexiones TCP raq esta librería usa Flash como bridge.

También existe una versión para Android: http://www.zeromq.org/build:android y para Node.js: http://www.zeromq.org/bindings:node-js

Si os habéis quedado con ganas de más podéis seguir en su guía y su API.

Podéis descargar el software para las diversas plataformas:

· Para Windows: http://www.zeromq.org/distro:microsoft-windows

· Para sistemas POSIX: http://download.zeromq.org/zeromq-3.2.2.tar.gz