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, digamos, 10,000 mensajes usando 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 registro la diferencia de tiempo entre el primer mensaje publicado y el último mensaje recibido.
A continuación se muestran las configuraciones que utilicé para la comparación.
RabbitMQ
: Usé un intercambio de tipo "fanout" y una cola con la configuración predeterminada. Usé la biblioteca cliente de RabbitMQ C.ZeroMQ
: Mi editor publica entcp://localhost:port1
conZMQ_PUSH
socket, Mi corredor escuchatcp://localhost:port1
y reenvía el mensaje a tcp: // localhost: port2 y mi consumidor escucha eltcp://localhost:port2
uso deZMQ_PULL
socket. Estoy usando un intermediario en lugar de la comunicación entre paresZeroMQ
para que la comparación de rendimiento sea justa con otra implementación de cola de mensajes que utiliza intermediarios.Qpid
Agente de mensajes C ++: utilicé un intercambio de tipo "fanout" y una cola con la configuración predeterminada. Usé la biblioteca cliente Qpid C ++.
A continuación se muestra el resultado de rendimiento:
RabbitMQ
: tarda aproximadamente 1 segundo en recibir 10.000 mensajes.ZeroMQ
: Tarda unos 15 milisegundos en recibir 10.000 mensajes.Qpid
: Tarda unos 4 segundos en recibir 10.000 mensajes.
Preguntas:
- ¿Alguien ha realizado una comparación de rendimiento similar entre las colas de mensajes? Entonces me gusta comparar mis resultados con los tuyos.
- ¿Hay alguna forma en que pueda ajustar
RabbitMQ
oQpid
mejorar su rendimiento?
Nota:
Las pruebas se realizaron en una máquina virtual con dos procesadores asignados. El resultado puede variar según el hardware; sin embargo, lo que más me interesa es el rendimiento relativo de los productos MQ.
fuente
Respuestas:
RabbitMQ probablemente esté persistiendo en esos mensajes. Creo que necesitas establecer la prioridad del mensaje u otra opción en los mensajes para no tener persistencia. Entonces, el rendimiento mejorará 10 veces. Debería esperar al menos 100.000 mensajes / segundo a través de un agente de AMQP. En OpenAMQ obtuvimos un rendimiento de hasta 300K mensajes / segundo.
AMQP fue diseñado para la velocidad (por ejemplo, no descomprime los mensajes para enrutarlos) pero ZeroMQ simplemente está mejor diseñado en formas clave. Por ejemplo, elimina un salto conectando nodos sin un intermediario; realiza mejor E / S asincrónica que cualquiera de las pilas de clientes AMQP; realiza un procesamiento por lotes de mensajes más agresivo. Quizás el 60% del tiempo dedicado a la construcción de ZeroMQ se dedicó al ajuste 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 corredor similar a AMQP sobre ZeroMQ. Aquí hay una primera capa: http://rfc.zeromq.org/spec:15 . Toda la pila funcionaría como RestMS, con transporte y semántica separados en dos capas. Proporcionaría prácticamente la misma funcionalidad que AMQP / 0.9.1 (y sería semánticamente interoperable) pero significativamente más rápido.
fuente
Hmm, por supuesto que ZeroMQ será más rápido, está diseñado para serlo y no tiene muchas de las funciones basadas en broker que ofrecen los otros dos. El sitio de ZeroMQ tiene una comparación maravillosa entre la mensajería de intermediario y la mensajería sin intermediario y los inconvenientes y ventajas de ambos.
Blog de RabbitMQ :
(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 debe decidir la tecnología que mejor se adapte a sus requisitos. Si el único requisito es la velocidad, ZeroMQ. Pero si necesita otros aspectos como la persistencia de mensajes, filtrado, monitoreo, failover, etc., entonces es cuando debe comenzar a considerar RabbitMQ & Qpid.
fuente
No estoy seguro de por qué quiere hacer eso: si lo único que le importa es el rendimiento, no hay necesidad de nivelar el campo de juego. Si no le importa la persistencia, el filtrado, etc., ¿por qué pagar el precio?
También desconfío mucho de ejecutar evaluaciones comparativas en máquinas virtuales: hay muchas capas adicionales que pueden afectar los resultados de formas que no son obvias. (A menos que esté planeando ejecutar el sistema real en VM, por supuesto, en cuyo caso ese es un método muy válido).
fuente
He probado c ++ / qpid
Envié 50000 mensajes por segundo entre dos máquinas diferentes durante mucho tiempo sin hacer cola.
No utilicé 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á inactivo principalmente, probablemente no haya configurado la captación previa en el remitente y el receptor. Esto es muy importante para enviar muchos mensajes.
fuente
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:
La misma máquina pone y saca de cola:
Poner en cola y sacar de cola entre máquinas con un ancho de banda de red de 100 Mbps:
fuente
Intente configurar la captación previa en el remitente y el receptor con un valor como 100. La captación previa solo del remitente no es suficiente
fuente
Hemos desarrollado un bus de mensajes de código abierto construido sobre ZeroMQ; inicialmente lo hicimos para reemplazar Qpid. No tiene intermediarios, por lo que no es una comparación totalmente justa, pero proporciona la misma funcionalidad que las soluciones con intermediarios.
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
fuente