【问题标题】:RabbitMQ DLX how to specify per-message TTL back to original queue?RabbitMQ DLX 如何指定每条消息的 TTL 返回原始队列?
【发布时间】:2016-05-23 13:09:31
【问题描述】:

我有一个按预期工作的死信交换 - 当我收到一条消息时,它会在那里:

@Override
public void onMessage(Message message, Channel channel) throws Exception {
    // How to specify when the message will be put back to the original queue?
    // This doesn't work.
    message.getMessageProperties().setExpiration("3000");
    channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
}

但我找不到的是如何指定每条消息何时应将消息返回到原始队列。请指教。

【问题讨论】:

标签: java rabbitmq


【解决方案1】:

当消息是死信时,过期标头被删除。其次,消息不会自动从您的死信队列发送回您的原始队列。

听起来您想要一个具有每条消息等待时间的重试系统。这可以做到,但不是你现在做的方式。

基本模式是您确认您的消息,然后将其发送到“延迟”交换和队列。此队列将它的死信交换设置为您的应用程序的交换。当一条消息到达延迟队列时,它会一直待在那里,直到达到消息 TTL 并被死信发送给您的应用程序交换。但是,当您有可变消息到期时,这不起作用。消息从队列的头部得到死信,因此过期时间长的消息将阻塞后面过期时间较短的消息。

所以你有多种选择来克服这个问题。

  1. 有几个标准延迟交换可供选择,它们具有不同的基于队列的 TTL,并且不设置消息过期。
  2. 就在发送消息之前,声明一个临时延迟交换(自动删除)和队列(队列 TTL 在消息过期几秒钟后过期)。发送您的消息,它会在正确的时间后变成死信,然后交换将自动删除,队列将过期并被删除。如果您有重试高峰,这可能会非常昂贵。但是,如果您在到期时间限制之后命名临时交换和队列,那么它将被同一时间段内发送的具有相同 TTL 的其他消息重用。
  3. NServiceBus 有一个巧妙的技术,使用多个延迟交换和队列:https://docs.particular.net/nservicebus/rabbitmq/delayed-delivery

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2013-08-09
    • 2015-08-22
    • 2020-12-12
    • 1970-01-01
    相关资源
    最近更新 更多