原則:
/ **
(1)は、メッセージ、注文を送信するように、ビジネスロジックのオブジェクトを通常のキューQ1を作成し、E1と、それぞれBingkey1ためのキーバインディングに対応するスイッチ
(2)遅延メッセージキューQ2を作成し、キュー遅延時間をスイッチに対応する、10秒に設定され、キーがE2とBingkey2結合している;およびキューを作成し、キュー・タイムアウト設定()時刻(b)は、ジャンプの後にタイムアウトをルーティングし、E1がタイムアウトジャンプキューQ1後Bingkey1、すなわち結合
(3)最初のタイムアウトのキューQ2、キュー待ちに送信されるメッセージ、実行ロジック
*主なテスト不能キュー、遅延消費の主な機能は、原則的には、最初のメッセージは、通常のキューに送信され、
*時間が自動的に配信不能キューのメッセージを消費する消費者が、その後不能キューに送信され、到達した通常のキューのタイムアウトがあります。* /
遅延キューのシナリオ
1、未支付订单定时取消
2、定时清理缓存对象、空闲连接等
3、下单成功后30分钟内,按不同时间间隔发送通知等(1min、3min、10min发一次)
1、有効期限キューを設定します
$this->channel->queue_declare(
$this->retry_queue(),
false,
true,
false, false, false, new AMQPTable( [ # 不设置x-dead-letter-routing-key,使用原先的routing_key,10s过期后自动重回原先的队列里面,那x-dead-letter-exchange交换机就需绑定原先队列 'x-dead-letter-exchange' => $this->retry_exchange(), # 10s 'x-message-ttl' => 10000, ] ) );
すべてのメッセージがキュー(NO TTL)にプッシュされ、指定されたキューに指定されたExchangeに、オリジナルrouting_keyによれば、10秒後に失効し、さらに進むであろう。
図2に示すように、メッセージの有効期限を設定します
$message = new AMQPMessage(
'msg',
array(
# 消息持久化
'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSITENT, # ttl过期时间 'expiration' => 50000, ) );
各メッセージは、メッセージには有効期限後に無効になり、同じ時間を有効期限が切れるように設定されています。
3、およびキューの有効期限を設定し、メッセージ
両方の場合、メッセージの有効期限は、10秒に設定されているキュー「X-メッセージTTL」と、小さい方の値に依存することが、メッセージ「有効期限が50年代に設定され、メッセージは10秒後に失敗します。
図4に示すように、その後の
TTLキューが単独の提供、あるいは単に同じメッセージの有効期限を設定し、デッドレターキューは、通常の条件下で動作可能です。しかし、異なるメッセージの有効期限を設定し、それが適切不能キューアップ動作しない場合があります。
何のTTLをキューません
$this->channel->queue_declare(
$this->retry_queue(),
false,
true,
false, false, false, new AMQPTable( [ # 不设置x-dead-letter-routing-key,使用原先的routing_key,10s过期后自动重回原先的队列里面,那x-dead-letter-exchange交换机就需绑定原先队列 'x-dead-letter-exchange' => $this->retry_exchange(), ] ) );
最初のメッセージが設定されている500Sは、転送キューを押して、有効期限が切れ
最初のメッセージが設定されている500Sは、転送キューを押して、有効期限が切れ
$message = new AMQPMessage(
'msg',
array(
# 消息持久化
'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSITENT, # ttl过期时间 'expiration' => 500000, ) );
2番目のメッセージは5Sがキューを進め後に期限切れに提供されます
$message = new AMQPMessage(
'msg',
array(
# 消息持久化
'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSITENT, # ttl过期时间 'expiration' => 5000, ) );
結果は5秒後に、2つのキューメッセージがあることを示しました。説明2番目のメッセージは、「本当に期限切れ」ではありませんでした その理由は、有効期限が切れていないキューメッセージの先頭にあります。そして、RabbitMQの不能キューは、メッセージヘッダに基づいて実装されています。
5.結論
ときに最初のメッセージキューMQチェックし、それが満了していない、それは確認メッセージの後に続行されません発見しました。メッセージの有効期限が切れた後でも、キューの先頭とは、MQキューの特性によって決定された別のキューに転送することはできませんしませんので。あなたは、メッセージキューの途中で消費を行くことができない、キューはFIFOなければなりません。
すべてのメッセージが期限切れになるので、キューを設定すると、TTL方式属性については、メッセージの有効期限が切れていると、メッセージの有効期限が切れた場合でも、キューから消去メッセージ・ヘッダー・プロパティを提供します、すぐに、キューから消去されていません決定前に、消費者への配信に、なぜ一致治療を得ることはありませんか?第一の方法以来、メッセージキューがあれば、各メッセージの第二の方法中、異なる有効期限、期限切れメッセージをスキャンするために最初から限り、定期的に最初のチームとして、キューのRabbitMQの頭確かに有効期限が切れましたすべての期限切れのメッセージを削除するには、キュー全体をスキャンするためにバインドされているので、より良いので、このニュースは有効期限が切れた後、消費の時間かどうかを判断する、有効期限が切れた場合、それを削除しようとしています。
公式の物語
"Only when expired messages reach the head of a queue will they actually be discarded (or dead-lettered)." 只有当过期的消息到了队列的顶端(队首),才会被真正的丢弃或者进入死信队列。