首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每条消息TTL问题

每条消息TTL问题
EN

Stack Overflow用户
提问于 2014-02-04 18:03:18
回答 3查看 3.5K关注 0票数 0

我在RabbitMQ队列中使用了不同的“每个消息TTL”,并且我希望具有不同TTL的消息应该在适当的时候由消费者处理。

为了提供这种行为,我使用具有巨大“x消息-TTL”的RabbitMQ队列,我将消息添加到这个队列中,其值为“每个消息TTL”(参见下面的代码)。例如,用TTL 30秒、20秒和10秒添加队列消息。

行为上的问题,RabbitMQ如何处理队列中不同“每个MessageTTL”的消息,最大TTL的消息以较少的TTL停止消息。因此,当最大的TTL到期时,消费者就会将所有的过程组合在一起。

发布消息代码:

代码语言:javascript
复制
$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);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-05 12:33:07

我要说的是,我不完全理解你的问题,因为措辞让我感到困惑。

你指的是这个(从文档中)吗?

然而,在设置每条消息TTL时,过期消息可以排在未过期消息之后,直到后者被消耗或过期为止。因此,这些过期消息所使用的资源将不会被释放,它们将被计算在队列统计数据中(例如队列中的消息数量)。

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

票数 0
EN

Stack Overflow用户

发布于 2014-02-06 10:00:25

正如正确地指出的,rmayer06通过设计来描述所描述的功能。

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

代码语言:javascript
复制
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/

票数 0
EN

Stack Overflow用户

发布于 2015-08-21 08:48:17

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21559992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档