2010-07-19 16 views
7

¿Es posible con RabbitMQ y Python hacer un enrutamiento basado en contenido?Enrutamiento basado en contenido con RabbitMQ y Python

El estándar AMQP y RabbitMQ dicen ser compatibles con el enrutamiento basado en contenido, pero ¿hay bibliotecas para Python que admitan la especificación de enlaces basados ​​en contenido, etc.?

La biblioteca que estoy utilizando actualmente (py-amqplib http://barryp.org/software/py-amqplib/) parece que solo admite el enrutamiento basado en temas con simple coincidencia de patrones (#, *).

Respuesta

16

la respuesta es "sí", pero hay más que eso ... primero ponerse de acuerdo sobre lo que basados ​​en los contenidos medios de encaminamiento :)

de Let. Hay dos posibles significados. Algunas personas dicen que se basa en la parte del encabezado de un mensaje. Otros dicen que se basa en la parte de los datos de un mensaje.

Si tomamos la primera definición, estas son más o menos las suposiciones que hacemos: Los datos existen en alguna parte, y se envían al intermediario de AMQP por algún software. Suponemos que esta pieza de software sabe lo suficiente sobre los datos para poner pares clave-valor (KV) en el encabezado del mensaje que describe el contenido. Idealmente, el remitente también es el productor de los datos, por lo que tiene tanta información como podríamos desear. Digamos que los datos son una imagen. entonces podríamos tener los pares KV emisor poner en el encabezado del mensaje como este:

width=1024 
height=768 
mode=bw 
photographer=John Doe 

Ahora podemos implementar el enrutamiento basado en contenido creando colas apropiadas. Supongamos que tenemos una operación separada para realizar en imágenes en blanco y negro y otra en imágenes en color. Podemos crear dos colas, una que reciba mensajes con mode=bw y otra con mode=colour. Luego tenemos clientes separados escuchando en esas colas. El agente realiza el enrutamiento y no hay nada en nuestro cliente que deba tener en cuenta el enrutamiento.

Si tomamos la segunda definición, pasamos de diferentes suposiciones. Suponemos que los datos llegan a existir en alguna parte, y se envían a un agente de AMQP mediante algún software. Pero suponemos que no es sensato exigir que ese software llene el encabezado con pares KV. En su lugar, queremos tomar una decisión de enrutamiento basada en el datos sí mismo.

Hay dos opciones para esto en AMQP: puede decidir implementar un nuevo intercambio para su formato de datos particular, o puede delegar el enrutamiento a un cliente.

En RabbitMQ, hay directo (1-a-1), fanout (1 a N), encabezados (encabezado-filtrado 1-a-N) y tema (tema filtrado de 1 a N) intercambios, pero puede implementar el suyo de acuerdo con el estándar AMQP. Esto requeriría leer mucha documentación de RabbitMQ e implementar el intercambio en Erlang.

La otra opción es crear un cliente AMQP en Python que escuche una "cola de enrutamiento de contenido" especial. Cada vez que llega un mensaje a la cola, su enrutador-cliente lo recoge, hace lo que sea necesario para tomar una decisión de enrutamiento y lo envía de vuelta al intermediario a una cola adecuada. Entonces, para implementar el escenario anterior, su programa Python detectaría si una imagen está en blanco y negro o en color, y la (re) enviaría a una cola "blanco y negro" o "color", donde algunos un cliente adecuado tomaría el control.

Por lo tanto, en su segunda pregunta, realmente no hay nada que usted haga en su cliente que haga un enlace basado en contenido.O bien su (s) cliente (s) funciona (n) como se describió anteriormente, o puede crear un nuevo tipo de intercambio en RabbitMQ. Luego, en el código de configuración del cliente, define el tipo de intercambio para que sea su nuevo tipo.

Espero que responda a su pregunta!

5

En RabbitMQ, el enrutamiento es el proceso mediante el cual un intercambio decide en qué colas colocar su mensaje. Publica todos los mensajes en un intercambio, pero solo recibe mensajes de una cola. Esto significa que el intercambio es una parte activa del proceso que toma algunas decisiones sobre el reenvío o copia de mensajes.

El intercambio de tema incluido con RabbitMQ mira una cadena en los mensajes entrantes (la clave de enrutamiento) y la compara con los patrones (las claves de vinculación) provistos por todas las colas que declaran su deseo de recibir mensajes del intercambio.

código fuente RabbitMQ está en la web para que pueda tener un vistazo al código de intercambio tema aquí: http://hg.rabbitmq.com/rabbitmq-server/file/9b22dde04c9f/src/rabbit_exchange_type_topic.erl Gran parte de la complejidad que hay que manejar una estructura de datos denominada un trie que permite búsquedas muy rápidas. De hecho, la misma estructura de datos se usa dentro de los enrutadores de Internet.

El intercambio de encabezados encontrado aquí http://hg.rabbitmq.com/rabbitmq-server/file/9b22dde04c9f/src/rabbit_exchange_type_headers.erl es probablemente más fácil de entender. Como puede ver, no se requiere mucho código para hacer un tipo diferente de intercambio. Si quisieras examinar el contenido (o tal vez solo echar un vistazo a los primeros bytes de mensajes, deberías ser capaz de identificar rápidamente XML versus JSON versus algo más. Y si tus objetos JSON y documentos XML mantienen una secuencia específica de elementos, entonces debería ser capaz de distinguir entre diferentes objetos JSON (o tipos de documentos XML) sin analizar todo el cuerpo del mensaje.