ActiveMQのメッセージングミドルウェアインタビュートピックス

1. ActiveMQのは何ですか?

ActiveMQのは、効率的でスケーラブルを提供し、安定したアプリケーション・エンタープライズ・メッセージングを確保するために、オープンソース実現JMS1.1仕様、メッセージ指向(MOM)ミドルウェアであります

2. ActiveMQのサーバがどのように行うためにダウンしましたか?

これは、ストレージ・メカニズムのActiveMQからでした。通常の状況下では、非永続メッセージは、持続性メモリは、その最大限界ノード構成ファイル内に配置された、メッセージ・ファイルに格納され、メモリ内にあります。ただし、非永続メッセージがある程度蓄積し、メモリは時間の、ActiveMQのは、メモリを解放するために、一時ファイルに書き込まれた非永続メッセージのメモリになります走りました。ファイルに保存されているが、それとメッセージの違いは永続的で、再起動後に永続的なメッセージは、ファイルから回復するものの、非永続的な一時ファイルを直接削除されます。
それでは、ファイルが上限増加の設定時間に達した場合は発生しますか:私は、次の実験でした
ファイルを削除し、メッセージの一部のファイルが上限に達するまで、2Gのファイル制限に関する永続的に設定し、永続メッセージの量産を今回はプロデューサーをブロックが、消費者が正しく接続され、メッセージを消費し、その消費することができます以降の部屋を作るために、だけでなく、生産者は、サービスが自動的に正常に戻る、メッセージを送信し続けます。
一時的な2Gファイルの上限付近に設定、非永続メッセージの大量生産とそれが生産者をブロックし、上限に達した場合、一時ファイルを書き込む、消費者が適切に接続することができるが、メッセージ、あるいは遅い消費者支出を消費することはできません、消費者突然停止しました。システム全体を接続することができますが、サービスを提供することができない、それはそうハングアップされます。
未知の、ソリューションの特定の理由:それを使用する必要があり、非永続メッセージを使用しないようにしてくださいは、大規模な一時ファイルを転送することが可能な限り制限されます。

どの3.失われたメッセージを行うには?

java.net.SocketExceptionが開始からこの異常のjava。送信者は、ネットワークデータの束を送信し、接続を閉じるには、Closeを呼び出したときに簡単に言えば、それはあります。これらのデータは、受信者のキャッシュに送信され、データを読み込むための受信者は、あなたがメソッドを呼び出した場合、まだ他の側が接続を閉じていても、キャッシュから読み取ります。例外が発生するので、接続が閉じられているので、受信側の試みは、この時点でデータを送信する場合には、これはよく理解されています。RECVエラーが失敗しました:しかしのSocketExceptionが発生した場合に、バッファゾーンのデータも再びこの時点で、脇に設定していた受信者は、キャッシュ内のデータを読み取るために、読み取りメソッドを呼び出し、それがソフトウェアを報告します、というメモがアボート接続が原因。

それによってキャプチャは、ActiveMQのは、ハートビートパケットを送信する10秒ごとに、サーバーは、クライアントが死ななかったの死に決定され、クライアントにハートビートパケットを送信することです。あなたは上記の最初の記事を読んでいる場合は、ある程度の非永続メッセージの蓄積がファイルに書き込まれることを知って、書き込み処理は、すべてのアクションをブロックしますと、20〜30秒続くだろう、と増加メモリと増加。クライアントは彼のメッセージを呼び出すconnection.close()を完了すると、サーバーは、15秒以上が直接答える近いソケット層の近くのTCPが接続されて呼び出していない場合は、接続を閉じるように答えを探します。このとき、クライアントから送信されたメッセージは、実際にはまだサーバーのキャッシュに処理されるのを待っているが、サーバーのハートビートパケット以来、異常なjava.net.SocketExceptionがにつながる、脇データ・キャッシュ・セットは、メッセージが失われたに対処していませんでした。

