php rabbitmq每消息TTL问题

时间:2014-02-04 18:03:19

标签: php rabbitmq

我在RabbitMQ队列中使用不同的“Per Message TTL”,我希望消费者能够在适当的时候处理具有不同TTL的消息。

为了提供这种行为,我使用带有巨大“x-message-ttl”的RabbitMQ队列,我使用自己的值“Per Message TTL”将消息添加到此队列(请参阅下面的代码)。例如,添加TTL 30,20和10秒的队列消息。

行为问题,RabbitMQ如何处理队列中具有不同“Per MessageTTL”的消息,具有最大TTL的消息停止具有较少TTL的消息。因此,当最大的TTL到期时,消费者处理所有消息。

发布消息代码:

$channel = new AMQPChannel($this->connection);    
$exchange = new AMQPExchange($channel);
$exchange->setName($exchangeName);
$exchange->setType(AMQP_EX_TYPE_DIRECT);        
$ttl = $ttl*1000;    
$params = array('expiration'=>$ttl);    
$message = $exchange->publish($msg, $this->queueNotDelayedName, null, $params);

3 个答案:

答案 0 :(得分:0)

我会提前做好我不完全理解你的问题,因为措辞让我感到困惑。

你指的是这个(来自文档)?

  

但是,在设置每条消息TTL时,过期的消息可以排队   在非过期者之后,直到后者被消费或过期。   因此,这些过期消息使用的资源将不会被释放,并且   它们将计入队列统计信息(例如,消息数量)   在队列中。)

我没有使用每条消息TTL功能的问题。消息在到达消费者之前到期。文档说的是它们不是以随机顺序从队列中过期,而是当它们从队列中“读取”消息时它们才过期。这是你问题的原因吗?

答案 1 :(得分:0)

正如rmayer06所述,所描述的功能在设计上有效。

来自http://www.rabbitmq.com/ttl.html#per-message-ttl

When setting per-message TTL however, expired messages can queue up
behind non-expired ones until the latter are consumed or expired.

我以编程方式解决了我的问题。 我使用了这里描述的解决方案:

http://yuserinterface.com/dev/2013/01/08/how-to-schedule-delay-messages-with-rabbitmq-using-a-dead-letter-exchange/

答案 2 :(得分:0)

不幸的是(imho)theMayer是正确的。该消息只有在到达队列头部时才会过期。我们在公司遇到了类似的问题。最后我们必须实现单独的队列,因为我们只有2个不同的超时,因此有2个队列。有一个插件,我们正在调查,可能允许您寻求的操作https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/