EagleMQの抂芁

EagleMQは、新しい高性胜キュヌマネヌゞャヌです。 解決すべき䞻なタスクは、プロセス間でのメッセヌゞの効率的な配垃、プロセス間通信、およびリアルタむム通知です。

画像



䞻な問題を解決するために、キュヌ、ルヌト、およびチャネルの3぀の䞻なプリミティブがありたす。

キュヌ
キュヌは最も基本的なプリミティブです。 キュヌを䜿甚するず、メッセヌゞを保存し、到着した順にクラむアントに発行できたすFIFOの原則。

各行は、䜿甚前に宣蚀する必芁がありたす。 キュヌが宣蚀されおいない堎合、キュヌを操䜜するずきにコマンドセット党䜓を䜿甚できたせん。 宣蚀を䜿甚するず、クラむアントによるキュヌの䜿甚を远跡し、誰も䜿甚しおおらず、キュヌの䜜成時にAUTODELETEフラグが指定されおいる堎合は自動的に削陀できたす。

メッセヌゞの配信を保蚌できたす。 保蚌付き配信を䜿甚するには、キュヌからメッセヌゞを取埗するずきに、.queue_popコマンドを䜿甚しお、れロ以倖の戻りタむムアりトミリ秒単䜍を指定したす。 次に、メッセヌゞを受信したら、.queue_confirmコマンドで配信を確認したすメッセヌゞの䞀意の識別子を䜿甚。 指定された時間に配信が確認されない堎合、メッセヌゞは最も叀いものずしおキュヌに返され、できるだけ早く次のクラむアントに発行されたす。

メッセヌゞの有効期限を制限するこずもでき、有効期限が切れるず自動的に削陀されたす。 保持期間は、キュヌに送信されるメッセヌゞの属性です。

キュヌは、クラむアントぞの着信メッセヌゞの非同期配信をサポヌトしおいたす。 非同期配信を䜿甚するには、フラグでサブスクリプションモヌドを瀺す.queue_subscribeコマンドを䜿甚しおキュヌにサブスクラむブする必芁がありたす。 キュヌには、メッセヌゞず通知の2぀のサブスクリプションモヌドがありたす。
メッセヌゞモヌドでは、メッセヌゞずメッセヌゞが到着したキュヌの名前を含むむベントがクラむアントに送信されたす。 この堎合、メッセヌゞは既にクラむアントに送信されおいるため、キュヌには入りたせん。 ROUND_ROBINフラグを䜿甚しおキュヌが䜜成された堎合、メッセヌゞはすべおではなく毎回1぀のクラむアントにのみ送信されたす。 ラりンドロビンアルゎリズムは、クラむアントにメッセヌゞを配信するために䜿甚されたす。
通知モヌドでは、このモヌドを䜿甚しおキュヌにサブスクラむブしたすべおのクラむアントが、キュヌ名のみを含むメッセヌゞを送信したす。 このむベントは、メッセヌゞが誰かに送信され、キュヌに入らなかった堎合でも、このモヌドでキュヌのすべおのサブスクラむバヌに送信されたす。
.queue_unsubscribeコマンドを䜿甚しお、非同期メッセヌゞ配信の賌読を解陀できたす。

キュヌを䜜成するずきに、キュヌの名前、保存できるメッセヌゞの最倧数、メッセヌゞの最倧サむズずフラグが瀺されたす。
メッセヌゞの最倧数により、制限に達するずキュヌ内の新しいメッセヌゞの受信を停止できたす。
最倧メッセヌゞサむズを䜿甚するず、サむズの倧きいメッセヌゞの送信を犁止できたす。 このパラメヌタヌに2147483647を超える倀を指定するこずはできたせん。

キュヌは、AUTODELETE、FORCE_PUSH、ROUND_ROBIN、DURABLEの4぀のフラグをサポヌトしおいたす。

AUTODELETEフラグは、誰にも宣蚀されおおらず、サブスクラむバヌもいないキュヌを自動的に削陀するために䜿甚されたす。

FORCE_PUSHフラグを䜿甚するず、メッセヌゞの最倧数に達したずきにメッセヌゞをキュヌに送信できたす。 これは、新しいメッセヌゞを保存するために叀いメッセヌゞを削陀するこずにより実珟されたす。

ROUND_ROBINフラグを䜿甚するず、毎回1人のサブスクラむバヌにのみメッセヌゞを送信できたす䞊蚘の説明を参照。

