RabbitMQ - 在消息到达其到期时间之后路由消息

时间:2015-05-28 07:47:09

标签: rabbitmq ttl dead-letter

我最近发现RabbitMQ功能可以让你延迟消息,虽然我找不到类似于我需要的任何例子,但它的效果很好:

假设有3种类型的消息:A,B和C.我们有2个delay_queues,包含1小时和2小时'x-message-ttl值。还有3种类型的destination_queues - 每种类型都用于特定的消息类型。

我想要实现的是在其中一个delay_queues中的消息到达其TTL之后,它将根据其类型被路由到其中一个destination_queues。像这样:

enter image description here

使用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"

3 个答案:

答案 0 :(得分:2)

当邮件因达到强制TTL而过期时,可以将它们重定向到dead-letter exchange,这就是我认为您在过期后将邮件隐式地移动到另一个队列中。

您可以使用邮件的原始路由密钥或最终“CC”和“BCC”邮件头来选择不同的目标队列。

答案 1 :(得分:0)

好的,所以我设法找到了解决方案。不确定它是否是最好的但它有效。

  1. 我创建了两个交换:DELAY_EXCHANGE和ROUTER_EXCHANGE
  2. 我将DELAY_EXCHANGE绑定到delay_queue(包含我使用的所有routing_keys)
  3. 延迟队列设置为x-dead-letter-exchange: ROUTER_EXCHANGEx-message-ttl: 14000
  4. 我将ROUTER_EXCHANGE绑定到所有队列(A,B,C)以及相应的routing_keys。
  5. 这种方式在发送(推送)消息时我没有指定队列,只需交换和路由_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/