Nuestros mejores desarrolladores han agotado sus provisiones de café, buscando día y noche por la resolución, hasta que Antonio encontró el arreglo en Beanstalk por lo tanto ahora la comparte contigo.
Solución:
Encontré esto extremadamente útil al desarrollar mis aplicaciones. Ya que le brinda una alternativa a simplemente volver a poner en cola sus mensajes. Esto puede reducir fácilmente la complejidad de su código y es una de las muchas funciones ocultas de gran alcance en RabbitMQ.
Pasos
Primero necesitamos configurar dos canales básicos, uno para la cola principal y otro para la cola de retardo. En mi ejemplo al final, incluyo un par de indicadores adicionales que no son necesarios, pero hacen que el código sea más confiable; tal como confirm delivery
, delivery_mode
y durable
. Puede encontrar más información sobre estos en el manual de RabbitMQ.
Después de haber configurado los canales, agregamos un enlace al canal principal que podemos usar para enviar mensajes desde el canal de retardo a nuestra cola principal.
channel.queue_bind(exchange='amq.direct',
queue='hello')
A continuación, debemos configurar nuestro canal de demora para reenviar mensajes a la cola principal una vez que hayan expirado.
delay_channel.queue_declare(queue='hello_delay', durable=True, arguments=
'x-message-ttl' : 5000,
'x-dead-letter-exchange' : 'amq.direct',
'x-dead-letter-routing-key' : 'hello'
)
-
x-message-ttl (Mensaje – Tiempo de vida)
Esto se usa normalmente para eliminar automáticamente los mensajes antiguos en la cola después de una duración específica, pero al agregar dos argumentos opcionales podemos cambiar este comportamiento y, en su lugar, hacer que este parámetro determine en milisegundos cuánto tiempo permanecerán los mensajes en la cola de retraso.
-
x-enrutamiento-de-letra-muerta-key
Esta variable nos permite transferir el mensaje a una cola diferente una vez que han expirado, en lugar del comportamiento predeterminado de eliminarlo por completo.
-
x-intercambio-de-cartas-muertas
Esta variable determina qué Exchange utilizó para transferir el mensaje de hello_delay a hello queue.
Publicar en la cola de retraso
Cuando terminemos de configurar todos los parámetros básicos de Pika, simplemente envíe un mensaje a la cola de retraso usando la publicación básica.
delay_channel.basic_publish(exchange='',
routing_key='hello_delay',
body="test",
properties=pika.BasicProperties(delivery_mode=2))
Una vez que haya ejecutado el script, debería ver las siguientes colas creadas en su módulo de administración de RabbitMQ.
Ejemplo.
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
'localhost'))
# Create normal 'Hello World' type channel.
channel = connection.channel()
channel.confirm_delivery()
channel.queue_declare(queue='hello', durable=True)
# We need to bind this channel to an exchange, that will be used to transfer
# messages from our delay queue.
channel.queue_bind(exchange='amq.direct',
queue='hello')
# Create our delay channel.
delay_channel = connection.channel()
delay_channel.confirm_delivery()
# This is where we declare the delay, and routing for our delay channel.
delay_channel.queue_declare(queue='hello_delay', durable=True, arguments=
'x-message-ttl' : 5000, # Delay until the message is transferred in milliseconds.
'x-dead-letter-exchange' : 'amq.direct', # Exchange used to transfer the message from A to B.
'x-dead-letter-routing-key' : 'hello' # Name of the queue we want the message transferred to.
)
delay_channel.basic_publish(exchange='',
routing_key='hello_delay',
body="test",
properties=pika.BasicProperties(delivery_mode=2))
print " [x] Sent"
Puede utilizar el complemento oficial de RabbitMQ: x-mensaje-retrasado .
En primer lugar, descargue y copie el archivo ez en Your_rabbitmq_root_path / plugins
En segundo lugar, habilite el complemento (no es necesario reiniciar el servidor):
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
Finalmente, publique su mensaje con encabezados “x-delay” como:
headers.put("x-delay", 5000);
Aviso:
No garantiza la seguridad de su mensaje, porque si su mensaje caduca solo durante el tiempo de inactividad de su rabbitmq-server, desafortunadamente el mensaje se pierde. Entonces ten cuidado cuando usa este esquema.
Disfrútalo y más información en rabbitmq-delayed-message-exchange
Para su información, cómo hacer esto en Spring 3.2.x.
10000
valoraciones y comentarios
Tienes la opción de asistir nuestro quehacer escribiendo un comentario o dejando una puntuación te damos la bienvenida.