メッセージの信頼性のRabbitMQ

1、輸入シーン

我々はすべて知っているように、ウサギMQはErlangで書かれた言語、AMQPベースのメッセージングミドルウェア・プロトコルです。だからメッセージ伝送の信頼性が重要である、この時点で、我々は全体のワークフローラビットMQを見て:
ここに画像を挿入説明
図の上から、あなたは簡単にメッセージがプロデューサが送信されていることを知ることができ、ブローカー(チャネルを流れます- >スイッチ- >キュー)は、次いで、消費者支出は、完全なメッセージフロープロセスである、完了する。このプロセスは、信頼性の高いメッセージ送信の問題は、すべての後に、物事は決してよくは絶対的ではない、ではない、それが表示されますが、魔法は道路の尾根を行く、ウサギMQはすでにここ表情だ、これらの信頼性のない問題に対応する戦略を開発しますメッセージ送信の過程で信頼できないどのような問題は、それを持っています。

1.1、生産者のメッセージ損失の問題

生産者は、そのようなので、このようなネットワークパケット損失などのネットワークの問題、の、メッセージを送信するときのように、ネットワーク障害が損失の消失につながりました。

1.2、ラビットMQメッセージングサーバーの損失の問題:
  • ラビットMQサーバーの再起動?
  • 一つのサービスノードは、クラスタモードダウンしていますか?
1.3、メッセージが失われた消費者問題です:

消費者はメッセージ処理が完了していない、そこにダウンしていたが、今回ラビットMQサーバはこのメッセージを消費していると考えている、メッセージを取得し、我々は、消費者のメッセージの問題が失われる発生します。

2、ウサギMQメッセージの信頼性

2.1、生産者のメッセージの問題が失われたを解決するために
2.1.1、取引メカニズム

ウサギのMQメッセージングは​​、メッセージを送信する前に(channel.txSelect())総務を開いて、トランザクション・メカニズムを提供し、メッセージの送信を開始し、正常に送信場合は故障や異常、ウサギのMQのトランザクションは、ロールバックする場合は、メッセージが送信されますこれは、メッセージが失われないようにすることができますが、直接、トランザクション(channel.txCommit)をコミット。

しかし、それは同期動作であるため、メーカーは閉塞を終了することがあります欠点取引メカニズムが応答ラビットMQの受領後、生産者がメッセージを送信し続けることができるまで、それは、メッセージの送信に失敗しました、これは農産物メッセージのスループットに生産を引き起こします量とパフォーマンスは、多くのことを低減することができます。

2.1.2、送信確認機構(確認モード)

メッセージキューのマッチングを締結した後、モードを確認し、すべての着信チャネルメッセージは、固有のIDが割り当てられます、RabbitMQのユニークIDは、メーカーは、メッセージが正しくされている知っているプロデューサーやフラグに確認メッセージが送信されます宛先キュー; RabbitMQのメッセージが確認メッセージがあなたに送信されない場合には処理されません、あなたはリトライ動作を行うことができます。また、これは、メッセージが失われないことを保証します。

確認方法が3つあります。

  • シリアルモード
  • バッチモード確認
  • コールバックメソッドを提供し、ブローカ確認バックプロデューサメソッドの最後にメッセージ又はコールの複数:非同期モードを確認します。
2.2アドレスラビットMQメッセージング・サーバーの損失の問題:
2.2.1、ウサギMQサーバーの再起動

通常の状況下では、メッセージは、サーバーが再起動されると、メモリが迷子にメッセージはありませんが、メモリに格納されます。作るのメッセージが失われないし、サーバーが再起動された場合でも、場所の保存に対応するメッセージを見つけるnext'llので、メッセージが失われないようにすることを一つの場所に保存されたメッセージを、持っています。メッセージの永続性と呼ばれるプロセスダウンメッセージを保存します。メッセージは間のキューに格納されているためではないキューは、確かに何のニュースは存在しません場合、そのメッセージは、持続性を保存されていることを確認するように、永続的な、キューする必要があります。もちろん、スイッチは、これは必要に応じて選択し、永続性のために選択することができます。

キューの持続性:

    /**
     * 设置持久化队列
     *
     * @return 返回队列
     */
    @Bean
    public Queue durableQueue() {
        //第一个参数是名字,第二个参数是代表是否持久化
        return new Queue(IMMEDIATE_QUEUE, true);
    }

消息的持久化

       //消息持久化
        Message message = MessageBuilder.withBody("消失持久化".getBytes()).build();
        message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
2.2.2、サービスはノードクラスタモードダウンしています

クラスタモード、ノードサーバのダウンタイムの場合、それはそのようなA状況の、顔、すべてのメッセージ・ノードが一時的に利用できないことを意味し、正面を同期するバックアップサーバ、バックアップサーバが考えられますすべてのメッセージサーバは、そのノードがダウンした後、スタンバイ・ノード上のサーバーはすぐに接続することを、これは交通麻痺の問題を解決します。呼ばれるウサギMQサーバこのようなクラスターパターンミラークラスタモード、少なくとも3つのノード、二つのノードとディスクメモリノードを使用して、ミラーモード。次のように図の構成は次のとおりです。
ここに画像を挿入説明
戦略は、クラスタをミラー:

  • すべてのノードを同期
  • N個のノードを持つアップ
  • 唯一のノード同期は、指定された名前を満たすために
2.3、メッセージは解決の消費者問題のために失われます。

消費者情報の損失の問題は、メッセージ処理は、メッセージが自動的に結果を確認するためのRabbitMQサーバーに戻され、これが完了し、消費者本物の結果を受信しないRabbitMQのサーバーにつながっている、完全であるかどうか、メッセージを得ることに消費者であります消費者は完成されたメッセージの処理を待たずに、自動的に設定を確認するために使用されているので、これは、後に限り、消費者が取得するよう確認メッセージが自動的にRabbitMQのサーバーに結果を返します:メッセージが消費確認されています。

そのため、消費者だけに必要な手動設定を自動的に構成し確認確認、それはあなたがメッセージ処理を待つ必要があるたびに完了したことを、消費者が問題を解決するために、手動で消費者がダウン途中であれば、バックRabbitMQのサーバに結果を確認するために、そのRabbitMQのサーバは、前方にこのエントリはマッチした他の消費者へのメッセージは、これは失わ消えるの問題を解決するだろうし、RabbitMQのサーバが返すに確認メッセージを与えることはありません。

このような侵害として、ご連絡ください、李は削除されました!

私は、あなたが公共のJAVAERS番号に集中する歓迎あなたが一緒に詩や遠方のJAVAの道路を共有し、一緒に成長し、一緒に学ぶ同行します。これでは、公共の数字は、この世界のJAVAの友人です、国民は乾燥した表面で、毎日数-技術記事を持っているだけでなく、そのような春の戦闘、SpringBoot実用的な、高性能のMySQL、JVMの深い理解、RabbitMQの戦闘など電子書籍の先進的なアーキテクチャになります、Redisのデザインと高品質の本の数の実装など、あなたがああいいえ世間の注目を受け取ることができます。
ここに画像を挿入説明

公開された10元の記事 ウォン称賛74 ビュー4373

おすすめ

転載: blog.csdn.net/qq_36526036/article/details/105083762