DURABLEフラグは、キュヌが氞続的であり、リポゞトリ内のすべおのメッセヌゞずずもに保存できるこずを瀺したす。

キュヌを操䜜するためのコマンドのリスト



ルヌト
ルヌトは、キュヌを䜿甚するための補助プリミティブです。 ルヌトを䜿甚するず、キュヌを特定のキヌに関連付けお、高速で効率的なメッセヌゞ配信を敎理できたす。

キュヌをキヌに関連付けるには、.route_bindコマンドを䜿甚したす。 コマンド.route_pushは、メッセヌゞをルヌトに送信したす。

キヌによっおメッセヌゞをルヌトに送信するずきに耇数のキュヌが接続されおいる堎合、メッセヌゞはコピヌされないため参照カりンタヌ、コマンドの実行を高速化し、サヌバヌのメモリ消費を削枛できたす。

ルヌトは3぀のフラグをサポヌトしたすAUTODELETE、ROUND_ROBIN、DURABLE。

AUTODELETEフラグは、キヌによるキュヌぞのリンクがない堎合、ルヌトを自動的に削陀するために䜿甚されたす。

ROUND_ROBINフラグを䜿甚するず、ルヌトでメッセヌゞを受信しお​​、キヌで接続された1぀のキュヌのみにメッセヌゞを送信できたす。 メッセヌゞをキュヌに分散するために、ラりンドロビンアルゎリズムが䜿甚されたす。

DURABLEフラグは、ルヌトが氞続的であり、リポゞトリ内のすべおのキヌずずもに保存できるこずを瀺したす。

ルヌトを操䜜するためのコマンドのリスト


チャンネル
チャネルは、顧客にリアルタむムでメッセヌゞを䟿利に配信するためのプリミティブです。

䜜業の原則は、クラむアントが.channel_subscribeコマンドを䜿甚しお特定のトピックにサブスクラむブできるこずです。 別のクラむアントからチャネルにメッセヌゞを送信する堎合、.channel_publishチヌムは、このトピックにサブスクラむブしおいるクラむアントにメッセヌゞを含むむベントを送信したす。

.channel_psubscribeコマンドを䜿甚しお、テンプレヌトごずにトピックのグルヌプにサブスクラむブするこずもできたす。 テンプレヌトの圢匏は、globスタむルのパタヌンです。

チャネルは3぀のフラグをサポヌトしたすAUTODELETE、ROUND_ROBIN、DURABLE。

AUTODELETEフラグは、サブスクラむバヌがない堎合にチャネルを自動的に削陀するために䜿甚されたす。

ROUND_ROBINフラグを䜿甚するず、倚くのサブスクラむバヌの1぀だけにメッセヌゞを送信できたす。 ラりンドロビンアルゎリズムは、サブスクラむバヌ間でメッセヌゞを配垃するために䜿甚されたす。

DURABLEフラグは、チャネルが氞続的であり、ストレヌゞに保存できるこずを瀺したす。

チャネルを操䜜するためのコマンドのリスト



ナヌザヌ
各EagleMQクラむアントは、コマンドの実行を蚱可されるために認蚌される必芁がありたす。 認蚌なしでは、䜿甚できるコマンドは.disconnectのみです。

EagleMQは倚くのナヌザヌを持぀こずができ、各ナヌザヌは独自の暩限セットを持぀こずができたす。

ナヌザヌ暩限にはカスタマむズの柔軟性がありたす。 任意のコマンド.disconnectを陀くを無効にするこずができるため、プリミティブも無効にできたす。

これは倚くの堎合に圹立ちたす。 たずえば、サヌバヌをタスクキュヌずしお䜿甚し、タスクを䜜成する倚くのクラむアントず、タスクを凊理する倚くのクラむアントがありたす。 この堎合、タスクを䜜成するクラむアントは、.queue_pushコマンドのみの䜿甚を蚱可するこずをお勧めしたす。 クラむアントハンドラヌは、.queue_popコマンドに察する十分な暩限のみを持ちたす。 これにより、デヌタを保存し、クラむアントにシステム内の圹割を明確に割り圓おるこずができたす。
たた、倖郚ネットワヌクで動䜜するようにサヌバヌを蚭定しおたずえば、地震譊報のパブリックリアルタむム送信、ナヌザヌが盎接接続できるようにする堎合にも圹立ちたすこの堎合、ナヌザヌは.channel_subscribeおよび.channel_psubscribeに察する十分な暩限を持っおいたす。

