RabbitMQ入門 – RabbitMQとは何か

なぜRabbit? MQとは何ですか? どのようにアプリケーションを改善することができますか? なぜもっと学びたいと思うのでしょうか? – これらは、私が初めてRabbitMQを紹介されたときに抱いた疑問です。 私はGaborで、今はRabbitMQのエンジニア兼コンサルタントをしています。 RabbitMQを扱う中で、経験豊富な顧客でさえもこのような質問をすることを知りました。

TL;DR > 使用例、機能、専門コンサルタントへの問い合わせについては、RabbitMQ製品ページを確認してください。

RabbitMQはどんな問題を解決するか

RabbitMQとは何か、それをどう使用するかを掘り下げる前に、問題領域自体について詳しく学ぶ価値があると言えます。

一方では、輸送手段や通信の特性を定義するさまざまなプロトコルがあります。 このようなプロトコルの例としては、SMTP、FTP、HTTP、WebSocket などがあり、これらはすべて TCP/UDP をベースにしています。 これらは、メッセージのフォーマット、信頼性、および正しい受信者の検索を扱います。

一方、メッセージの観点から通信を探ることもできます。 それはあるシステムに存在し、次に別のシステムに運ばれ、変換される、つまり、ライフサイクルがあります。

前述の通信プロトコルは、メッセージの所有権 (および「物理」位置) があるシステムから別のシステムに転送されることを確認できます (ただし、このトランザクションを実行するには時間がかかる場合があります)。 この転送は、両者が存在する間のトランザクションと考えることができる。 たいていの場合、このような活発なやり取りが望まれる。たとえば、サービスの状態を尋ね、タイムリーで正確な答えを期待する。
1) 電話をかける、
2) 相手が応答するのを待つ、
3) 楽しい議論をする、
4) 電話を切る。

しかし、回答が必要ない場合もあり、受信者がメッセージの所有権を持ち仕事をすることが必要なだけな場合もある。 この場合、仲介エージェント、つまりメッセージの所有権を(一時的に)取得し、メッセージが宛先に届くようにする別のシステムが必要になります。 電話の例をさらに推し進めると、相手は今いないため、ボイスメッセージを残します。 ボイスメールサービスは意図した受信者に通知します。

この非同期(遅延)メッセージ配信は、RabbitMQが提供するものです。 明らかに、単純な留守番電話以上のことができるので、以下に提供するオプションのいくつかを探ってみましょう

(RabbitMQの歴史についてもっと知りたい場合は、Alvaro VidelaとJason Williamsによる「RabbitMQ in Action」の最初の章をお勧めします。

RabbitMQは、フリーでオープンソースの、拡張可能なメッセージキューイングソリューションです。 AMQP (Advanced Message Queuing Protocol) を理解するメッセージブローカーですが、MQTT のような他の一般的なメッセージングソリューションと併用することも可能です。 高可用性、耐障害性、スケーラビリティを備えています。 これは、RabbitMQ や WhatsApp、MongooseIM などのシステムのように、非常に多数の同時処理を処理するネイティブな機能を持つ、安定した、信頼できる、耐障害性の高い、拡張性の高いシステムの構築用に作られた技術である Erlang OTP で実装されています。

使用例

RabbitMQの多様性を示すために、RabbitMQがいかにブラックボックスの管理サービスアプローチとして、機能するマイクロサービスアーキテクチャを可能にするアプリケーションと緊密に統合するものとして、または他のレガシープロジェクトへのゲートウェイとしてうまく適合しているかを示す3つのケーススタディを使用する予定である。

一般的なメッセージバスとしてのRabbitMQ

モノリスシステムが個別のサブシステムに分解されるとき、解決しなければならない最大の問題の1つは、どの通信技術を使用するかということである。 Mulesoft や MassTransit のようなソリューションは、HTTP のリスナーとセンダーを宣言することで、サービスを「配線」することができます。 この種のソリューションでは、RabbitMQをブラックボックスとして扱いますが、RabbitMQの機能を活用することは可能です。 直接通信の例として、HTTPを使用して個々のサービスを「接続」してみましょう。 これは十分にサポートされた堅実な選択ですが、いくつかの欠点があります:
1) サービスの検出が解決されていない。 解決策として考えられるのは、DNSを使用することです。 システムがスケールして大きくなると、この負荷の発見と分散の複雑さも増します。 RabbitMQは、この解決策の複雑さの増加を緩和することができます。
2) 通信が刹那的である。 メッセージは、ネットワーク層でドロップされたり、重複したりしがちです。

RabbitMQは、トランスポート手段としてメッセージキューを利用することで、両方のケースを支援することができます。 サービスはメッセージを発行および消費することができ、これにより、エンドツーエンドのメッセージ配信が宛先サービスの可用性から切り離されます。 HTTPとは異なり、消費するサービスが一時的に利用できない場合、メッセージは安全にバッファリングされ、RabbitMQに保持され、サービスがオンラインに戻ると最終的に配信されます。 私たちが知る必要があるのは、RabbitMQ がどこにあり、キュー名が何であるかだけです。 これは問題を再発明しているだけのように見えますが、これはスケーラブルです。 キュー名は、サービスのアドレスとして機能します。 個々のサービスがキューからメッセージを消費することで、スケーラビリティの手段が提供される。つまり、各キューは複数の消費者にサービスを提供し、負荷のバランスをとることができる。