解決策:永続的または非永続メッセージが時間内に蓄積し、またはトランザクションを開始し、トランザクションを開始、コミット()メソッドは戻り値にサーバーを待つ責任を負うことになりますしていないと報道した後、それはクローズメッセージを引き起こし接続が失われたことはありません。

4.永続的なメッセージは非常に遅いです。

デフォルトでは、非永続メッセージを非同期的に送信され、永続メッセージは、高速なメッセージを耐え難いされて送信するために、少し遅くなるハードドライブに遭遇、同期的に送信されます。しかし、開いているトランザクションの場合には、メッセージが非同期的に送信され、効率が大きさの改善の二桁になります。永続メッセージを送信するときに、アクティブトランザクションモードにしてください。トランザクションが送信されたときに、パフォーマンスが影響しませんので、実際には、また、非永続メッセージをオープンすることをお勧めします。

メッセージの不均一な消費。

時には、いくつかのメッセージを送信した後、メッセージを処理するために2人の消費者を開きます。あなたは、消費者がメッセージを受信しないことを、消費者のハンドルすべてのメッセージやものを見つけるでしょう。その理由は、ActiveMQのプリフェッチ機構です。消費者はメッセージではなく、取得するための一つ一つが、1回の買収の数を取得するために行くとき、デフォルトは1000です。これらの買収前のニュースは、管理コンソールは、まだこれらのメッセージを見ることができ、消費前に確認されていないが、他の消費者に再割り当てない、この時間は、これらのメッセージのステータスが「非消費が割り当てられている」と考えるべきですメッセージは最終的に消費された場合、消費者が崩壊した場合、これらのメッセージは、新しい顧客に再割り当てされ、サーバー側で削除されます。しかし、消費者が確認を消費しない場合には、崩壊していない、これらのメッセージは、消費者のバッファゾーンをうそしないことを処理することはできません。より多くの場合、非常に時間がかかり、これらのメッセージの消費量は、あなたがに対処するための10の消費者を開け、その1つのマシンだけHangchihangchiプロセスを発見し、9つの敗者に加えて終了します。

解決策:プリフェッチはそうもありませんはるかに遅く、メッセージを処理し、それぞれ、1にセットされ、処理取りに行きます。

6.不能キュー。

あなたはプロセスが失敗にメッセージを投稿したい場合は、サーバは、削除されていないにも閉じAUTO_ACKNOWLEDGEをすることができ、他の消費者または再試行することによって治療することができ、ACKは、自分でプログラムを参照しました。あなたがそのAUTO_ACKNOWLEDGEを使用している場合は、メッセージが確認される場合、ニュースを確認する方法がある停止していませんか?そこ!

消費者のニュース二つの方法があり、一つはまでブロックしますconsumer.receive()メソッドを呼び出すと、メッセージを返します。メッセージは呼び出し元に返された後、この場合には、自動的に方法が確認されました。もう一つの方法は、メッセージが到着したとき、onMessageメソッドは、リスナー・インターフェースと呼ばれる、コールバック関数のリスナーを使用することです。この場合は、onMessageの方法が完了した後、メッセージは限りメソッドが例外をスローするよう、メッセージが確認されることはありません。この場合には確認されます。質問があるので、メッセージを処理できないと、サーバが再割り当てに一つだけのコンシューマがある場合、返される場合は、メッセージが再取得し、例外を再スローになります。扱うことができないニュースサーバ上で、多くの場合、複数のコンシューマがある場合であっても、別のサーバー上で処理することはできません。それは、このようなリターンです - 取得 - まだ死のサイクルを与えられましたか?

再試行の後、6回、ActiveMQのは、このメッセージは、「毒性」であると信じて、配信不能メッセージキューの中にスローされます。あなたのメッセージがなくなっている場合は、ActiveMQ.DLQにルック内部は、多分ちょうどそこに横たわっています。

再送時間間隔と再送回数それ7. ActiveMQのメッセージ?

