message-queue rabbitmq zeromq qpid

message queue - Comparación de rendimiento entre ZeroMQ, RabbitMQ y Apache Qpid



message-queue (8)

Necesito un bus de mensajes de alto rendimiento para mi aplicación, así que estoy evaluando el rendimiento de ZeroMQ , RabbitMQ y Apache Qpid . Para medir el rendimiento, estoy ejecutando un programa de prueba que publica, por ejemplo, 10.000 mensajes utilizando una de las implementaciones de la cola de mensajes y ejecutando otro proceso en la misma máquina para consumir estos 10.000 mensajes. Luego registre la diferencia de tiempo entre el primer mensaje publicado y el último mensaje recibido.

Los siguientes son los ajustes que utilicé para la comparación.

  1. RabbitMQ : utilicé un intercambio de tipo "fanout" y una cola con configuración predeterminada. Usé la biblioteca del cliente RabbitMQ C.
  2. ZeroMQ : Mi editor publica en tcp://localhost:port1 con socket ZMQ_PUSH , My broker escucha en tcp://localhost:port1 y reenvía el mensaje a tcp: // localhost: port2 y mi consumidor escucha en tcp://localhost:port2 usando el zócalo ZMQ_PULL . Estoy utilizando un intermediario en lugar de la comunicación entre pares en ZeroMQ para hacer que la comparación de rendimiento sea justa para la implementación de otra cola de mensajes que utiliza intermediarios.
  3. Qpid mensajes Qpid C ++: utilicé un intercambio de tipo "fanout" y una cola con configuración predeterminada. Usé la biblioteca del cliente Qpid C ++.

A continuación se muestra el resultado del rendimiento:

  1. RabbitMQ : tarda aproximadamente 1 segundo en recibir 10.000 mensajes.
  2. ZeroMQ : toma unos 15 milisegundos para recibir 10.000 mensajes.
  3. Qpid : lleva unos 4 segundos recibir 10.000 mensajes.

Preguntas:

  1. ¿Alguien ha realizado una comparación de rendimiento similar entre las colas de mensajes? Entonces me gusta comparar mis resultados con los tuyos.
  2. ¿Hay alguna manera de que pueda sintonizar RabbitMQ o Qpid para mejorar el rendimiento?

Nota:

Las pruebas se realizaron en una máquina virtual con dos procesadores asignados. El resultado puede variar para hardware diferente, sin embargo, estoy interesado principalmente en el rendimiento relativo de los productos de MQ.


Estoy utilizando un intermediario en lugar de la comunicación entre pares en ZeroMQ para hacer que la comparación de rendimiento sea justa para la implementación de otra cola de mensajes que utiliza intermediarios.

No estoy seguro de por qué quieres hacer eso, si lo único que te importa es el rendimiento, no hay necesidad de nivelar el campo de juego. Si no te preocupa la persistencia, el filtrado, etc., ¿por qué pagar el precio?

También soy muy cauteloso al ejecutar benchmarks en VM''s. Hay muchas capas adicionales que pueden afectar los resultados de maneras que no son obvias. (A menos que planee ejecutar el sistema real en VM, por supuesto, en cuyo caso ese es un método muy válido).


Desarrollamos un bus de mensajes de código abierto construido sobre ZeroMQ; inicialmente lo hicimos para reemplazar a Qpid. No requiere intermediarios, por lo que es una comparación totalmente justa, pero ofrece la misma funcionalidad que las soluciones intermedias.

Nuestra cifra de rendimiento principal es de 140.000 mensajes por segundo entre dos máquinas, pero puede ver más detalles aquí: https://github.com/Abc-Arbitrage/Zebus/wiki/Performance


He probado c ++ / qpid

Envié 50000 mensajes por segundo entre dos máquinas diferentes durante mucho tiempo sin cola.

No usé un fanout, solo un simple intercambio (mensajes no persistentes)

¿Estás usando mensajes persistentes? ¿Estás analizando los mensajes?

Supongo que no, ya que 0MQ no tiene estructuras de mensajes.

