我在RabbitMQ队列中使用了不同的“每个消息TTL”,并且我希望具有不同TTL的消息应该在适当的时候由消费者处理。
为了提供这种行为,我使用具有巨大“x消息-TTL”的RabbitMQ队列,我将消息添加到这个队列中,其值为“每个消息TTL”(参见下面的代码)。例如,用TTL 30秒、20秒和10秒添加队列消息。
行为上的问题,RabbitMQ如何处理队列中不同“每个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);发布于 2014-02-05 12:33:07
我要说的是,我不完全理解你的问题,因为措辞让我感到困惑。
你指的是这个(从文档中)吗?
然而,在设置每条消息TTL时,过期消息可以排在未过期消息之后,直到后者被消耗或过期为止。因此,这些过期消息所使用的资源将不会被释放,它们将被计算在队列统计数据中(例如队列中的消息数量)。
我没有问题使用每条消息的TTL功能。这些消息在到达使用者之前就过期了。文档中所述的是,它们不是按随机顺序从队列中过期的,而是只有在消息从队列中“读取”时才过期。这就是你的问题的原因吗?
发布于 2014-02-06 10:00:25
正如正确地指出的,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/
发布于 2015-08-21 08:48:17
不幸的是(imho) theMayer是正确的。只有当消息到达队列头时,该消息才会过期。我们公司也有类似的问题。最后,我们必须实现单独的队列,因为我们只有两个不同的超时,所以有两个队列。我们正在调查一个插件,它可能允许您搜索https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/的操作。
https://stackoverflow.com/questions/21559992
复制相似问题