RabbitMQの一般的な面接の質問

1、RabbitMQの利点は何ですか?
1.デカップリング、コードシステムC、Dに直接コードを呼び出し、システムAとシステムB将来のアクセスシステムは、システムがあまりにも面倒、コードAを変更する必要がある場合!

2.非同期、メッセージキューにメッセージを書き込み、非必須のビジネス・ロジックは、レスポンスを高速化するために、非同期で動作します

3.クリッピング、時間の同時量は、データベースに対するすべての要求を直接接続障害データベースで、その結果、嫌い

 

2、RabbitMQのはブローカーにそれが何を意味するのでしょうか?それが意味クラスタ?
これは、ブローカーまたは複数の論理グルーピングアーランノード、およびRabbitMQのノードで実行されるアプリケーションを指します。ブローカクラスタは、共有メタデータノード間の制約の増加に基づいています。

 

図3に示すように、チャネル内のRabbitMQ概念は、交換キューは論理的な概念、または対応する処理エンティティでありますか?役割は各プレイは何ですか?
キューは、独自のErlangプロセスを有し、内部交換関係を結合格納されたルックアップテーブルとして実装;メッセージがキューに配信routing_keyに従って責任があるチャネルルーティングエンティティ実際の作業、。、仮想接続の実際のTCP接続をチャネル説明でAMQPプロトコルは、すべてのAMQPのコマンドは、チャネルを介して送信され、各チャンネルは固有のIDを持っています。チャネルは、単一のOSスレッドを使用することができ、それは特定のチャネル上のメッセージに配信されるためです。しかし、オペレーティング・システム上のスレッドは、複数のチャネルを可能にします。

 
4.それをバーチャルホストは何?役割とは何ですか?
バーチャルホストは、仮想ブローカー、すなわちミニのRabbitMQサーバーとして理解することができます。インサイドなど別々のキュー、交換と結合し、含まれていますが、最も重要なことは、独立した機関システムは、ユーザーがコントロールのバーチャルホストの範囲に行うことができるということです。もちろん、RabbitMQの、異なる権限を分離する手段としてのバーチャルホストのグローバルな視点から(典型的な例は、異なるアプリケーションが異なる仮想ホストで実行可能です)。

 
5、何に基づいてメッセージ送信?
TCP接続の大規模、およびシステムリソースによって制限され、同時の数の創造と破壊のオーバーヘッドので、パフォーマンスのボトルネックが発生します。送信データに使用RabbitMQのウェイチャンネル。チャンネルの仮想接続は、実際のTCPコネクションに設立され、TCPコネクションごとのチャネルの数が限定されるものではありません。

 
6、どのようにメッセージを配布するには?
キューは、少なくとも一つの消費者のサブスクリプションを持っている場合は、メッセージが消費者にサイクル(ラウンドロビン)形式で送信されます。各メッセージは、(消費者が適切にメッセージの確認を処理できることを条件とする)、消費者のサブスクリプションに分配されます。

 
7、どのようにメッセージをルーティングしますか?
スイッチ、結合ルーティング:概念的には、メッセージのルーティングは、3つの部分を持っている必要があります。生産者は、メッセージスイッチに公開;最終メッセージ・キュー、および消費者受け取り、経路に特定のキューにメッセージがどのようにルータからの結合が決定します。

ニュースリリーススイッチに、メッセージがルーティングキー(ルーティングキー)を持つことになりますと、メッセージの作成に設定してください。
キューを介して鍵をルーティング、キューは交換体に結合することができます。
メッセージは、RabbitMQの意志経路(異なるルーティングスイッチのための異なるルール)キーおよびキー一致ルーティングメッセージキュースイッチに到着した後。パターンはキューに一致した場合、メッセージは、それぞれのキューに配信されます。任意のキューに一致しない場合、メッセージは「ブラックホール」と入力します。します
一般的な交換器は、3種類についてに分かれています。