この適度に静的なキュー構成は、RabbitMQを、堅実な設計が長期的に安定したサービス品質を保証できるミドルウェア層へと押し上げる。

ルーティングロジックは、必要なときにアプリケーションによって動的に作成できる、異なる(いわゆる)交換タイプで実装されています。 宛先サービスは、消費したいキューを作成し、メッセージを公開するときにパブリッシャーが使用できるキーのパターンを指定することによって、それらをエクスチェンジにバインドします。 (これらのキーは、交換が 1 つ以上のキューにメッセージをルーティングして配信するために使用できるメタデータと考えます。)

ルーティング ロジックは、必要に応じてアプリケーションによって動的に作成できる異なる (いわゆる) 交換タイプで実装されています。 宛先サービスは、消費したいキューを作成し、メッセージを公開するときにパブリッシャーが使用できるキーのパターンを指定することによって、それらをエクスチェンジにバインドします。 (これらのキーは、交換が 1 つ以上のキューにメッセージをルーティングおよび配信するために使用できるメタデータと考えます。)

RabbitMQ には、メッセージングの使用事例のほとんどをカバーする 4 種類の便利な交換があります:
1) Direct exchange。 これは、バインディング・キーがメッセージのルーティング・キーと正確に一致する任意のキューに、受信メッセージを配信します。 キュー名をルーティング・キーとしてキューをバインドすれば、1対1のメッセージ配送と考えることができます。 複数のキューに対してバインディングキーを使用することで、同じメッセージを複数のキューに配送することは簡単です。
2) トピック交換。 これは,ワイルドカードのバインディングキーが公開メッセージのルーティングキーと一致する任意のキューに,受信メッセージを配送します。 バインディングキーは,複合ルーティングキーのワイルドカードのマッチング基準を含むことができます。 (例: バインディングキー logs.*.error はルーティングキー logs.accounting.errorlogs.ui.error にマッチします)。 これにより、ロジックが十分に含まれたシンプルなサービスを書くことができ、メッセージはRabbitMQの「マジック」によって正しいサービスに到着する。
3) ファンアウト交換。 一部のメッセージはすべてのキューに配信される必要がありますが、この場合、アプリケーションで精巧なマルチキャストロジックを書く代わりに、ファンアウト交換を使用することができます。 RabbitMQファンアウトExchangeでは、各サービスがバインドキーを指定することなく、適切なキューをExchangeにバインドし、すべてが自動的に行われます。 バインディングキーが指定されている場合、ファンアウトExchangeはそれを単に無視し、それにバインドされているすべてのキューにメッセージをルーティング/ブロードキャストします。 この交換は、AMQPメッセージの構造を活用し、AMQPメッセージのヘッダー(カスタムのものを含む)に基づく複雑なルーティングを行うことができます。

エクスチェンジのほかにも、RabbitMQには非常に複雑なメッセージングロジックの実装を可能にする便利な機能があります。 最も重要な機能として、
1)カスタムプラグインがある。 RabbitMQは、ユーザーがプラグインを追加できるようにすることで拡張可能です。 管理、認証と認可、バックアップソリューション、クラスタリングなど、RabbitMQのほぼすべての側面がカスタマイズ可能である
2)クラスタリング。 1台のRabbitMQサーバーでは不十分な場合、複数のRabbitMQブローカーを接続し、連携してシステムを拡張することが可能である。 RabbitMQがより多くのメッセージを処理できるようにしたり、エラーへの耐性を高めたりすることができます。
3) サービス品質のチューニング。 時間的制約のあるメッセージ配信は、メッセージまたはキューのいずれかにTTL(Time-to-Live)値を添付することで支援することができます。 タイムアウトしたメッセージは、自動的にデッドレターキューに配送することができます。 通常のルーティングロジックとこれらの追加機能を組み合わせることで、高度なルーティングロジックを実現することができる。 もう一つの有用な機能は、パブリッシャーが各メッセージに優先順位を割り当てることができるプライオリティキューを使用することです。 この場合、RabbitMQはバックプレッシャーメカニズムを適用します。

レガシーシステムへのRabbitMQの統合

前の使用例で、プラグインを使用してRabbitMQの機能を拡張できることを述べました。 この強力な機能により、RabbitMQはRabbitMQネイティブ(AMQP対応)サービスと他のレガシーアプリケーション間の仲介層として機能することができるようになります。 注目すべき例としては、
1) プラグインを有効にするだけで、RabbitMQをMQTTブローカーとして使用することができます。
2) RabbitMQのJMS(Java Message Service)プラグインは、RabbitMQがJMS対応のメッセージングソリューションと通信できるようにします。

Conclusion

上記の例が示すように、RabbitMQが通信できないものはほとんどありません。 しかし、人生におけるあらゆるものと同様に、それには代価が必要です。 RabbitMQの設定はほとんど簡単ですが、時には機能の多さに圧倒されることがあります。 RabbitMQブローカーの設計、実装、サポートで問題に直面した場合は、当社の専門家チームにご連絡ください。

RabbitMQのデバッグ

RabbitMQの監視とメンテナンスを容易にする直感的なシステムをお望みですか? WombatOAMの45日間無料トライアルを今すぐご利用ください。

RabbitMQの機能ページ