ゴーRabbitMQの不能メッセージキュー(II)

原則:

   / **

 (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)." 只有当过期的消息到了队列的顶端(队首),才会被真正的丢弃或者进入死信队列。

 

 

 

おすすめ

転載: www.cnblogs.com/fengchuiyizh/p/12297830.html