目次
環境構成
リクエスト確認メカニズム
メッセージを送信した直後にブローカーを閉じます。後者はネットワークをシャットダウンしますが、ブローカーが閉じられた後です。 、コンソールは常にエラーを報告し、メッセージを送信します。また、500 エラーも報告します。
に格納されるように消費監視用のキューを変更します。
application.yml ファイルを変更します
ホームページ Java &#&チュートリアル SpringBoot+RabbitMQ を使用して信頼性の高いメッセージ送信を実現する方法

SpringBoot+RabbitMQ を使用して信頼性の高いメッセージ送信を実現する方法

May 29, 2023 pm 10:34 PM
springboot rabbitmq

    環境構成

    SpringBoot Integration RabbitMQ はメッセージの送信を実現します。

    1. maven 依存関係を追加します

           <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-amqp</artifactId>
            </dependency>
    ログイン後にコピー

    2. application.yml 設定ファイルを追加します

    spring:
      rabbitmq:
        host: 192.168.3.19
        port: 5672
        username: admin
        password: xxxx
    ログイン後にコピー

    3. スイッチ、キュー、バインディングを設定します

        @Bean
        public DirectExchange myExchange() {
            DirectExchange directExchange = new DirectExchange("myExchange");
            return directExchange;
        }
    
        @Bean
        public Queue myQueue() {
            Queue queue = new Queue("myQueue");
            return queue;
        }
    
        @Bean
        public Binding binding() {
            return BindingBuilder.bind(myQueue()).to(myExchange()).with("myRoutingKey");
        }
    ログイン後にコピー

    4. プロダクションはメッセージを送信します

        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @GetMapping("/send")
        public String send(String message) {
            rabbitTemplate.convertAndSend("myExchange","myRoutingKey",message);
            System.out.println("【发送消息】" + message)
            return "【send message】" + message;
        }
    ログイン後にコピー

    5. コンシューマはメッセージを受信します

        @RabbitListener(queuesToDeclare = @Queue("myQueue"))
        public void process(String msg, Channel channel, Message message) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = new Date();
            String time = sdf.format(date);
            System.out.println("【接收信息】" + msg + " 当前时间" + time);
    ログイン後にコピー

    6. プロダクション側を呼び出してメッセージを送信します hello、コンソール出力:

    #[メッセージ送信] hello

    [メッセージ受信] hello 現在時刻 2022-05-12 10:21:14

    メッセージが正常に受信されたことを示します。

    メッセージ損失分析

    SpringBoot+RabbitMQ を使用して信頼性の高いメッセージ送信を実現する方法

    メッセージの生成から消費まで、次の段階でメッセージ損失が発生する可能性があります:

      #プロダクション側で失われた: プロデューサーは
    • RabbitMQ

    • ストレージ側で失われた:
    • RabbitMQ

      ストレージ自体はdown

      #消費者側で紛失: ネットワークの問題により、ストレージを消費者側に送信できないか、消費がハングして通常の消費を送信できません
    • RabbitMQ
    プロダクション側、ストレージ側、コンシューマー側からの信頼性の高い送信を適切にサポートします。

    実稼働フェーズ

    実稼働フェーズでは、

    リクエスト確認メカニズム

    を使用して、メッセージの信頼性の高い送信を保証します。 RabbitMQ サーバーにメッセージを送信した後、RabbitMQ はメッセージを受信し、RabbitMQ サーバーがメッセージを正常に受信したことを示す要求確認を送信者に返します。

    Configuration application.yml

    spring:
      rabbitmq:
        # 消息确认机制 生产者 -> 交换机
        publisher-confirms: true
        # 消息返回机制  交换机 -> 队列
        publisher-returns: true
    ログイン後にコピー

    Configuration

    @Configuration
    @Slf4j
    public class RabbitConfig {
    
        @Autowired
        private ConnectionFactory connectionFactory;
    
        @Bean
        public RabbitTemplate rabbitTemplate() {
            RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
            rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
                @Override
                public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                    log.info("【correlationData】:" + correlationData);
                    log.info("【ack】" + ack);
                    log.info("【cause】" + cause);
                    if (ack) {
                        log.info("【发送成功】");
                    } else {
                        log.info("【发送失败】correlationData:" + correlationData + " cause:" + cause);
                    }
                }
            });
            rabbitTemplate.setMandatory(true);
            rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
                @Override
                public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
                    log.warn("【消息发送失败】");
                    log.info("【message】" + message);
                    log.info("【replyCode】" + replyCode);
                }
            });
    
            return rabbitTemplate;
        }
    }
    ログイン後にコピー

    Producer

    から

    switch へのメッセージ、confirmCallback# があります## モードを確認します。メッセージが正常に送信された後、メッセージはメソッド confirm(CorrelationData correlationData, boolean ack, String Cause) を呼び出し、ack に基づいてメッセージが正常に送信されたかどうかを判断します。 switch から queue へのメッセージには

    returnCallback

    リターン モードがあります。 メッセージの送信 製品メッセージ コンソール出力は次のとおりです:

    [メッセージの送信]製品メッセージ

    [メッセージの受信]製品メッセージ 現在時刻 2022 -05 -12 11:27:56[correlationData]:null[ack]true

    [cause]null
    [送信成功]



    生産終了シミュレーション メッセージが失われます

    ここには 2 つの解決策があります:

    メッセージを送信した直後にブローカーを閉じます。後者はネットワークをシャットダウンしますが、ブローカーが閉じられた後です。 、コンソールは常にエラーを報告し、メッセージを送信します。また、500 エラーも報告します。

      存在しないスイッチを送信:
    • // myExchange 修改成 myExchangexxxxx
      rabbitTemplate.convertAndSend("myExchangexxxxx","myRoutingKey",message);
      ログイン後にコピー
    • 結果:
    • [correlationData]:null
    • 【ack】false
    【原因】チャネル エラー; プロトコル メソッド: #method(reply-code=404, Reply-text=NOT_FOUND - 仮想ホスト '/' に交換 'myExchangexxxxx' がありません、クラス ID =60、method-id=40)

    [送信に失敗しました]

    送信が失敗した場合は、メッセージを再試行できます

    スイッチは正しく、キューは送信に失敗しました。存在しないというメッセージが送信されます:

    スイッチはメッセージを受信し、成功通知を返します。コンソール出力:

    [correlationData]:CorrelationData [id=7d468b47-b422-4523-b2a2] -06b14aef073c]

    [ack ]true

    [cause]null

    [送信成功]

    スイッチはキューを見つけられず、障害情報を返しました:


    [メッセージの送信に失敗しました]

    [メッセージ]製品メッセージ
    [返信コード]312

    RabbitMQ


    キューの永続性を有効にし、キューとスイッチを作成します
    デフォルト設定は永続性です

    。まず、キューとスイッチを正しく設定し、
    メッセージがキュー

    に格納されるように消費監視用のキューを変更します。

    キューの永続性を非永続性に変更します:

        @Bean
        public Queue myQueue() {
            Queue queue = new Queue("myQueue",false);
            return queue;
        }
    ログイン後にコピー
    メッセージの送信後、メッセージはキューに保存され、メッセージの RabbitMQ が再起動されます。もはや存在しない。

    キューの永続性を設定する:

        @Bean
        public Queue myQueue() {
            Queue queue = new Queue("myQueue",true);
            return queue;
        }
    ログイン後にコピー

    再起動後も、キュー内のメッセージはまだ存在します。

    コンシューマ エンド
    コンシューマ エンドはデフォルトで開始されます

    ack

    自動確認モードキュー メッセージがコンシューマによって受信されると、メッセージは関係なくキューから自動的に削除されます消費者側からのメッセージがあるかどうかのニュース。したがって、コンシューマーがメッセージを正常に消費できることを確認するには、自動モードを手動確認モードに変更します。

    application.yml ファイルを変更します

    spring:
      rabbitmq:
        # 手动消息确认
        listener:
          simple:
            acknowledge-mode: manual
    ログイン後にコピー

    メッセージを消費して受信した後、手動による確認が必要です: <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);</pre><div class="contentsignin">ログイン後にコピー</div></div><div class="contentsignin">ログイン後にコピー</div></div><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'> @RabbitListener(queuesToDeclare = @Queue(&quot;myQueue&quot;)) public void process(String msg, Channel channel, Message message) { SimpleDateFormat sdf = new SimpleDateFormat(&quot;yyyy-MM-dd HH:mm:ss&quot;); Date date = new Date(); String time = sdf.format(date); System.out.println(&quot;【接收信息】&quot; + msg + &quot; 当前时间&quot; + time); System.out.println(message.getMessageProperties().getDeliveryTag()); try { channel.basicAck(message.getMessageProperties().getDeliveryTag(),false); } catch (IOException e) { e.printStackTrace(); } }</pre><div class="contentsignin">ログイン後にコピー</div></div>追加しない場合:

    channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
    ログイン後にコピー
    ログイン後にコピー

    2 つのメッセージを送信します

    メッセージを受信した後、確認は行われず、キューに戻されます:

    プロジェクトを再起動します。その後、キュー内のメッセージはコンシューマに送信されますが、ACK 確認がなければ、キューに戻され続けます。 。

    channel.basicAck を追加した後、プロジェクトを再起動します

    SpringBoot+RabbitMQ を使用して信頼性の高いメッセージ送信を実現する方法

    キュー メッセージは削除されます

    basicAck メソッド multiple の最後のパラメータは、前のキューを削除することを意味します。

    multipletrue に設定され、後続のキューはすべてクリアされます

    SpringBoot+RabbitMQ を使用して信頼性の高いメッセージ送信を実現する方法

    以上がSpringBoot+RabbitMQ を使用して信頼性の高いメッセージ送信を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    RabbitMQ を使用して PHP で分散メッセージ処理を実装する方法 RabbitMQ を使用して PHP で分散メッセージ処理を実装する方法 Jul 18, 2023 am 11:00 AM

    RabbitMQ を使用して PHP で分散メッセージ処理を実装する方法 はじめに: 大規模なアプリケーション開発では、分散システムが一般的な要件になっています。分散メッセージ処理は、タスクを複数の処理ノードに分散することでシステムの効率と信頼性を向上させるパターンです。 RabbitMQ は、AMQP プロトコルを使用してメッセージの配信と処理を実装する、オープンソースの信頼性の高いメッセージ キュー システムです。この記事では、配布のために PHP で RabbitMQ を使用する方法について説明します。

    React と RabbitMQ を使用して信頼性の高いメッセージング アプリを構築する方法 React と RabbitMQ を使用して信頼性の高いメッセージング アプリを構築する方法 Sep 28, 2023 pm 08:24 PM

    React と RabbitMQ を使用して信頼性の高いメッセージング アプリケーションを構築する方法 はじめに: 最新のアプリケーションは、リアルタイム更新やデータ同期などの機能を実現するために、信頼性の高いメッセージングをサポートする必要があります。 React はユーザー インターフェイスを構築するための人気のある JavaScript ライブラリであり、RabbitMQ は信頼性の高いメッセージング ミドルウェアです。この記事では、React と RabbitMQ を組み合わせて信頼性の高いメッセージング アプリケーションを構築する方法を紹介し、具体的なコード例を示します。 RabbitMQ の概要:

    SpringBootとSpringMVCの比較と差異分析 SpringBootとSpringMVCの比較と差異分析 Dec 29, 2023 am 11:02 AM

    SpringBoot と SpringMVC はどちらも Java 開発で一般的に使用されるフレームワークですが、それらの間には明らかな違いがいくつかあります。この記事では、これら 2 つのフレームワークの機能と使用法を調べ、その違いを比較します。まず、SpringBoot について学びましょう。 SpringBoot は、Spring フレームワークに基づいたアプリケーションの作成と展開を簡素化するために、Pivo​​tal チームによって開発されました。スタンドアロンの実行可能ファイルを構築するための高速かつ軽量な方法を提供します。

    Go での RabbitMQ の使用: 完全ガイド Go での RabbitMQ の使用: 完全ガイド Jun 19, 2023 am 08:10 AM

    最新のアプリケーションが複雑になるにつれて、メッセージングは​​強力なツールになっています。この分野では、RabbitMQ は、異なるアプリケーション間でメッセージを配信するために使用できるメッセージ ブローカーとして非常に人気があります。この記事では、Go 言語で RabbitMQ を使用する方法を説明します。このガイドでは以下の内容について説明します: RabbitMQ の概要 RabbitMQ のインストール RabbitMQ の基本概念 Go で RabbitMQ を使用する入門 RabbitMQ と Go

    SpringBoot+Dubbo+Nacos開発実践チュートリアル SpringBoot+Dubbo+Nacos開発実践チュートリアル Aug 15, 2023 pm 04:49 PM

    この記事では、dubbo+nacos+Spring Boot の実際の開発について詳しく説明する例を書きます。この記事では理論的な知識はあまり取り上げませんが、dubbo を nacos と統合して開発環境を迅速に構築する方法を説明する最も簡単な例を書きます。

    go-zeroとRabbitMQの応用実践 go-zeroとRabbitMQの応用実践 Jun 23, 2023 pm 12:54 PM

    現在、マイクロサービス アーキテクチャ モデルを採用する企業が増えており、このアーキテクチャではメッセージ キューが重要な通信手段となっており、その中でも RabbitMQ が広く使用されています。 Go 言語では、go-zero は近年登場したフレームワークであり、開発者がメッセージ キューをより簡単に使用できるようにするための実用的なツールやメソッドが数多く提供されています。以下では、実際のアプリケーションに基づいて go-zero を紹介します。とRabbitMQの応用実践。 1.RabbitMQ の概要Rabbit

    Golang と RabbitMQ 間のリアルタイム データ同期のためのソリューション Golang と RabbitMQ 間のリアルタイム データ同期のためのソリューション Sep 27, 2023 pm 10:41 PM

    Golang と RabbitMQ 間のリアルタイム データ同期ソリューションの紹介: 今日の時代では、インターネットの普及とデータ量の爆発的な増加に伴い、リアルタイム データ同期の重要性がますます高まっています。非同期データ送信とデータ同期の問題を解決するために、多くの企業はメッセージ キューを使用してデータのリアルタイム同期を実現し始めています。この記事では、Golang と RabbitMQ に基づくリアルタイム データ同期ソリューションを紹介し、具体的なコード例を示します。 1. RabbitMQ とは何ですか?ラビ

    Golang RabbitMQ: 高可用性メッセージ キュー システムのアーキテクチャ設計と実装 Golang RabbitMQ: 高可用性メッセージ キュー システムのアーキテクチャ設計と実装 Sep 28, 2023 am 08:18 AM

    GolangRabbitMQ: 高可用性メッセージ キュー システムのアーキテクチャ設計と実装には、特定のコード サンプルが必要です はじめに: インターネット技術の継続的な開発とその広範な応用により、メッセージ キューは現代のソフトウェア システムに不可欠な部分になりました。メッセージ キューは、デカップリング、非同期通信、フォールト トレラント処理、その他の機能を実装するツールとして、分散システムに高可用性とスケーラビリティのサポートを提供します。 Golang は効率的で簡潔なプログラミング言語として、同時実行性とパフォーマンスの高いシステムを構築するために広く使用されています。

    See all articles