ルーティングキーが完全に一致する、メッセージを適切なキューに配信されている場合:直接
ファンアウト:スイッチがメッセージを受信した場合、それがバインドされているすべてのキューにブロードキャストする
トピック:異なるソースからのメッセージが同じキューに到達させることができます。トピック交換器を使用する場合は、例えば、ワイルドカードを使用することができます。「*」、特定の場所に任意のテキストに一致するいくつかの部分に分け、ルーティングキー、「#」はすべてのルールに一致します。「」特別な注意:スイッチメッセージに送信されたトピックは、任意に設定した選択キー(routing_key)にすることはできません、それは、以下からなる一連の識別子によって離間されなければなりません。「」
 
8.メタデータとは何ですか?メタデータは、どのようなタイプに分かれていますか?何が含まれていますか?メタデータは、どのようなクラスタに関連付けられていますか?メタデータは、保存する方法ですか?それがどのように分配されるかのメタデータクラスタ?
非クラスタモードでは、メタデータは、バーチャルホストメタデータ、(テーブルルックアップの関係をルーティング格納された)結合メタデータ、メタデータキュー(キュー名と属性、等)、交換メタデータ(交換名、タイプおよび属性)に分割されています(最初の3つの名前空間の制約とセキュリティ属性の範囲セット内のバーチャルホスト)。クラスタモードでは、更なるクラスタノード関係情報と位置情報でノードを含みます。メタデータ決意は、RAMに記憶され、又はもRAMディスクに格納され、アーランノードのタイプに応じています。メタデータは、クラスタ内の全ノードに分配されます。
図において、図のメタデータの分布図は、単一ノードクラスタと二つのモードのキュー。
 
 

 

9、異なるであろうものの結合、並びに、システム、交換からなる単一ノードおよびマルチノードクラスタシステム内のステートメントキュー?
:;クラスタ上と宣言したキュー、クラスタにする必要があり、完全なノードの需要あなたは、単一ノード上のキューを宣言するときに限り、ノードに関連するメタデータが変更されているとして、あなたはQueue.Declare-OK応答を取得しますメタデータが正常に更新され、あなたはQueue.Declare-OK応答を取得します。また、ノードタイプは、RAMノード専用メモリに格納されたデータを変更しただけでなく、ディスク上に格納されたデータを変更する場合、ディスクノードの入力した場合。

不正メールデッドレターキュー交換&:DLXのフル(デッド・レター・交換)は、X-デッドレター交換のメッセージがどこ存在場合、メッセージが配信不能キューになったときに、不正メールスイッチを呼びパラメータは、それがスイッチX-デッドレター交換対応する値に送信され、スイッチは、それがデッド・レターと呼ばれるスイッチ、デッドレターキューは、バインドされた交換不能キューです。

 
10、どのように右のメッセージがRabbitMQのに送信されていることを確認するには?
メッセージが正しくのRabbitMQ送信されることを確実にするために、送信モードを使用してRabbitMQの確認。送信確認モード:チャンネル設定モード(送信確認モード)を確認するために、すべてのメッセージが掲載されているチャンネルは、固有のIDが割り当てられます。(永続メッセージがあってもよい)、メッセージが宛先キューに配信されると、メッセージがディスクに書き込まれた後、チャネルは、プロデューサ(一意のメッセージIDを含む)への肯定応答を送信します。内部エラーが原因RabbitMQのメッセージが失われた発生した場合は、NACKを送信する(認めない、認められていない)のメッセージ。送信確認パターンは、アプリケーションプロデューサー確認応答を待っている間に、メッセージを送信し続けることができ、非同期です。確認メッセージは、プロデューサアプリケーションを到着したとき、アプリケーションのコールバックメソッドのプロデューサは、確認メッセージを処理するようにトリガされます。

 