ActiveMQの:Apacheのは、オープンソースのメッセージバスに最も人気のある、強力な能力を生産しています。それは完全にサポートJMS1.1とJ2EE 1.4仕様のJMSプロバイダの実装です。JMS(Javaメッセージサービス):JavaプラットフォームはAPIのメッセージ指向ミドルウェア(MOM)である、二つのアプリケーションの間で使用される、または分散システムは、非同期通信のために、メッセージを送信します。
まず下で、我々はおそらく、ActiveMQのサーバは、消費者へのメッセージを再送信しますれる状況を理解する必要があり、ここでは簡単にするために、それは想定メッセージングモードであるキュー(つまり、メッセージの送信者とメッセージの受信者)です。
①メッセージの受信者がMOMに応えるには、メッセージの処理中に処理されない場合は、メッセージがMOMに再送信されます。
②チームメッセージの受信者ならば、我々は、キュー先読みパラメータ(consumer.prefetchSize)を設定した場合、最初のメッセージを処理している間にすべてのメッセージダウン、先読みの数が再送されます!に(MOMは、確認応答を受信していないにメッセージを送信します)
③セッションは限りメッセージ受信者のないメッセージがあるとして、トランザクションの場合確認、または中またはMOMクライアントがダウンし、トランザクションMOMスコープ内のすべてのメッセージが再送信されます突然のいずれかのメッセージを送信します。
④ここでは、メッセージが応答ではないか、応答が停止したの応答がない、またはまったく偶然で処理された最終消費者ではActiveMQメッセージング・サーバーのクライアントは、メッセージがより緊急処理されている方法を知って、疑問であってもよく、それは?実際には、クライアントマシンのメモリの全てがキャッシュメッセージて送信する責任があるクライアントActiveMQの環境を、実行している、フェイルオーバ(フェイルオーバー)などのために、維持し、ActiveMQのサーバメッセージング通信を担当する責任がありますすべての判断が行われ、完全にこのクライアント環境を処理しています。
私たちは、設定パラメータは、主に次のようである構成をカスタマイズするためにActiveMQの再送戦略(再配信ポリシー)に来ることができます。
利用可能なプロパティを
プロパティデフォルト説明
L collisionAvoidanceFactorデフォルト値はuseCollisionAvoidanceパラメータが有効にのみ有効にするために、紛争予防の正および負の範囲の割合を設定し、0.15です。
6リットルのmaximumRedeliveriesデフォルト値の後に、再送信の最大数が最大回数がスロー再接続に達します。-1制限なし周波数0は再送を示すありません。
L -1のmaximumRedeliveryDelayデフォルト値、最大伝送遅延、唯一の有効な(V5.5)はuseExponentialBackOffに真であるが、10ミリ秒の最初の再接続間隔、2倍と仮定される、第二の再接続間隔は20ミリ秒であり、第三の再接続時間間隔大きな最大再接続時間間隔は、各再接続後の時間間隔は最大再接続時間間隔である40msの、再接続の時間間隔。
Lは、1000Lのデフォルトの初期再送遅延時間initialRedeliveryDelay
L redeliveryDelay 1000Lのデフォルト値、再送信遅延時間、開始initialRedeliveryDelay =(V5.4)を0
リットルuseCollisionAvoidanceデフォルト値FALSE、衝突関数を防止するために有効に、メッセージを受信したときため複数のスレッドを使用して並行処理は、安全性が並行スレッドを避けるために再送信されるべき時間メッセージ受信処理において全て同じ点です。同じ時点でそれを扱うときにすべてのスレッドは何が起こるのだろうか?ただ、時にはアイドル、非常に忙しくない時々 、ブローカーの処理性能のバランスをとるために、問題はないはずです。
デフォルト値はfalse useExponentialBackOffリットル、インクリメンタルに遅延時間を増加させ、複数のインデックスを有効にします。
5のL backOffMultiplierデフォルト値は、時間間隔が再接続の倍数でインクリメントされ、唯一の1より大きい値と有効useExponentialBackOffパラメータまで反映されません。

公開された74元の記事 ウォンの賞賛232 ・は 20000 +を見て

おすすめ

転載: blog.csdn.net/qq_43107323/article/details/104861552