2012-03-14 9 views
36

Tenemos una aplicación que utilizará RabbitMQ y varias colas diferentes para pasar mensajes entre niveles.Tema Exchange vs Direct Exchange en RabbitMQ

Inicialmente, estaba planeando usar múltiples intercambios directos, con uno para cada tipo de mensaje, pero parece que tener un solo intercambio de temas 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 lo hay) de hacerlo de una manera sobre la otra?

Opción 1, el uso de múltiples intercambios directos:

ExchangeA (type: direct) 
-QueueA 

ExchangeB (type: direct) 
-QueueB 

ExchangeC (type: direct) 
-QueueC 

Opción 2, utilizando un solo cambio de tema:

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") 

Respuesta

29

Suponiendo que ambos modelos están siendo considerados para ser implementado usando uno corriendo corredor, hay poco diferencia que puedo 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 de 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.

Por último, si vas con la opción 1 y terminas con muchas colas, entonces 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.

+2

Estoy de acuerdo. Múltiples colas con claves de enrutamiento apropiadas es mucho más fácil de administrar. La única ventaja de la opción 1 que viene a la mente es que múltiples intercambios se pueden alojar en hardware por separado, lo que permite obtener una escala vertical. Sin embargo, si su hardware oscila entonces tal vez nunca tenga que tomar esta ruta. –

+0

Creo que la ventaja de usar Topic es que si en el futuro necesita enviar el mismo mensaje a múltiples colas en su intercambio, su opción 2 sería más conveniente. – gigi2

3

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 se va a escalar?
¿Lo necesito para escalar? ¿Deseo agregar un clúster 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 sus mensajes y realizar una cierta cantidad de prioridades 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 una tasa sostenida de más de 50kmsg/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.

4

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

Cambio de Tema

QueueA-- binding key = India.Karnataka.* 

Puede dirigir un mensaje a cambio de tema con clave de enrutamiento como India.Karnataka.bangalore, India.Karnataka.Mysore.

Todos los mensajes anteriores van a QueueA.

Intercambio Directo

Pero no entendía por qué estás creando múltiples intercambios directos en el enfoque 1. Usted puede tener un intercambio directo sola y tienen múltiples colas con cada unión con una clave única cola.

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

Todos los mensajes key1 va a QueueA.Key2 va a QueueB ... Todavía se puede mantener el intercambio directo sola.

Cuestiones relacionadas