11、どのようにメッセージの受信者がニュースを消費していることを確認するには?
機構確認メッセージの受信者:消費者は、(メッセージ受信確認応答メッセージは、2つの異なる動作している)各メッセージが肯定応答されなければならない受け取ります。消費者は唯一のRabbitMQは、安全にメッセージをキューから削除することができ、ニュースを確認しました。ここでは消費者の割り込みを接続することで、メッセージを再送信する必要があることだけを確認するためにタイムアウトメカニズム、RabbitMQのを使用していませんでした。換言すれば、限り、接続が中断されないように、時間の消費者に十分な長さのRabbitMQは、メッセージを処理します。

以下のリストのいくつかの特別な状況:

消費者が切断または購読中止メッセージを受信した場合、RabbitMQのは確定する前にそのメッセージが配信されなかった、サブスクリプションの下で消費者に再配布さだと思います。(bizIdに応じて再する必要性、リスクのメッセージを繰り返し消費があるかもしれません)
消費者がメッセージの確認メッセージを受信していない場合、接続はRabbitMQのは、消費者がビジー状態であると思いますが、切断されていない、より多くの消費者に配布されることはありませんニュース。
12、どのようにメッセージが配信されるか、消費を繰り返し、繰り返しを避けるには?
ときにメッセージの生成、坪量等の冪等のプロデューサー内-MSG-IDの各送信のために生成された内部MQメッセージ(およびメッセージ配信の失敗を再送)、エンキュー重複メッセージを回避するために、メッセージ場合コンシューマメッセージ本文に必要な、同じメッセージを繰り返しているの消費を避けるためにbizId(など支払ID、注文ID、メッセージID、など、同じビジネスのグローバル一意)などの重複排除と消費電力の基礎、などを、持っている必要があります。

以下の点に答えるために、ビジネスシナリオの問題:

1.たとえば、データベースの挿入、このメッセージを得るのですか。これは、繰り返し消費が発生する状況は、それがデータベースがダーティデータを出現を避けるために、主キーの競合につながる場合でも、一意の主キーを作成するには、このメッセージを与えることは簡単だろう。

2.別の例を、あなたはニュースの操作はRedisのを設定し得るか、それはあなたが電源を操作し、他の操作を設定していた場合でも、結果は同じであるかどうかを複数回設定しているため簡単に、解決しないだろう。

3.二つの条件上記十分でない場合には、大きな動き。サードパーティ製のメディアを準備し、消費者の記録を行います。Redisの例では、メッセージに割り当てられたグローバルID限り、<ID、メッセージ>を介してメッセージコンシューマは、KVの形で書かのRedis。消費者はそれを費やして開始する前に、Redisのを可能一切消費レコードクエリはありません行きます。

 
失われたデータの問題を解決する方法13、?
1プロデューサー失われたデータ

メッセージが行う方法でMQ生産者に配信されていませんか?この観点からプロデューサーには、データを失った、RabbitMQのは、生産性を確保するために、確認のメッセージが失われていないトランザクションモデルを提供します。

それが送られた場合、言ってメッセージを送信する前に、開いているもの(channel.txSelect())での取引メカニズムは、その後、何も異常は送信時に発生した場合、物事は(channel.txRollbackを())ロールバックされますというメッセージを送信し、成功したものを提出(channel.txCommit())。

しかし、欠点は、スループットが低下することです。したがって、生産とブロガーの経験によると、ほとんどのモードを確認します。メッセージが一致するすべてのキューに配信されると確認チャネルモードに入ると、チャネル側のすべての公開されたメッセージは、一意のID(1から始まる)が付与され、(RabbitMQのプロデューサーへACKを送信しますメッセージは、メーカーがrabiitMQがメッセージを処理できませんでした場合は、メッセージが正しく送信先キューに到達している知っているユニークID)を、含まれている、あなたにNACKメッセージを送信するには、リトライ動作を行うことができます。

2.メッセージキュー失われたデータ