Si el corredor está principalmente inactivo, probablemente no haya configurado la captación previa en el remitente y el receptor. Esto es muy importante para enviar muchos mensajes.


Hemos comparado RabbitMQ con nuestra cola de mensajes persistentes SocketPro ( http://www.udaparts.com/ ) en el sitio http://www.udaparts.com/document/articles/fastsocketpro.htm con todos los códigos fuente. Estos son los resultados que obtuvimos para RabbitMQ:

Misma máquina enqueue y dequeue:

"Hola Mundo" --
Enqueue: 30000 mensajes por segundo;
Dequeue: 7000 mensajes por segundo.

Texto con 1024 bytes -
Enqueue: 11000 mensajes por segundo;
Dequeue: 7000 mensajes por segundo.

Texto con 10 * 1024 bytes -
Enqueue: 4000 mensajes por segundo;
Dequeue: 4000 mensajes por segundo.

Enqueue y dequeue entre máquinas con ancho de banda de red de 100 mbps:

"Hola Mundo" --
Enqueue: 28000 mensajes por segundo;
Dequeue: 1900 mensajes por segundo.

Texto con 1024 bytes -
Enqueue: 8000 mensajes por segundo;
Dequeue: 1000 mensajes por segundo.

Texto con 10 * 1024 bytes -
Enqueue: 800 mensajes por segundo;
Dequeue: 700 mensajes por segundo.


Hmm, por supuesto, ZeroMQ será más rápido, está diseñado para ser y no tiene una gran cantidad de funcionalidad basada en intermediarios que las otras dos proporcionan. El sitio de ZeroMQ tiene una maravillosa comparación de mensajería de intermediario contra intermediario y desventajas y ventajas de ambos.

Blog RabbitMQ :

RabbitMQ y 0MQ se centran en diferentes aspectos de la mensajería. 0MQ pone mucho más énfasis en cómo los mensajes se transfieren a través del cable. RabbitMQ, por otro lado, se centra en cómo se almacenan, filtran y monitorean los mensajes.

(También me gusta la publicación anterior de RabbitMQ, ya que también habla sobre el uso de ZeroMQ con RabbitMQ)

Entonces, lo que estoy tratando de decir es que debes elegir la tecnología que mejor se adapte a tus necesidades. Si el único requisito es la velocidad, ZeroMQ. Pero si necesita otros aspectos como la persistencia de los mensajes, el filtrado, la supervisión, la conmutación por error, etc., entonces es cuando debe comenzar a considerar RabbitMQ y Qpid.


Intenta configurar la captación previa en el emisor y el receptor con un valor como 100. Prefetching simplemente el remitente no es suficiente


RabbitMQ probablemente esté persistiendo en esos mensajes. Creo que debes establecer la prioridad del mensaje u otra opción en los mensajes para que no sea persistente. El rendimiento mejorará 10 veces más. Debería esperar al menos 100 mil mensajes por segundo a través de un agente de AMQP. En OpenAMQ obtuvimos un rendimiento de hasta 300 mil mensajes por segundo.

AMQP fue diseñado para la velocidad (por ejemplo, no desempaqueta mensajes para enrutarlos) pero ZeroMQ está simplemente mejor diseñado de manera clave. Por ejemplo, elimina un salto conectando nodos sin un intermediario; mejora las E / S asíncronas que cualquiera de las pilas de clientes de AMQP; hace un lote de mensajes más agresivo. Tal vez el 60% del tiempo dedicado a la construcción de ZeroMQ entró en la optimización del rendimiento. Fue un trabajo muy duro. No es más rápido por accidente.

Una cosa que me gustaría hacer, pero estoy demasiado ocupado, es recrear un agente similar a AMQP sobre ZeroMQ. Hay una primera capa aquí: http://rfc.zeromq.org/spec:15 . Toda la pila funcionaría algo así como RestMS, con el transporte y la semántica separados en dos capas. Proporcionaría la misma funcionalidad que AMQP / 0.9.1 (y sería semánticamente interoperable) pero significativamente más rápido.


creo que si usas apio, el rendimiento de Rabbitmq mejorará