Closed
Closed
Copy link
Description
Description
RabbitMQ topic exchange very often can be used as a shared channel of communication. Applications can publish own messaged to that channel and listen on messages from other apps (some times even in different technologies and languages).
Currently it's not possible to use messenger for such purposes because of retry/delay logic - after dead letter queue expires, all its messages will be redirected to origin exchange with original routing keys. So, in case of topic exchange there is a risk of multiple republication of own or other app messages to all apps, who listen on that exchange.
To solve this problem we can use origin queue redirect instead of origin exchange.
Example
if ($originQueue === null) {
$dlExchange = $this->exchangeOptions['name'];
$dlRoutingKey = $routingKey ?? '';
$dlQueueName = $this->getRoutingKeyForDelay($delay, $routingKey);
} else {
$dlExchange = '';
$dlRoutingKey = $originQueue;
$dlQueueName = $this->getRoutingKeyForDelay($delay, $originQueue);
}
$queue->setName($dlQueueName);
$queue->setFlags(AMQP_DURABLE);
$queue->setArguments([
'x-message-ttl' => $delay,
'x-expires' => $delay + 10000,
'x-dead-letter-exchange' => $dlExchange,
'x-dead-letter-routing-key' => $dlRoutingKey,
]);