Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何防止RabbitMQ死信重复?_Php_Duplicates_Rabbitmq_Amqp - Fatal编程技术网

Php 如何防止RabbitMQ死信重复?

Php 如何防止RabbitMQ死信重复?,php,duplicates,rabbitmq,amqp,Php,Duplicates,Rabbitmq,Amqp,首先,很抱歉标题不好!我找不到任何与此问题相匹配的具体内容,也找不到谷歌或Stackoverflow上关于此问题的任何内容 首先是一些背景知识,我有一个基于RabbitMQ的消费者,成功的消息消费一切正常,正如预期的那样 但是,我有一个方法,它是RabbitMQ的回调,每当它向使用者发送消息时,就会触发这个回调 我将它包装在一个try-catch中,这样,如果一条消息处理失败,我可以设置一个重试计数头,一旦该消息第三次返回,例如重试计数:3我将其发布到一个死队列,并发送一个基本nack 然而,我

首先,很抱歉标题不好!我找不到任何与此问题相匹配的具体内容,也找不到谷歌或Stackoverflow上关于此问题的任何内容

首先是一些背景知识,我有一个基于RabbitMQ的消费者,成功的消息消费一切正常,正如预期的那样

但是,我有一个方法,它是RabbitMQ的回调,每当它向使用者发送消息时,就会触发这个回调

我将它包装在一个try-catch中,这样,如果一条消息处理失败,我可以设置一个
重试计数
头,一旦该消息第三次返回,例如
重试计数:3
我将其发布到一个死队列,并发送一个
基本nack

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


交付方式:2
标题:
x-死亡:
计数:1 理由:拒绝 队列:ee.api.events.medusa 时间:149870321 交换:EES_ApiEvents 路由密钥:ee.api.events.medusa.WALLET.UPDATE

另一个,只有delivery_模式,没有其他属性,我一辈子都不知道这个多余的消息是从哪里来的

这是当重试计数达到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);

提前谢谢

因此,在进行了大量的讨论之后,我回到文档并重新阅读,它清楚地指出,如果您拒绝带有
requeue=false
的消息,那么如果您针对主队列定义了死信交换,那么它将自动成为死信

所以问题现在解决了