その情報(ドキュメントを含む)を検索しましたが、見つかりません。
RabbitMQ v. 2.7.1 で最新バージョンのphp-amqplibを使用しています。3 つのキューと 3 つの交換があります。
// Declare the exchanges
$this->channel->exchange_declare(self::EXCHANGE_TO_PROCESS, 'direct', false, true, false, false, false);
$this->channel->exchange_declare(self::EXCHANGE_WAITING, 'direct', false, true, false, false, false);
$this->channel->exchange_declare(self::EXCHANGE_TO_CLEAN, 'direct', false, true, false, false, false);
// Messages in the to_process queue are sent to to_clean after 24 hours without being processed
$this->channel->queue_declare(self::QUEUE_TO_PROCESS, false, true, false, false, false, array(
'x-dead-letter-exchange' => array('S', self::EXCHANGE_TO_CLEAN),
'x-message-ttl' => array('I', 86400000), // 1 day in milli-seconds
));
// Messages in the waiting queue are sent to to_process after 5 minutes (wait period before retry)
$this->channel->queue_declare(self::QUEUE_WAITING, false, true, false, false, false, array(
'x-dead-letter-exchange' => array('S', self::EXCHANGE_TO_PROCESS),
'x-message-ttl' => array('I', 300000), // 5 minutes in milli-seconds
));
// Messages in the to_clean queue are kept until they are processed
$this->channel->queue_declare(self::QUEUE_TO_CLEAN, false, true, false, false, false);
// Bind the queues to the exchanges
$this->channel->queue_bind(self::QUEUE_TO_PROCESS, self::EXCHANGE_TO_PROCESS);
$this->channel->queue_bind(self::QUEUE_TO_CLEAN, self::EXCHANGE_TO_CLEAN);
$this->channel->queue_bind(self::QUEUE_WAITING, self::EXCHANGE_WAITING);
動作は非常に簡単です。メッセージは .xml ファイルに発行されますEXCHANGE_TO_PROCESS
。外部ワーカーがメッセージを処理します。処理が A-OK になった場合、メッセージは単純に ACK され、キューから削除されます (この部分は完全に機能します)。処理がうまくいかない場合、メッセージは代わりに に挿入され、 5 分間の TTL の後、再処理EXCHANGE_WAITING
のために DLX を介して に再挿入されます。EXCHANGE_TO_PROCESS
ただし、3 回目の失敗の後、cron ジョブが来る場所に挿入され、EXCHANGE_TO_CLEAN
メッセージやログ エラーなどをクリーンアップします。
ただし、私が遭遇した問題は、コードが (予想どおり) を明確に にバインドしQUEUE_WAITING
ているEXCHANGE_WAITING
ことですが、RabbitMQ 管理ページを調べると、2 つのキューがその交換にバインドされていることに気付きました。注文。5 分が経過すると、メッセージは消えます。理由はよくわかりません。QUEUE_TO_PROCESS
QUEUE_WAITING
これらすべてが私の質問に私たちをもたらします:デッドレター交換は暗黙的にパラメータの交換をキューにバインドしますか? そして : 失われたメッセージに何が起こっている可能性がありますか?
編集
私は私よりもさらに混乱しています。私は次の非常に基本的なコードを試しました:
$this->channel->exchange_declare('exchangeA', 'fanout', false, true, false, false, false);
$this->channel->exchange_declare('exchangeB', 'fanout', false, true, false, false, false);
$this->channel->queue_declare('queueA', false, true, false, false, false, array(
'x-dead-letter-exchange' => array('S', 'exchangeB'),
'x-message-ttl' => array('I', 5000)
));
$this->channel->queue_declare('queueB', false, true, false, false, false);
$this->channel->queue_bind('queueA', 'exchangeA');
$this->channel->queue_bind('queueB', 'exchangeB');
$msg = new AMQPMessage('hello!');
$this->channel->basic_publish($msg, 'exchangeA');
これにより、2 つのキューと 2 つの exchange が作成され (ルーティング キーの煩わしさを避けるために、私は見てきましたfanout
)、queueA を exchangeA に、queueB を exchangeB にバインドし、queueA に TTL を設定し、その DLX を exchangeB に設定します。管理ページで何が起こっているかを観察すると、予想どおり、メッセージが queueA で 5 秒間費やされた後、上記のより複雑なコードのようにメッセージが消えます。