高度メッセージキューイングプロトコル(AMQP)は、メッセージ指向ミドルウェア向けのオープン標準アプリケーション層プロトコルです。AMQPの特徴は、メッセージ指向、キューイング、ルーティング(ポイントツーポイントおよびパブリッシュアンドサブスクライブを含む)、信頼性、およびセキュリティです。[ 1 ]
AMQP は、 SMTP、HTTP、FTPなどが相互運用可能なシステムを構築したのと同様に、異なるベンダーの実装が相互運用可能である範囲で、メッセージング プロバイダとクライアントの動作を規定します。ミドルウェアの以前の標準化はAPI レベル (例: JMS ) で行われ、複数の実装間の相互運用性を提供することではなく、異なるミドルウェア実装とのプログラマのやり取りの標準化に重点が置かれていました。[ 2 ]メッセージング実装が提供しなければならない API と一連の動作を定義する JMS とは異なり、AMQP はワイヤ レベルのプロトコルです。ワイヤ レベルのプロトコルは、バイトストリームとしてネットワークを介して送信されるデータのフォーマットの説明です。したがって、このデータ フォーマットに準拠するメッセージを作成および解釈できるツールは、実装言語に関係なく、他の準拠ツールと相互運用できます。
AMQPは、さまざまなメッセージングアプリケーションと通信パターンを効率的にサポートするように設計されたバイナリアプリケーション層プロトコルです。フロー制御された[ 3 ]メッセージ指向の通信を提供し、at-most-once(各メッセージが1回配信されるか、または配信されない)、at-least-once(各メッセージが確実に配信されるが、複数回配信される可能性がある)、exactly-once(メッセージが必ず確実に到着し、1回だけ到着する)[ 4 ]などのメッセージ配信保証、およびSASLやTLSに基づく認証や暗号化[ 5 ]を提供します。基盤となる信頼性の高いトランスポート層プロトコルとして、Transmission Control Protocol(TCP)[ 6 ]を前提としています。
AMQP仕様は、(i)型システム、(ii)あるプロセスから別のプロセスへメッセージを転送するための対称型非同期プロトコル、(iii)標準的で拡張可能なメッセージフォーマット、(iv)標準化されているが拡張可能な「メッセージング機能」のセット、という複数のレイヤーで定義されています。
AMQP は 2003 年にロンドンのJPMorgan Chaseの John O'Hara によって考案されました。[ 1 ] [ 7 ] AMQP は協力的なオープンな取り組みとして構想されました。最初の設計は JPMorgan Chase が 2004 年中頃から 2006 年中頃にかけて行い、iMatix Corporation にC ブローカーとプロトコル ドキュメントの開発を委託しました。2005 年に JPMorgan Chase は他の企業に働きかけ、Cisco Systems、IONA Technologies、iMatix、Red Hat、Transaction Workflow Innovation Standards Team (TWIST) を含むワーキング グループを結成しました。同年、JPMorgan Chase は Red Hat と提携してApache Qpidを作成しました。最初は Java で、その後すぐに C++ になりました。独立して、RabbitMQ はRabbit Technologies によってErlangで開発され、その後Microsoftと StormMQ の実装が続きました。
ワーキンググループは、バンク・オブ・アメリカ、バークレイズ、シスコシステムズ、クレディ・スイス、ドイツ証券取引所、ゴールドマン・サックス、HCLテクノロジーズ、プログレス・ソフトウェア、IITソフトウェア、INETCOシステムズ、インフォマティカ(29ウエストを含む)、JPモルガン・チェース、マイクロソフト、my-Channels、ノベル、レッドハット、ソフトウェアAG、ソレース・システムズ、StormMQ 、テルベラ、TWISTプロセス・イノベーションズ、VMware(ラビット・テクノロジーズを買収)、WSO2など23社に拡大しました。
2008年、iMatixのCEO兼チーフソフトウェアデザイナーであるPieter Hintjensは、「AMQPの何が問題なのか(そしてそれを修正する方法)」 [ 8 ]という記事を書き、ワーキンググループに配布して、差し迫った失敗を警告し、iMatixが認識している問題を特定し、AMQP仕様を修正する方法を提案しました。その時点で、iMatixはすでにZeroMQの開発に着手していました。2010年、Hintjensは、iMatixがAMQPワーキンググループを脱退し、AMQP/1.0のサポートは行わず、はるかにシンプルで高速なZeroMQを採用すると発表しました。[ 9 ]
2011年8月、AMQPワーキンググループはOASISメンバーセクションへの再編成を発表した。[ 10 ]
AMQP 1.0 は、2011 年 10 月 30 日にニューヨークで開催された会議で AMQP ワーキング グループによってリリースされました。このイベントでは、Microsoft、Red Hat、VMware、Apache、INETCO、IIT Software が相互運用性のデモンストレーションでプロトコルを実行するソフトウェアを実演しました。翌日の 2011 年 11 月 1 日に、この貢献された AMQP バージョン 1.0 を国際的なオープン スタンダード プロセスで推進するために、 OASIS技術委員会の設立が発表されました[ 11 ]。OASIS からの最初のドラフトは 2012 年 2 月にリリースされました[ 12 ] 。ワーキング グループによって公開されたものと比較した変更は、明確性を向上させるための編集のみに限定されていました (機能的な変更はありません)。2 番目のドラフトは 6 月 20 日に公開レビューのためにリリースされました (ここでも機能的な変更はありません) [ 13 ]。AMQP は 2012 年 10 月 31 日に OASIS 標準として承認されました[ 14 ]。
OASIS AMQP は、2014 年 4 月に ISO および IEC 国際規格としてリリースされることが承認されました。[ 15 ] AMQP 1.0 は、国際標準化機構 (ISO) と国際電気標準会議 (IEC) の情報技術に関する合同技術委員会 (JTC1) を通じて投票されました。承認された OASIS AMQP 提出物には、ISO/IEC 19464 という指定が与えられています。
AMQP の以前のバージョンは、2006 年 6 月に公開された 0-8、2006 年 12 月に公開された 0-9、2008 年 2 月に公開された 0-10 [ 16 ]、および 2008 年 11 月に公開された 0-9-1 です。これらの以前のリリースは、1.0 仕様とは大きく異なります。[ 17 ] [ 18 ]
AMQPは金融サービス業界で生まれた技術だが、幅広いミドルウェアの問題に一般的に適用できる。
AMQPは、一般的に使用されるさまざまな型の相互運用可能な表現を可能にする自己記述型エンコーディングスキームを定義します。また、型付きデータに追加の意味を注釈付けすることもできます[ 19 ]。たとえば、特定の文字列値には、URLとして理解できるように注釈を付けることができます。同様に、「名前」、「住所」などのキーと値のペアを含むマップ値には、「顧客」タイプの表現として注釈を付けることができます。
型システムは、標準メタデータと拡張メタデータを処理エンティティが表現および理解できるようにするメッセージ形式を定義するために使用されます。また、そのようなエンティティ間でメッセージが交換される際の通信プリミティブ、すなわちAMQPフレームボディを定義するためにも使用されます。
AMQPにおけるデータの基本単位はフレームです。2つのピア間でのメッセージ転送の開始、制御、および終了に使用される、9種類のAMQPフレームボディが定義されています。これらは以下のとおりです。
リンクプロトコルはAMQPの中核を成すものです。
アタッチフレームボディは新しいリンクを開始するために送信され、デタッチフレームボディはリンクを切断するために送信されます。リンクはメッセージの送受信のために確立されます。
メッセージは、確立されたリンク上で転送フレームを使用して送信されます。リンク上のメッセージは一方向にのみ流れます。
転送は、フローフレームを使用して管理されるクレジットベースのフロー制御スキームに従います。これにより、プロセスはメッセージ量が多すぎるために処理が過負荷になるのを防いだり、より単純に、サブスクライブリンクが必要なときにメッセージをプルできるようにしたりできます。[ 20 ]
転送された各メッセージは最終的に解決されなければなりません。解決によって、送信者と受信者が転送の状態について合意し、信頼性が保証されます。転送(または一連の転送)の状態と解決の変更は、ディスポジションフレームを使用してピア間で通信されます。このようにして、最大1回、少なくとも1回、正確に1回など、さまざまな信頼性保証を強制できます。[ 21 ]
双方向の複数のリンクをセッションにまとめることができます。セッションとは、2つのピア間で行われる双方向のシーケンシャルな会話であり、開始フレームで開始され、終了フレームで終了します。2つのピア間の接続では、複数のセッションを多重化することができ、それぞれが論理的に独立しています。接続は、送信側のピアの機能が表現された開始フレームで開始され、終了フレームで終了します。
AMQPでは、送信アプリケーションによって作成されるメッセージの部分である「ベアメッセージ」を定義します。この部分は、メッセージが1つ以上のプロセス間で転送されるため、不変であると考えられています。
アプリケーションから送信されるメッセージが不変であることを保証することで、エンドツーエンドのメッセージ署名や暗号化が可能になり、ハッシュやダイジェストなどの整合性チェックが有効に保たれます。メッセージは転送中に中間者によって注釈が付けられることがありますが、そのような注釈は不変の元のメッセージとは区別されます。注釈は元のメッセージの前または後に追加できます。
ヘッダーは、メッセージに対して要求または指定できる配信関連の注釈の標準セットであり、有効期限、耐久性、優先度などが含まれます。[ 22 ]
メッセージ自体は、標準プロパティのオプションリスト(メッセージID、ユーザーID、作成時刻、返信先、件名、相関ID、グループIDなど)、アプリケーション固有のプロパティのオプションリスト(拡張プロパティ)、およびAMQPがアプリケーションデータと呼ぶ本文で構成されています。[ 23 ]
プロパティはAMQP型システムで指定され、注釈も同様です。アプリケーションデータは、アプリケーションが選択する任意の形式およびエンコーディングで送信できます。AMQP型システムを使用して、構造化された自己記述型データを送信する方法もあります。
リンクプロトコルは2つのノード間でメッセージを転送するが、それらのノードが何であるか、あるいはどのように実装されているかについてはほとんど何も想定していない。
重要なカテゴリは、メッセージの送信者と受信者の間のランデブーポイントとして使用されるノード( キューやトピックなど)です。AMQP仕様では、このようなノードをディストリビューションノードと呼び、いくつかの共通の動作をコード化しています。[ 24 ]
これには以下が含まれます。
AMQPはシンプルなピアツーピアシステムでも使用できますが、メッセージング機能のためのこのフレームワークを定義することで、より大規模で高度なメッセージングネットワークにおけるメッセージング仲介者(ブローカー、ブリッジなど)との相互運用性も実現できます。このフレームワークは基本的な動作を網羅していますが、将来的に拡張が可能であり、それらの拡張はさらに体系化および標準化することができます。
AMQPプロトコルバージョン1.0は現在の仕様バージョンです。インターネット規模での相互運用に必要なコア機能に重点を置いています。コア機能が最初に厳密に標準化されたため、以前のバージョンよりも明示的なルーティングは少なくなっています。AMQP 1.0の相互運用性は、以前のバージョンよりも多くの実装者によってより広範にテストされています。[ 37 ]
AMQPのウェブサイトには、OASISバージョン1.0の仕様が掲載されています。
AMQPの以前のバージョン(上記「履歴」参照)は、バージョン1.0のリリース以前に公開され、バージョン1.0とは大きく異なっており、以下のようなものがあります。
これらのオープンプロトコル仕様は、AMQPと同じ、または類似した領域をカバーしています。
Java Message Service (JMS) は、AMQP と比較されることが多い。しかし、JMS は、メッセージプロデューサーとコンシューマーの実装方法を定義する API 仕様 ( Java EE仕様の一部) である。JMS は実装間の相互運用性を保証するものではなく、使用する JMS 準拠のメッセージングシステムは、クライアントとサーバーの両方にデプロイする必要があるかもしれない。一方、AMQP はワイヤレベルのプロトコル仕様である。理論的には、AMQP 準拠の異なるソフトウェアをクライアント側とサーバー側にデプロイできるため、AMQP は相互運用性を提供する。
{{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)