メッセージ指向ミドルウェア(MOM)は、分散システム間でのメッセージの送受信をサポートするソフトウェアまたはハードウェアインフラストラクチャです。メッセージ指向ミドルウェアは、データが明示的なメッセージ境界のないバイト列として通信されるストリーミング指向ミドルウェアとは対照的です。ストリーミングプロトコルは、フレーム(イーサネット)、データグラム(UDP)、パケット(IP)、セル(ATM)などの離散メッセージを使用するプロトコルの上に構築されることがほとんどです。
MOMは、アプリケーションモジュールを異種プラットフォームに分散させ、複数のオペレーティングシステムやネットワークプロトコルにまたがるアプリケーションの開発の複雑さを軽減します。ミドルウェアは分散通信レイヤーを作成し、アプリケーション開発者をさまざまなオペレーティングシステムやネットワークインターフェイスの詳細から隔離します。多様なプラットフォームやネットワークにまたがるアプリケーションプログラミングインターフェイス(API)は、通常MOMによって提供されます。[ 1 ]
このミドルウェア層により、独立して開発され、異なるネットワークプラットフォーム上で実行される可能性のあるソフトウェアコンポーネント(アプリケーション、サーブレット、その他のコンポーネント)が相互に連携できるようになります。異なるネットワークノードに分散されたアプリケーションは、アプリケーションインターフェイスを使用して通信します。さらに、管理インターフェイスを提供することで、相互接続されたアプリケーションのこの新しい仮想システムは、耐障害性とセキュリティを備えることができます。[ 2 ]
MOMは、クライアント/サーバーアーキテクチャのすべての通信コンポーネントに存在するソフトウェア要素を提供し、通常はクライアントアプリケーションとサーバーアプリケーション間の非同期呼び出しをサポートします。MOMは、クライアント/サーバーメカニズムのマスタースレーブ構造の複雑さからアプリケーション開発者の関与を軽減します。
これらのモデルはすべて、ネットワークを介してあるソフトウェアコンポーネントが別のコンポーネントの動作に影響を与えることを可能にします。これらのモデルは、RPC および ORB ベースのミドルウェアが密結合コンポーネントのシステムを作成するのに対し、MOM ベースのシステムではコンポーネントの疎結合が可能であるという点で異なります。RPC または ORB ベースのシステムでは、あるプロシージャが別のプロシージャを呼び出す場合、呼び出されたプロシージャが戻るまで他の処理を実行できません。これらのほとんど同期的なメッセージングモデルでは、ミドルウェアは部分的にスーパーリンカーとして機能し、ネットワーク上で呼び出されたプロシージャを特定し、ネットワーク サービスを使用して関数またはメソッド パラメータをプロシージャに渡して結果を返します。[ 2 ]オブジェクト リクエスト ブローカーは、一方向呼び出しによる完全非同期メッセージングもサポートしていることに注意してください。[ 3 ]
メッセージベースの通信プロトコルを使用する主な理由としては、送信者から受信者へメッセージを伝達する際に、メッセージを保存(バッファリング)、ルーティング、または変換できる能力が挙げられる。
クライアント間のメッセージングをメッセージングプロバイダ経由で行う場合のもう一つの利点は、管理インターフェースを追加することでパフォーマンスを監視および調整できることです。これにより、クライアントアプリケーションはメッセージの送受信および処理以外のあらゆる問題から解放されます。相互運用性、信頼性、セキュリティ、拡張性、パフォーマンスといった問題の解決は、MOMシステムを実装するコードと管理者に委ねられます。
MOMシステムでは、クライアントはAPI呼び出しを行い、プロバイダが管理する宛先にメッセージを送信します。この呼び出しにより、プロバイダのサービスが起動され、メッセージのルーティングと配信が行われます。メッセージの送信が完了すると、クライアントは他の作業を継続できます。受信側のクライアントがメッセージを取得するまで、プロバイダがメッセージを保持してくれるからです。メッセージベースのモデルとプロバイダの仲介機能により、疎結合なコンポーネントからなるシステムを構築することが可能になります。
MOMは、一般的にリクエスト/レスポンス方式ではなく非同期メッセージパッシングに依存する、アプリケーション間通信ソフトウェアの一種です。非同期システムでは、宛先プログラムがビジー状態または接続されていない場合、メッセージキューが一時的なストレージとして機能します。さらに、ほとんどの非同期MOMシステムは、メッセージキューをバックアップするための永続ストレージを提供します。これは、送信側と受信側が同時にネットワークに接続する必要がない(非同期配信)ことを意味し、断続的な接続の問題が解決されます。また、受信側アプリケーションが何らかの理由で障害を起こした場合でも、送信側は影響を受けずに処理を継続できます。送信側が送信したメッセージは、受信側が再起動した際に処理できるよう、メッセージキューに蓄積されるからです。
メッセージ指向ミドルウェアの実装の多くは、メッセージキューシステムに依存しています。一部の実装では、ルーティングロジックをメッセージング層自体が提供できるようにしていますが、他の実装では、クライアントアプリケーションがルーティング情報を提供するようにしたり、両方のパラダイムを組み合わせたりしています。また、ブロードキャストまたはマルチキャスト配信パラダイムを利用する実装もあります。
メッセージベースのミドルウェアシステムでは、宛先で受信されるメッセージは、最初に送信されたメッセージと同一である必要はありません。インテリジェンスを組み込んだMOMシステムは、送信者または受信者の要件に合わせてメッセージを変換し、ルーティングすることができます。 [ 4 ]ルーティングおよびブロードキャスト/マルチキャスト機能と連携して、1つのアプリケーションが独自のネイティブ形式でメッセージを送信し、2つ以上の他のアプリケーションがそれぞれ独自のネイティブ形式でメッセージのコピーを受信できます。多くの最新のMOMシステムは、プログラマが単純なGUIドラッグアンドドロップ操作に適用できる変換ルールを指定できる高度なメッセージ変換(またはマッピング)ツールを提供しています。
多くのメッセージ指向ミドルウェアシステムの主な欠点は、アーキテクチャにメッセージ転送エージェント(メッセージブローカー)という追加コンポーネントが必要となることです。他のシステムと同様に、コンポーネントを追加すると、パフォーマンスと信頼性が低下する可能性があり、システム全体の保守がより困難でコストがかかる場合もあります。
さらに、多くのアプリケーション間通信には本質的に同期的な側面があり、送信側は処理を続行する前にメッセージへの応答を待つ必要がある(極端な例としてリアルタイムコンピューティングやニアリアルタイムを参照)。メッセージベースの通信は本質的に非同期的に動作するため、このような状況には適さない可能性がある。とはいえ、ほとんどのMOMシステムには、要求と応答を単一の擬似同期トランザクションとしてグループ化する機能がある。
同期メッセージングシステムでは、呼び出し元の関数は、呼び出された関数がタスクを完了するまで戻りません。一方、疎結合の非同期システムでは、呼び出し元のクライアントは、受信側が処理に必要なリソースを使い果たし、呼び出されたコンポーネントが失敗するまで、受信側に処理を負荷し続けることができます。もちろん、パフォーマンスを監視し、メッセージフローを調整することで、これらの状況を最小限に抑えたり、回避したりすることは可能ですが、同期メッセージングシステムではそのような作業は不要です。重要なのは、それぞれのシステムの利点と欠点を理解することです。各システムは、異なる種類のタスクに適しています。場合によっては、望ましい動作を実現するために、2種類のシステムを組み合わせる必要があることもあります。
歴史的に、メッセージ指向ミドルウェアの使用を規定する標準規格が欠如していたことが問題を引き起こしてきた。主要ベンダーのほとんどは独自の実装を持っており、それぞれ独自のアプリケーションプログラミングインターフェース(API)と管理ツールを備えている。
メッセージ指向ミドルウェアの長年の標準規格の一つに、X/OpenグループのXATMI仕様(分散トランザクション処理:XATMI仕様)があり、これはプロセス間通信のためのAPIを標準化しています。このAPIの実装例としては、ATR BalticのEnduro/XミドルウェアやOracleのTuxedoなどが知られています。
高度メッセージキューイングプロトコル(AMQP) は、OASIS [ 5 ]および ISO [ 6 ]の承認済み標準であり、参加するアプリケーション コンポーネント間で使用されるプロトコルとフォーマットを定義しているため、実装間の相互運用性があります。AMQP は、ポイントツーポイント、ファンアウト、パブリッシュ/サブスクライブ、リクエスト/レスポンスなどの一般的なメッセージング パラダイムを含む柔軟なルーティング スキームで使用できます(これらはプロトコル標準の v1.0 自体では意図的に省略されていますが、ルーティングには特定の実装および/または基盤となるネットワーク プロトコルに依存します)。また、トランザクション管理、キューイング、分散、セキュリティ、管理、クラスタリング、フェデレーション、および異種マルチ プラットフォーム サポートもサポートしています。AMQP を使用する Java アプリケーションは通常、Java JMS で記述されます。その他の実装では、 C#、C++、PHP、Python、Ruby、およびその他のプログラミング言語用の API が提供されています。
ハイレベルアーキテクチャ(HLA IEEE 1516)は、米国電気電子学会(IEEE)とシミュレーション相互運用性標準化機構(SISO)が策定した、シミュレーションの相互運用性に関する標準規格です。この規格は、C++またはJavaのAPIを通じて提供される一連のサービスを定義しています。これらのサービスは、モジュール型のフェデレーションオブジェクトモデルに基づき、パブリッシュ/サブスクライブ方式の情報交換を提供します。また、論理シミュレーション時間に基づくデータ交換と時間進行、および同期ポイントのための協調的なサービスも用意されています。さらに、所有権の移転、データ配信の最適化、参加フェデレート(システム)の監視と管理といった追加サービスも提供されます。
MQテレメトリトランスポート(MQTT)は、OASIS組織がサポートするISO規格(ISO/IEC PRF 20922)です。TCP/IP上に構築された軽量で信頼性の高いパブリッシュ/サブスクライブ型のメッセージングトランスポートプロトコルであり、コードフットプリントの削減やネットワーク帯域幅の制約が求められるM2M/IoT環境での通信に適しています。
オブジェクト管理グループのデータ配信サービス(DDS)は、発行者と購読者の間でスケーラブルでリアルタイム、信頼性が高く、高性能で相互運用可能なデータ交換を可能にすることを目的としたメッセージ指向のパブリッシュ/サブスクライブ(P/S)ミドルウェア標準を提供します。[ 7 ]この標準は、C++、C++11、C、Ada、Java、およびRubyへのインターフェースを提供します。
拡張可能なメッセージングおよびプレゼンスプロトコル ( XMPP ) は、拡張可能なマークアップ言語 ( XML )に基づくメッセージ指向ミドルウェアの通信プロトコルです。拡張性を考慮して設計されたこのプロトコルは、パブリッシュ/サブスクライブシステム、VoIP のシグナリング、ビデオ、ファイル転送、ゲーム、スマートグリッドなどの IoT アプリケーション、ソーシャルネットワーキングサービスにも使用されています。ほとんどのインスタントメッセージングプロトコルとは異なり、XMPP はオープン標準で定義されており、開発とアプリケーションにオープンシステムアプローチを採用しているため、誰でも XMPP サービスを実装し、他の組織の実装と相互運用できます。XMPP はオープンプロトコルであるため、実装は任意のソフトウェアライセンスを使用して開発できます。多くのサーバー、クライアント、ライブラリの実装はフリーソフトウェアおよびオープンソースソフトウェアとして配布されていますが、多くのフリーウェアおよびプロプライエタリソフトウェアの実装も存在します。インターネット技術タスクフォース (IETF) は、コアプロトコルを IETF インスタントメッセージングおよびプレゼンス技術として正式化するために、2002 年に XMPP ワーキンググループを設立しました。 XMPPワーキンググループは4つの仕様(RFC 3920、RFC 3921、RFC 3922、RFC 3923)を作成し、2004年に提案標準として承認されました。2011年には、RFC 3920とRFC 3921はそれぞれRFC 6120とRFC 6121に置き換えられ、RFC 6122はXMPPアドレス形式を規定しています。IETFで標準化されたこれらのコアプロトコルに加えて、XMPP Standards Foundation(旧Jabber Software Foundation)はオープンなXMPP拡張機能の開発に積極的に取り組んでいます。XMPP Standards Foundationによると、XMPPベースのソフトウェアはインターネット全体に広く展開されており、米国国防総省(DoD)の統合機能フレームワークの基盤となっています。[ 8 ]
Java EEプログラミング環境は、 Java Message Service (JMS)と呼ばれる標準APIを提供しており、これはほとんどのMOMベンダーによって実装され、特定のMOM API実装を隠蔽することを目的としています。しかし、JMSは交換されるメッセージのフォーマットを定義していないため、JMSシステム間には相互運用性がありません。
同様の取り組みとして、活発に開発が進められているOpenMAMAプロジェクトがあります。これは、特にC言語クライアント向けに共通のAPIを提供することを目指しています。2012年8月現在、主に市場関連データ(株価など)をパブリッシュ/サブスクライブ型ミドルウェア経由で配信するのに適しています。
メッセージキューは、分散アプリケーション間での情報交換を可能にします。メッセージキューは、メモリまたはディスクストレージに存在できます。メッセージは、サービスコンシューマによって処理されるまでキュー内に保持されます。メッセージキューを介して、アプリケーションは独立して実装できます。つまり、互いの位置を知る必要はなく、このメッセージを受信するのを待つ必要性をなくすための手順を継続的に実装する必要もありません。[ 9 ]