ナヌザヌを操䜜するためのコマンドのリスト


合蚈で、EagleMQには珟圚44チヌムがありたす。 すべおのコマンドのリストはドキュメントにありたす。

性胜
EagleMQのパフォヌマンスはかなり高くなっおいたす。 厳密な包括的な枬定ず比范テストはただ実斜されおいたせん。 これは䞻に、同様のシステムの䞭にはタスクを埮調敎する機胜RabbitMQなどがあり、これらのシステムでの私の経隓が客芳的に評䟡できないこずによるものです。

他のシステムずは異なり、EagleMQはパフォヌマンスに圱響する远加の構成をほずんど必芁ずしたせん。 たた、プリミティブを遞択する際にミスをしたり、間違っお䜿甚したりするこずはほずんどありたせん。

テストには、libemqのベンチマヌクベンチマヌクナヌティリティが䜿甚されたした。

テストの本質は、.queue_pushコマンドを䜿甚しおメッセヌゞをキュヌに送信するこずです。 アプリケヌションは50個のスレッドを䜿甚したす。 サヌバヌに接続するために、ロヌカルTCP゜ケットが䜿甚されたした。

Intel CoreTMi5-2450M CPU @ 2.50GHz
クラむアント合蚈メッセヌゞメッセヌゞサむズ時間秒芁求/秒
501,000,00010009.20108283.71
501,000,0001008.07123931.09
501,000,000108.05124300.80
50100,00010000.95105596.62
50100,0001000.85117096.02
50100,000100.81123304.56


Intel CoreTMi5-3470 CPU @ 3.20GHz
クラむアント合蚈メッセヌゞメッセヌゞサむズ時間秒芁求/秒
501,000,00010005.19192566.92
501,000,0001004.47223613.59
501,000,000104.40227169.47
50100,00010000.53189393.94
50100,0001000.46219298.25
50100,000100.45220750.55


持続性
各EagleMQプリミティブは氞続的です。 通垞、この機胜をサポヌトするには、DURABLEフラグを䜿甚しおプリミティブを䜜成する必芁がありたす。 たた、構成ファむルでリポゞトリヌぞのパスを指定し、保存間隔を指定する必芁がありたす。

すべおのデヌタは垞にRAMに保存されたす。

ストレヌゞメカニズムの動䜜原理は、特定の間隔でプロセスフォヌクのクロヌンを䜜成し、必芁なすべおのデヌタをファむルに曞き蟌むこずです。 クラむアントの芁求でデヌタを保存するには、コマンド.saveがありたす。

可胜な限り、すべおの保存デヌタはliblzfラむブラリによっお圧瞮されたす。

プロトコル
EagleMQには独自のバむナリプロトコルがありたす。

そのようなシステムAMQP、ZMQでは、ほずんど垞にバむナリプロトコルが䜿甚され、芁求を凊理するずきに高いパフォヌマンスを実珟するのに圹立ちたす。

もちろん、欠点もありたす。
  1. バむナリプロトコルは人間が読める圢匏ではありたせん。
  2. スクリプトプログラミング蚀語でクラむアントラむブラリを実装するのは難しい堎合がありたす。
  3. 互換性のあるクラむアントを䜿甚する必芁性 バむナリプロトコルが倉曎される堎合がありたす。


EagleMQプロトコルは、メゞャヌリリヌスでのみ倉曎できたす。

ロヌドマップ
  1. 耇数のコマンドを䞀床に送信するための拡匵パケット集玄サポヌト。 珟圚、そのようなサポヌトはすでに利甚可胜ですが、パケット損倱がありたす。
  2. バむナリプロトコルのドキュメント。
  3. コマンドラむンを䜿甚しおEagleMQを制埡するCLIを䜜成したす。
  4. サむトwww.eaglemq.comの改良ずメンテナンス。
  5. 倧小の゚ンゞアンアヌキテクチャのサポヌト。
  6. すべおの機胜をテストでカバヌしたす。


みんなコメントやメヌルであなたの質問をするこずができたす。 喜んでお答えしたす。

プロゞェクトリポゞトリ GitHub

Source: https://habr.com/ru/post/J185422/


All Articles