我最近发现RabbitMQ功能可以让你延迟消息,虽然我找不到类似于我需要的任何例子,但它的效果很好:
假设有3种类型的消息:A,B和C.我们有2个delay_queues,包含1小时和2小时'x-message-ttl
值。还有3种类型的destination_queues - 每种类型都用于特定的消息类型。
我想要实现的是在其中一个delay_queues中的消息到达其TTL之后,它将根据其类型被路由到其中一个destination_queues。像这样:
使用RabbitMQ消息属性是否可以实现?有任何想法吗?我的代码将消息发送到延迟队列(在到期之后它们被发送到hello队列):
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
'localhost'))
channel = connection.channel()
channel.confirm_delivery()
channel.queue_declare(queue='hello', durable=True)
channel.queue_bind(exchange='amq.direct',
queue='hello')
delay_channel = connection.channel()
delay_channel.confirm_delivery()
delay_channel.queue_declare(queue='hello_delay', durable=True, arguments={
'x-message-ttl' : 3600000,
'x-dead-letter-exchange' : 'amq.direct',
'x-dead-letter-routing-key' : 'hello'
})
while 1 :
delay_channel.basic_publish(exchange='',
routing_key='hello_delay',
body="test",
properties=pika.BasicProperties(delivery_mode=2))
print "Sent to delay queue"
答案 0 :(得分:2)
当邮件因达到强制TTL而过期时,可以将它们重定向到dead-letter exchange,这就是我认为您在过期后将邮件隐式地移动到另一个队列中。
您可以使用邮件的原始路由密钥或最终“CC”和“BCC”邮件头来选择不同的目标队列。
答案 1 :(得分:0)
好的,所以我设法找到了解决方案。不确定它是否是最好的但它有效。
x-dead-letter-exchange: ROUTER_EXCHANGE
和x-message-ttl: 14000
这种方式在发送(推送)消息时我没有指定队列,只需交换和路由_key:
delay_channel.basic_publish(exchange='delay_exchange',
routing_key='helloC',
body="test",
properties=pika.BasicProperties(delivery_mode=2))
消息被推送到DELAY_EXCHANGE,它将它指向delay_queue,等待它的TTL。当消息过期时,它会被重定向到ROUTER_EXCHANGE,后者分析其routing_key并将其重定向到其中一个目标队列。真棒。
答案 2 :(得分:0)
您可以使用新的RabbitMQ延迟消息交换https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/