MQ アドバンスト TTL

画像の説明を追加してください
個人の名刺:

ブロガー:酔っ払い。
個人プロフィール:ワインを満喫し、ワインのエネルギーで未来のために戦いましょう。
この記事は感動的です三人で旅行するときは、私たちが先生にならなければなりません。

画像の説明を追加してください
このプロジェクトは、ステーション Bのダークホース プログラマーである SpringCloud+RabbitMQ+Docker+Redis+search+distributed による Java「SpringCloud Microservice Technology Stack」に基づいています。

[SpringCloud+RabbitMQ+Docker+Redis+search+分散・詳細システム解説 springcloud マイクロサービス技術スタックコース | ダークホースプログラマー Java マイクロサービス]クリックして視聴

3. デッドレタースイッチ

2.TTL

キュー内のメッセージがタイムアウトして消費されない場合、そのメッセージはデッドレターになります。タイムアウトには 2 つの状況があります。

  • メッセージが配置されているキューにはタイムアウトが設定されています
  • メッセージ自体にはタイムアウトが設定されています
  1. タイムアウトしたデッドレターを受信するデッドレタースイッチ

コンシューマ サービスの SpringRabbitListener で、新しいコンシューマを定義し、デッド レター交換とデッド レター キューを宣言します。

@RabbitListener(bindings = @QueueBinding(
        value = @Queue(name = "dl.queue", durable = "true"),
        exchange = @Exchange(name = "dl.direct", durable = "true", autoDelete = "false"),
        key = "dl"
))
public void listenDlQueue(String msg) {
    
    
    log.info("接收到dl.queue死信消息:{}", msg);
}
  1. キューを宣言してTTLを指定する

ttl キューのタイムアウトを設定するには、ttl キューを宣言するときに x-message-ttl (タイムアウト) 属性を設定する必要があります。同時にデッドレタースイッチをバインドします。そして、ttl スイッチが ttl キューにバインドされていることを宣言します。

只有在队列设置了死信交换机和死信路由键时,消息才会进入死信交换机。如果队列没有设置死信交换机或死信路由键,消息将会被直接丢弃。

@Bean
public Queue ttlQueue() {
    
    
    return QueueBuilder
            .durable("ttl.queue")
            .ttl(10000)
            .deadLetterExchange("dl.direct")
            .build();
}

@Bean
public DirectExchange ttlExchange(){
    
    
    return new DirectExchange("ttl.direct");
}

@Bean
public Binding ttlBinding(){
    
    
    return BindingBuilder.bind(ttlQueue()).to(ttlExchange()).with("ttl");
}

メッセージを送信しますが、TTL は指定しません。

@Test
public void testTtl() {
    
    
    CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
    rabbitTemplate.convertAndSend("ttl.direct","ttl", "hello, ttl", correlationData);
    log.info("消息发送成功:hell ttl");
}

送信メッセージのログ:

ここに画像の説明を挿入します

受信メッセージのログを確認します。
ここに画像の説明を挿入します

キューの TTL 値は 10000ms、つまり 10 秒であるためです。メッセージの送信と受信の時間差がちょうど 10 秒であることがわかります。

  1. メッセージ送信時にTTLを設定する

メッセージを送信するときに、TTL を指定してメッセージの有効期間を設定することもできます。

@Test
public void testTtl() {
    
    
    //创建消息,并设置过期时间
    Message message = MessageBuilder
            .withBody("hello, ttl".getBytes(StandardCharsets.UTF_8))
            .setExpiration("5000")
            .build();
    CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
    rabbitTemplate.convertAndSend("ttl.direct","ttl", message, correlationData);
    log.info("消息发送成功:hell ttl");
}

送信されたメッセージのログを確認します。
ここに画像の説明を挿入します

メッセージログの受信:
ここに画像の説明を挿入します

今回は、送信と受信の間の遅延はわずか 5 秒です。キューとメッセージの両方に TTL が設定されている場合、期限切れになったメッセージはデッドレターになることに注意してください。

要約する

メッセージのタイムアウトには 2 つの方法がありますか?

  • キューの ttl 属性を設定します。キューに入った後に ttl 時間を超えたメッセージはデッド レターになります。
  • メッセージの ttl 属性を設定します。キューがメッセージを受信して​​ ttl 時間を超えると、メッセージはデッド レターになります。

消費者がメッセージを受信する 20 秒前にメッセージを送信するにはどうすればよいでしょうか?

  • メッセージの宛先キューのデッドレター スイッチを指定します。
  • コンシューマがリッスンするキューをデッドレター交換にバインドします
  • メッセージ送信時のメッセージまたはキューのタイムアウトを 20 秒に設定します。

おすすめ

転載: blog.csdn.net/m0_65144570/article/details/133150868