【问题标题】:How to prevent duplicates in RabbitMQ dead lettering?如何防止 RabbitMQ 死信中的重复?
【发布时间】:2017-06-29 20:45:59
【问题描述】:

首先,抱歉标题不好!我找不到与此问题匹配的任何具体内容,并且在 Google 或 Stackoverflow 上找不到与此问题相关的任何内容。

所以首先是一些背景知识,我有一个基于 php-amqplib\Thumper 的 RabbitMQ 消费者,并且成功的消息消费一切正常,符合预期。

但是,我有一个方法是 RabbitMQ 的回调,每次它向消费者分派消息时,都会触发此回调。

我将它包裹在一个 try catch 中,这样,如果一条消息无法处理,我可以设置一个 retry_count 标头,一旦该消息第三次返回,例如retry_count: 3我将它发布到死队列,然后发送basic_nack

但是,这就是我的问题所在,我的死队列中的每条消息都收到超过 1 条消息,即对于每条失败的消息,我的死队列中出现 2 条消息,其中一条消息具有正确的死队列属性。例如

delivery_mode: 2 headers:
x-death:
count: 1 reason: rejected queue: ee.api.events.medusa time: 1498730321 exchange: EES_ApiEvents routing-keys: ee.api.events.medusa.WALLET.UPDATE

另一个,只有delivery_mode,没有其他属性,我一生都无法弄清楚这个多余的消息是从哪里来的!

这是retry_count 达到 3 时运行的代码:

        $producer
            ->setDurableExchange(true)
            ->setExchangeType(Producer::RABBITMQ_EXCHANGE_TYPE_TOPIC)
            ->setExchangeAutodelete(false)
            ->setExchangeName($deadExchangeName)
            ->setQueueName($deadQueueName)
            ->setRoutingKey($routingKey)
            ->setBindings([
                $routingKey,
            ]);

        $producer->publish(Json::decode($message->body, true));

        $message->delivery_info['channel']->basic_nack($deliveryTag, false, false);

提前致谢!

【问题讨论】:

    标签: php duplicates rabbitmq amqp


    【解决方案1】:

    所以在玩了很多之后,我回到文档并重新阅读,它清楚地指出,如果你拒绝带有 requeue=false 的消息,那么如果你定义了一个死信交换反对主队列。

    所以问题现在解决了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 2023-02-15
      • 2013-01-22
      • 1970-01-01
      相关资源
      最近更新 更多