流量制御

RabbitMQの閾値は、メモリとディスクの量、閾値に達したときに、プロデューサが正常に対応するエントリまでブロックするために設定されてもよいです。これら二つの閾値、先頭からバージョン2.8.0に加えて、RabbitMQのはまた、安定性を確保するためにフロー制御(フロー制御)メカニズムを導入します。フロー制御機構は、サーバーをサポートすることは困難な状況につながる、あまりにも頻繁にメッセージを送信しないようするために使用されます。グローバルフロー制御と同等のメモリとディスクアラーム、クラスタは、すべての接続のトリガーをブロックし、フロー制御されます一度、単一の接続のためである、あなたは、接続ごとのフロー制御や内部フローコントロールを呼び出すことができます。

フロー制御の原理

(バイナリ型を除く)Erlangのプロセス間でメモリを共有しますが、メッセージを渡すことによって通信しないでください、各プロセスは独自のプロセスのメールボックス(メールボックス)を持っています。デフォルトでは、Erlangのプロセスのメールボックスのサイズを制限しませんので、継続的なプロセスに送信されたメッセージの数が多い、プロセスがメールボックスにつながるときのメモリとクラッシュのうち、最終的には、大きすぎます。RabbitMQのでは、生産者は、高速を送り続けた場合、および低消費支出率、フロー制御が存在しない場合は、すぐに内部プロセスのメールボックスのサイズのメモリしきい値に到達するようになります。

クレジット正ベースのアルゴリズム(クレジットベースのアルゴリズム)を用いてのRabbitMQは、この問題を解決するためにメッセージを送信するレートを制限するための制御機構を流れます。それは、処理負荷がメッセージを処理するために、高すぎると手遅れになるとき、プロセスはゆっくりと、電子メールメッセージを蓄積するために開始され、各プロセスのメールボックスを監視することにより、プロセスである一定量まで蓄積したとき、それは上流の新しいを受信せずにブロックします。メッセージ。だから、ゆっくりと、プロセスメールメッセージの上流には、ゆっくりと蓄積を開始します。蓄積された場合には、ある程度の時間は、上流のメッセージの受信を停止するためにブロックされ、そして最終的には、ネットワークパケットを中断し、プロセスが新しいデータを受け取るブロックされた受信のために責任を負うことになります。例として、次の図:

プロセスA、プロセスBに転送されたメッセージを受信し、処理B、処理Cに転送されたメッセージを受信します 各プロセスには、送信および受信メッセージのためのクレジット値のペアを持っています。ケースBの方法で、{{credit_from、C}、値} Cに送ることができるメッセージの数を示し、プロセスBは、プロセスCにメッセージを送信しないものによって値に送信される各メッセージは、0でありますプロセスは、もは​​やのメッセージを受信されません。{{Credit_to、A}、値}次に、多くの通知メッセージを受信したかを示す{credit_from、B}通知処理A増大を受信した後、工程Aにクレジット値を増加送られ、値{}の値に対応し、処理するようにメッセージが連続して送信することができます。アップストリーム伝送レートが下流受信レートよりも高い場合、徐々にクレジット値は、枯渇するだろう、プロセスがブロックされ、筐体のブロッキングは最上流に送信されたであろう。もしこの時、最上流ブロックされていない状態で、上流ブロックされた状態で、下流のクレジット値を増加させるために、上流工程から通知された場合、メッセージをさらに上流のプロセス、最終的には導電性最上流ブロック解除を受信し始めます。したがって、伝送速度のクレジットベースのフロー制御機構は、最終的にメッセージ送信処理は、メッセージ処理プロセスの処理能力の範囲内に制限されるであろう。

トリガが前後に毎秒数回ブロックし、ブロックされていないスイッチング間の状態の接続制御手段が、流れるように接続されたときにそのメッセージ送信レートをサポートすることができるサーバーの範囲内に制御することができるので、それは、「フロー」状態になりますあなたは、接続のステータスを表示するrabbitmqctlのlist_connectionsまたはWeb管理インターフェイスで注文することができます。

流動状態にある、と走行状態での接続は、クライアントが、サーバーはそれを見て、通常の状況下での帯域幅よりも小さい、決して、単に伝送速度が制限されている対応する状態の管理者を別の教えではありません。

フロー制御機構は、接続、およびチャネルキュー上の同じ効果には適用されません。チャネル接続、キュー、および完全なチェーン、任意の鎖のフロー制御のためのプロセス全体限り、ブロッキングプロセスを形成するために、最終的にメッセージ永続ストレージ制御ストリームから、プロセスは、障害物の上流でなければなりません。プロセスは、パフォーマンスのボトルネックを達成するために、必然的に上流ブロックされている全てのプロセスにつながるならばそれは、あります。だから我々は、ボトルネックのどこフロー制御メカニズム、次の図のいくつかの重要なプロセスとそれに対応するプロセスメッセージの順序を見つけるために、この機能を使用することができます。

次のように前記プロセスの各々は、次のとおりです。

  ❤rabbit_reader:接続処理プロセスは、ように、受信AMQPプロトコルパケットを解析し、責任があります。

  ❤rabbit_channel:ようにAMQPプロトコル、ルーティング解像度や処理を担当プロセスを処理するチャンネルの方法。

  ❤rabbit_amqqueue_process:プロセスのキュー処理、およびすべての論理キューを実装するための責任があります。

  ❤rabbit_msg_store:メッセージの永続化を担当します。

ときに流動状態での接続が、これはフロー状態におけるチャネル接続ではなく、一つ以上の接続チャネルのパフォーマンスのボトルネックが現れていることを意味し、(そのようなルーティング処理ロジックのような)いくつかのチャネルの演算処理であろうこれは、サーバーのCPU負荷が高すぎると発生するような状況につながることができます。小さい非永続メッセージを大量に送信する場合は特に、このような場合は、最も可能性の高い表示されます。

これも流動状態で接続し、流動状態での接続チャンネルを複数有しているが、パフォーマンスのボトルネックを有する1つ以上のキューが存在することを意味する状態に対応するキューに流れが存在しない場合。これは、サーバのCPU負荷が高すぎる、またはサーバI / O負荷が発生するような状況でディスクに保存されたキューの中の高すぎるプロセスメッセージで発生します原因によるキューへのメッセージのプロセスであってよいです。小さな永続多数のメッセージを送信する場合は特に、このような場合は、最も可能性の高い表示されます。

場合は、フロー状態で接続し、これはまた、流動状態におけるチャネル接続の数を持っていて、メッセージの永続時間のパフォーマンスのボトルネックがあったことを意味し、フロー状態にあるキューの数が、あります。サーバーのI / O負荷を引き起こすことが高すぎると、ディスクに保存されているメッセージのキューの過程で発生するような状況です。特に出現するような場合は、最も可能性の高い大規模な永続メッセージを大量に送信するとき。

参考:ZHU忠華編「RabbitMQの戦闘ガイド」。

おすすめ

転載: www.cnblogs.com/Joe-Go/p/10951615.html