ZeroMQ
# ZeroMQ

ZeroMQ (también escrito ØMQ, 0MQ o ZMQ) es una biblioteca de comunicaciones de alto rendimiento orientada a mensajes, destinada a la construcción de aplicaciones distribuidas. Está basada en colas de mensajes, pero a diferencia de otros middlewares orientados a mensajes, ZeroMQ no necesita un broker intermedio.

La API de la biblioteca está diseñada para ser muy similar a utilizar un socket BSD clásico. Ha sido desarrollada en C++, aunque existen ports y bindings a muchos otros lenguajes (C, C#, Erlang, Go, Haskell, Java, JavaScript, Ruby, Rust...).

ZeroMQ es gratuita y de código abierto.

## Tecnología

ZeroMQ es un middleware de comunicaciones orientado a mensajes (en inglés, Message-oriented middleware). Este tipo de sistemas utiliza una arquitectura basada en un servidor de mensajes, también llamado broker, que funciona como una aplicación intermedia situada entre los emisores y los receptores de los mensajes.

Los diseñadores de ZeroMQ se propusieron construir un sistema que conseguiera un mayor rendimiento y una latencia más baja, precisamente eliminando ese broker intermedio y pasando así de una arquitectura de clientes simples (que sólo saben comunicarse con el servidor) y servidores inteligentes (con la lógica de almacenamiento y envío de los mensajes), a otra en la que todos son pares inteligentes que gestionan tanto la gestión de los mensajes como su enrutamiento.

El resultado es que ZeroMQ está formado por un único elemento, una biblioteca, que se compila y enlaza con cada programa cliente o servidor, formando así un sistema rápido y eficiente de comunicación asíncrona por mensajes.

## Patrones de mensajería

La arquitectura de un sistema distribuido puede describirse utilizando patrones de mensajería. Estos patrones se encargan de especificar y detallar la topología del conjunto del sistema y el flujo de mensajes entre sus distintas partes. ZeroMQ implementa varios de estos patrones. Para ello proporciona pares de sockets preoptimizados para cada tipo de comunicación que se desee realizar. En concreto, los patrones soportados son:

* Pair: el más parecido a un socket clásico, comunicación bidireccional entre un servidor y un cliente único.
* Request-Replay: conecta un conjunto de clientes con un conjunto de servidores. Se utiliza para implementar distribución de tareas y llamadas a procedimientos remotos (RPC).
* Publish-Subscribe: conecta un conjunto de publicadores con un conjunto de subscriptores. Se utiliza para la distribución de datos mediante mensajes categorizados (Publish-subscribe pattern).
* Pipeline: conecta nodos organizados en pipelines de varias etapas o pasos secuenciales. Se utiliza para organizar flujos de procesamiento de mensajes en paralelo y por etapas.
