Pregunta

Me gustaría mensajes selectivamente Eliminar en una cola de AMQP sin siquiera leerlos.

El escenario es el siguiente:

Envío de las partes quiere caducar los mensajes de tipo X en base a un hecho que la nueva información de tipo X llegó. Debido a que es muy probable que el abonado no consumió último mensaje del tipo X, sin embargo, editor debe simplemente eliminar los mensajes de tipo X anteriores y poner un uno más nuevo en la cola. Toda la operación debe ser transparente para el abonado -., de hecho, él debe utilizar algo tan simple como STOMP para obtener los mensajes

Como hacerlo usando AMQP? O puede que sea más conveniente en otro protocolo de mensajería?

Me gustaría evitar una infraestructura complicada. Toda la mensajería necesaria es tan simple como arriba:. una cola, un abonado, un editor, pero el editor debe tener una capacidad de ad-hoc Eliminación de los mensajes para un criterio dado

El cliente editor utilizará Rubí, pero en realidad me gustaría hacer frente a cualquier idioma lo más pronto descubro cómo hacerlo en el protocolo.

¿Fue útil?

Solución

No se puede hacer esto en la actualidad RabbitMQ (o, más generalmente, en AMQP) de forma automática. Sin embargo, aquí hay una solución fácil.

Vamos a decir que desea enviar tres tipos de mensajes: Xs, Ys y Zs. Si entiendo bien su pregunta, cuando llega un mensaje de X, desea que el agente de olvidar todos los demás mensajes X que no han sido entregados.

Esto es bastante fácil de hacer en RabbitMQ:

  • el productor declara tres colas: X, Y y Z (que están ligados automáticamente al cambio predeterminado con sus nombres como teclas de enrutamiento, que es exactamente lo que queremos),
  • cuando se publica un mensaje, el productor primera purga la cola relevante (así, si es la publicación de un mensaje de X, que primero purga la cola X); esto elimina eficazmente los mensajes obsoletos,
  • el consumidor simplemente consume de la cola que quiere (X para los mensajes de X, Y para los mensajes de Y, etc.); desde su punto de vista, sólo tiene que hacer un basic.get para obtener el siguiente mensaje relevante.

Esto implica una condición de carrera cuando dos productores envían el mismo tipo de mensaje en la parte casi al mismo tiempo. El resultado es que es posible para la cola para tener dos (o más) mensajes al mismo tiempo, pero dado que el número de mensajes es superior limitada por el número de productores, y puesto que los mensajes superfluos se purgan en la siguiente publicación , esto no debería ser un gran problema.

Para resumir, esta solución tiene sólo un paso adicional de la solución óptima, es decir, purga de colas X antes de publicar un mensaje de tipo X.

Si necesita ayuda para configurar esta configuración, el lugar perfecto para pedir consejo es la lista de correo RabbitMQ-hablar.

Otros consejos

No quiero una cola de mensajes, que desea una base de datos clave-valor. Por ejemplo, podría utilizar Redis o Tokio Tirano para obtener una sencilla base de datos clave-valor accesible desde la red. O simplemente utilizar un Memcache.

Cada tipo de mensaje es una clave. Cuando se escribe un nuevo mensaje con la misma clave, se sobrescribe el valor anterior por lo que el lector de esta base de datos nunca será capaz de salir de la información de la fecha.

En este punto, sólo se necesita una cola de mensajes para establecer el orden en que las claves deben ser leídos, si eso es importante. De lo contrario, simplemente escanear continuamente la base de datos. Si escanea continuamente la base de datos, lo mejor es poner la base de datos de cerca de los lectores para reducir el tráfico de red.

Probablemente haría algo como esto key: typecode value: lastUpdated, important data

A continuación, me gustaría enviar mensajes que contienen typecode, lastUpdated De esta manera el lector puede comparar LastUpdated para esa tecla a la que se agoten lectura de la base de datos y omitir su lectura debido a que ya están al día.

Si realmente necesita hacer esto con AMQP, a continuación, utilizar RabbitMQ y un tipo de cambio a medida, específicamente un intercambio de caché último valor. código de ejemplo está aquí https://github.com/squaremo/rabbitmq-lvc-plugin

Parece que funciona también de la RabbitMQ Web-UI, si lo que desea es eliminar los primeros mensajes de la cola de n

  • Seleccione la cola de la pestaña "colas", baje hasta la sección "Obtener mensajes"
  • conjunto de parámetros "requeue = No" y el número de mensajes que desea eliminar de la cola
  • pulse "Obtener mensajes" botón

Esta pregunta tiene una alta visibilidad debido al título de la misma. El paso por la descripción mora con el escenario más específico. Así que para aquellos usuarios que buscan eliminar de hecho la siguiente (recuerda FIFO) mensaje de la cola, se puede hacer uso de rabbitmqadmin y emitir el siguiente comando:

rabbitmqadmin get queue=queuename requeue=false count=1

Este comando está consumiendo en esencia el mensaje y no hacer nada. Un comando completo con la bandera de tomar copia de seguridad del mensaje (s) se parece al menor que uno. Asegúrese de añadir otros parámetros como por su exigencia.

sudo python rabbitmqadmin -V virtualhostname -u user -p pass get queue=queuename requeue=false count=1 payload_file=~/origmsg

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top