どこに失われたデータのメッセージキューの処理は、一般的に永続的なディスク上にあります。この構成では、生産者は、永続ディスク後にメッセージAck信号を送信し与えることができると一緒に使用永続化メカニズムを、確認することができます。永続ディスクの前にメッセージが、RabbitMQのは殺され、生産者がAck信号を受信できないようならばこのように、生産者は、再発行を自動的になります。

それでは、どのようここで、実際には、非常に簡単、ちょうど2つのステップ以下の方法によって、その永続的な

①、キューがtrueに永続的なアイデンティティ耐久性のあるセットで、耐久性のあるキューを表し

②、配信モード= 2にメッセージを送信するとき

このセットの後、RabbitMQのも、データを回復することができ、再起動後に、ハングアップ。メッセージは、ハードドライブに永続化されていない場合は、サービスは、ミラーリングキューされたキュー鏡を導入することで、この状況死んでいたかもしれないが、メッセージが(クラスタ全体がハングアップします)百パーセント失われない保証はありません

3.消費者の失われたデータ

この問題を解決することができ、手動確認モードを有効にします

①自動確認応答モードは、消費者ハング、ACKメッセージはキューに戻されます。プロセスが成功するまで、例外がスローされ、消費者は、メッセージは、再送信され続けます。キューに戻りますが、例外メッセージを再試行し続けるようになりますメッセージは、サービスがハングアップした場合でも、メッセージは失われない何も処理が完了していません。

消費者それに対処する機会が死ぬのであれば②手動確認モードは、繰り返し、他の消費者へのメッセージを確認応答応答を送信しない、ハンドルの例外、およびメッセージを繰り返すことになりますがない異常なキャプチャにリスナーが受信された場合、その後、例外が捕獲された場合は、ようやくにはACK、繰り返しメッセージ(再試行メカニズム)を送るだろう。彼は例外をスローしていません。

③モードを認めない、認める=「なし」として長い行列がすぐに削除、またはされ、メッセージの送信が完了すると、確認応答を使用しません、それは削除さ再送されない送信されるように、クライアントがいる限り、異常切断されているかどうか。

 

14、遅延や不能キューキュー使用
不能メッセージを:

メッセージは、(Basic.Reject又はBasic.Nack)を拒否し、再キューイングパラメータが配置されている偽の
メッセージの有効期限が切れて
キューの最大長は
、メッセージを期限切れ。

    このような配置の後に、第1の待ち行列の組によって本RabbitMQのに有効期限を設けたメッセージの2つだけの種類が、キュー内のメッセージのすべては、メッセージそれ自体の第二のセットと同じ有効期限に存在します、各メッセージの有効期限は同じではありません。あなたはこれらの2つの方法を使用している場合、それは小さな値その有効期限の対象となります。メッセージは、その有効期限に達したときに消費されていないので、ニュースが配信不能メッセージとなっています。

    キュー設定:キューはミリ秒単位で述べたXメッセージ-TTLパラメータを使用して

    メッセージはプロパティパラメータの有効期限のミリ秒の値である:単一のメッセージを設定します

キュー遅延:遅延キューは、RabbitMQのには存在しませんが、我々は、メッセージキューとデッドレターキューの有効期限が提供する遅延をシミュレートすることができます。消費者は不能キュー・モニター・スイッチ送られたキューのメッセージを聞くのではなく、結合します。

これらの基本から、私たちは、次の要件を満たしています。

需要:ユーザーは、システム内の順序を作成し、時間をかけてユーザーが支払っていない場合は、自動的に注文をキャンセルします。

分析:

        1、このような状況の上、我々は、どのようにキュー遅延を作成するには、達成するための遅延キューのために使用します。

        2、遅延は時代遅れのメッセージキューデッドレターキュー時間+によって引き起こされる可能性が

        図3は、キューによって達成X-メッセージのTTLパラメータを提供したメッセージを期限切れ

        記載キューによって4、デッドレターキューは、キューX-デッドレター交換パラメータに提供され、次いでさらなる結合宣言AキューX-デッドレター交換は、スイッチに対応します。

