topic parallel fan exchange example direct rabbitmq message-queue rabbitmq-exchange

parallel - rabbitmq send message to queue



Tema Exchange vs Direct Exchange en RabbitMQ (3)

Tenemos una aplicación que usará RabbitMQ y varias colas diferentes para pasar mensajes entre niveles.

Inicialmente, estaba planeando usar múltiples intercambios directos, con uno para cada tipo de mensaje, pero parece que tener un solo intercambio de tema con colas usando diferentes enlaces de clave de enrutamiento logrará lo mismo.

Tener un solo intercambio también parece que sería un poco más fácil de mantener, pero me preguntaba si hay algún beneficio (si es que hay alguno) de hacerlo de una manera sobre la otra.

Opción 1, usando múltiples intercambios directos:

ExchangeA (type: direct) -QueueA ExchangeB (type: direct) -QueueB ExchangeC (type: direct) -QueueC

Opción 2, utilizando intercambio de tema único:

Exchange (type: topic) -QueueA (receives messages from exchange with routing key of "TypeA") -QueueB (receives messages from exchange with routing key of "TypeB") -QueueC (receives messages from exchange with routing key of "TypeC")


De hecho, el enfoque 2 es mejor, ya que le da flexibilidad para usar una única cola para múltiples claves de enrutamiento.

Tema de intercambio

QueueA-- binding key = India.Karnataka.*

Puede enrutar un mensaje al intercambio de temas con la clave de enrutamiento como India.Karnataka.bangalore, India.Karnataka.Mysore.

Todos los mensajes anteriores van a QueueA.

Intercambio directo

Pero no entendí por qué está creando múltiples intercambios directos en el enfoque 1. Puede tener intercambio directo único y tener múltiples colas con cada enlace de cola con una clave única.

QueueA-- binding key = Key1 QueueB-- binding Key = Key2 QueueC-- binding Key = Key3

Todos los mensajes clave1 van a QueueA.Key2 va a QueueB ... Aún puede mantener el intercambio directo único.


Para un solo pequeño nodo con poca carga, hay poca diferencia. La mayoría de las personas opta por la opción dos por los motivos mencionados anteriormente.

Al diseñar el sistema, debe preguntarse cómo podría expandirse en el futuro.

¿Cómo va a escalar?
¿Lo necesito para escalar? ¿Quiero agregar un cluster alto de disponibilidad en el futuro? ¿Mi ruta va a cambiar ...

La opción 2 proporciona mucha más flexibilidad en la mayoría de los casos.

Le permite hacer cosas como conectar un nuevo consumidor al Exchange con su propia cola y capturar cualquier subconjunto o todo su flujo de mensajes fácilmente. (Estas colas podrían estar en otros nodos de un clúster o en n nodos que proporcionan conmutación por error). Un caso de uso típico sería registrar todos los mensajes utilizando una 4ª cola.

Si su cuello de botella está en el lado del procesamiento, también puede subdividir los temas de su mensaje y realizar una cierta cantidad de priorización sin tener que cambiar sus editores. Ejemplo: ToppicA.urgent, procesado por el consumidor dedicado, TopicA.log eventualmente procesado.

La respuesta corta es ir con la opción 2 a menos que tenga requisitos de rendimiento muy específicos. Si, por ejemplo, necesita procesar, por ejemplo, una tasa sostenida de más de 50k msg / s, puede pensar en la opción 1 en nodos dedicados, pero para flujos normales la opción 2 será más fácil de escalar y mantener.


Suponiendo que se considera que ambos modelos se implementan utilizando un intermediario en ejecución, hay poca diferencia que yo pueda ver.

La opción 2 parece ser más común en el mundo real para resolver este tipo de problema de enrutamiento (al menos en mi experiencia anecdótica) y es exactamente el desafío que existen los intercambios de tópicos para resolver.

La única diferencia que podría encontrar estaría relacionada con la velocidad de enrutamiento. No estoy seguro si el enrutamiento de Exchange (basado siempre en una coincidencia de cadena exacta) es más rápido en RabbitMQ en comparación con la técnica de clave de enrutamiento utilizada en Intercambios de tema (que puede incluir comodines como # y * ). Mi presentimiento es que la discriminación de Exchange sería más rápida, pero podrías experimentar por ti mismo para averiguarlo, o intentar contactar al equipo de RabbitMQ para preguntarles.

Finalmente, si vas con la opción 1 y terminas con muchas colas, tendrás una proliferación proporcional de intercambios. Eso suena como un dolor de cabeza de mantenimiento. Si solo tienes un puñado de colas, entonces no será un gran problema.