如何防止RabbitMQ死字母重复?

时间:2017-06-29 10:06:22

标签: php duplicates rabbitmq amqp

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

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

但是,我有一个方法,它是每次向消费者发送消息时RabbitMQ的回调,这个回调被触发。

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

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

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);

提前致谢!

1 个答案:

答案 0 :(得分:1)

所以经过大量的游戏,我回到了文档并重新阅读,它清楚地说明,如果你拒绝requeue=false的消息,那么如果你定义了一个死信交换,它会自动被删除字母反对主要队列。

现在问题解决了!