ConnectionFactoryの工場=新しいのConnectionFactory();
factory.setHost( "127.0.0.1");
factory.setPort(AMQP.PROTOCOL.PORT)。
factory.setUsername( "ゲスト");
factory.setPassword( "ゲスト");
接続の接続= factory.newConnection()。
チャネルチャネル= connection.createChannel()。

//声明一个接收被删除的消息的交换机和队列
文字列EXCHANGE_DEAD_NAME = "exchange.dead"。
文字列QUEUE_DEAD_NAME = "queue_dead"。
channel.exchangeDeclare(EXCHANGE_DEAD_NAME、BuiltinExchangeType.DIRECT)。
channel.queueDeclare(QUEUE_DEAD_NAME、偽、偽、偽、NULL);
channel.queueBind(QUEUE_DEAD_NAME、EXCHANGE_DEAD_NAME、 "routingkey.dead");

文字列EXCHANGE_NAME = "exchange.fanout"。
queue_nameの=文字列"queue_nameの";
channel.exchangeDeclare(EXCHANGE_NAME、BuiltinExchangeType.FANOUT);
地図<文字列、オブジェクト> =新しい新しい引数のHashMap <文字列、オブジェクト>();
//キュー統一セットの有効期限内のすべてのメッセージのため
の引数。 PUT(「X -メッセージ-TTL」、30000);
//セットキューにアクセスするために、消費者を超えていないどのように多くのミリ秒、キューが削除された時間
arguments.put(「Xは-有効期限」、20000);
//セット新しいキュー以上のN、オフ除去の前に、キューからのメッセージよりもあれば、N個のメッセージの、
arguments.put(「X-MAX-長」,. 4);
//設定キュースペースの最大含有量は閾値が削除され超え前のメッセージの
arguments.put( "X-MAX-長さバイト"、1024);
//指定されたプッシュスイッチにメッセージを削除し、通常、X-デッドレター交換およびX-デッドレター-routing-キー設定する必要が
arguments.put(「X-デッド・レター・交流」、「exchange.dead」);
//キールーティング対応する指定プッシュスイッチにメッセージを削除
arguments.putを( "X-デッドレタールーティングキー」、 "routingkey.dead");
//メッセージの優先順位は、優先順位が優先大きい消費で設定
arguments.put( "X-MAX優先度"、10);
channel.queueDeclare(falseに、falseに、falseにqueue_nameの、引数);
channel.queueBind(queue_nameの、EXCHANGE_NAME、 "");
文字列メッセージ= "こんにちはのRabbitMQ:";

。。(INT I = 1; I <= 5; I ++){
//有効期限:単一のメッセージの有効期限を設定する
プロパティAMQP.BasicProperties.Builder =新しいAMQP .BasicProperties()ビルダー()。
.priority(I).expiration(I×1000 + "");
channel.basicPublish(EXCHANGE_NAME、 ""、properties.build()、(I +メッセージ).getBytes(「UTF 8「));
}
channel.close();
Connection.close();
 
15、メッセージを使用すると、任意の欠点を持っているキュー?
1.システムの可用性を削減します。Doあなたが考えて、ああ、他のシステムはちょうどあなたがして、適切に実行しているでしょうシステムは正常です。今、あなたがメッセージキューがハングアップしていること、でメッセージキューを与える必要があり、あなたのシステムがそうではありません。このため、システムの可用性を削減

2.システムの複雑さが増す:それは信頼性の高い伝送を確保するためのメッセージを確実にするためにどのように、メッセージが消費を繰り返さないことを確実にする方法は、そのような一貫性など多くの問題を検討したいです。したがって、何かがより多く、システムの複雑さの増加を検討する必要があります。

おすすめ

転載: www.cnblogs.com/qingfenglin/p/12027815.html