我在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);
答案 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.
我以编程方式解决了我的问题。 我使用了这里描述的解决方案:
答案 2 :(得分:0)
不幸的是(imho)theMayer是正确的。该消息只有在到达队列头部时才会过期。我们在公司遇到了类似的问题。最后我们必须实现单独的队列,因为我们只有2个不同的超时,因此有2个队列。有一个插件,我们正在调查,可能允许您寻求的操作https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/