メッセージキューとは
メッセージキューは、
ソフトウェアコンポーネントの一種で、
プロセス間通信や同一プロセス内のスレッド間通信に用いられます。これは、制御やデータを伝達するメッセージを一時的に格納するキュー(待ち行列)の役割を担います。
概要
メッセージキューは、非同期型
通信プロトコルを提供します。つまり、送信側と受信側が同時に通信する必要がなく、送信されたメッセージは受信側が取り出すまでキューに保持されます。メッセージキューには、格納できるメッセージのサイズや保持できるメッセージ数に上限が設けられていることが一般的です。
メッセージキューの実装は多岐にわたります。
オペレーティング[[システム]] (OS) 内に実装される場合や、
アプリケーション[[ソフトウェア]]内に実装される場合があり、それぞれの
システムが必要とする用途に応じて使用されます。また、コンピュータ間でのメッセージのやり取りや、複数のアプリケーション、複数のOS間を接続する目的でも利用されます。特に、
システム障害が発生してもメッセージが失われないように、回復力を持たせた実装が重要視されます。
実装例
メッセージキューを実装した商用
ソフトウェアとして、以下のようなものが挙げられます。
IBM WebSphere MQ
Oracle Advanced Queuing (AQ)
Microsoft MSMQ
日立製作所 TP1/MessageQueue
セゾン情報システムズ HULFT-Message
また、Java関連の標準であるJava Message Service (JMS) には、オープンソースのものとプロプライエタリのものを含め、様々な実装が存在します。
メッセージ関連のミドルウェアシステムとしては、以下のオープンソースソフトウェアがあります。
JBoss Messaging
JORAM
Apache ActiveMQ
Apache Qpid
RabbitMQ
Skytools PgQ
Mule
OpenMQ
リアルタイムOS(RTOS)であるVxWorksやQNXでは、メッセージキューが主要なプロセス間通信機構やスレッド間通信機構として採用されています。これらの環境では、リアルタイム性が重要視されるため、メッセージキューとCPUスケジューリングが密接に関連しています。1980年代初期には、VRTXやpSOS+といったRTOSで、メッセージキューを使ったスレッド間通信機構が使用され始めました。
利用方法
メッセージキューの一般的な利用方法は以下の通りです。
1. システム管理者がメッセージキューソフトウェア(キューマネージャ)をインストールし、名前付きのメッセージキューを定義します。
2. アプリケーションは、キューにメッセージが置かれるのを待つリスナーを登録します。
3. 別のアプリケーションがキューに接続し、メッセージを送信します。
4. キューマネージャは、受信側アプリケーションが接続するまでメッセージを蓄積し、接続時に登録されたリスナーを呼び出します。
5. 受信アプリケーションはメッセージを処理します。
バリエーション
メッセージキューには、以下のような様々なバリエーションが存在します。
永続性: キューをメモリ上に置くか、ディスク上に置くか、またはDBMSに置くか。
セキュリティポリシー: メッセージへのアプリケーションのアクセス権の認証。
メッセージ消去ポリシー: キューやメッセージに生存時間 (time to live) を設定。
データフィルタリング: 受信側が設定した基準に合致するメッセージのみを受け取る。
配布ポリシー: メッセージが少なくとも1回配布されることを保証するか、複数回配布されないことを保証するか。
ルーティングポリシー: キュー(サーバ)が複数存在する場合のメッセージの受け渡し方法。
バッチポリシー: メッセージを即時配布するか、溜まったメッセージをまとめて配布するか。
エンキューの定義: メッセージがどこかのキューに置かれた場合を指すか、リモートのキューに置かれた場合を指すか。
送信側の確認: 送信側が受信側のメッセージ受信を知る必要があるか。
これらの要素は、
システムの意味論、信頼性、効率に影響を与えるため、設計時に考慮すべき重要な点です。
標準とプロトコル
メッセージキューは、当初プロプライエタリな閉鎖的プロトコルで利用されることが多く、異なるOSやプログラミング言語環境での利用が制限されていました。
標準化の動き
JMS (Java Message Service): サン・マイクロ[[システムズ]]が提唱したJMSは、JavaによるクライアントAPIを抽象化し、異機種間接続を可能にしました。これにより、Java環境でのメッセージキューのプロバイダー切り替えが容易になりました。
メッセージキューの標準化を促進するために、以下のオープンな標準が策定されました。
Advanced Message Queuing Protocol (AMQP)
Streaming Text Oriented Messaging Protocol (STOMP)
これらの標準は、HTTPと同じレベルで運用されることを想定しており、メッセージキューの利用をより広く普及させることを目的としています。
HTTPベースのメッセージキュー
プロプライエタリな実装の中には、Amazon SQSのように、HTTPを使ってメッセージキューを提供するものもあります。これは、要求-応答型の同期プロトコルの上で、非同期動作を実現できるためですが、下層プロトコルの制約を受けるため、メッセージキューのすべての機能を提供できない可能性があります。
同期と非同期
多くの通信プロトコルは同期型であり、HTTPなどが代表例です。同期モデルでは、システムがコネクションを確立し、要求を送信し、応答を待ちます。しかし、非同期モデルでは、システムは要求を送信した後、応答を待たずに他の処理を実行できます。
非同期モデルの例
AJAX: Webページの一部を非同期に更新する技術です。
イベント通知システム: アプリケーションが別のアプリケーションにイベント発生を通知し、応答を待つ必要がない場合。
出版-購読型システム: アプリケーションが情報を複数の受信者に配信する場合。
非同期モデルの利点
同期モデルでは、応答を待つ間に処理がブロックされるため、
システム全体の性能が低下する可能性があります。一方、非同期モデルでは、応答を待つ必要がないため、
システム全体の応答性を高めることができます。メッセージキューは、非同期処理を実現するための重要な技術です。
活用例
対話型アプリケーションでは、ユーザーの要求に即座に応答する必要がありますが、その一方で、処理を遅延させても問題ない部分もあります。例えば、請求金額の計算やデータベースへの登録などは、非同期型のメッセージキューを使って遅延処理することができます。これにより、
システム全体のパフォーマンス(特に顧客から見た応答性能)を向上させることが可能になります。
まとめ
メッセージキューは、
システム間での非同期通信を円滑にするための重要な技術であり、信頼性、効率性、柔軟性を考慮した設計が求められます。様々な実装とプロトコルが存在しますが、適切なメッセージキュー
システムを選択し、活用することで、
システム全体のパフォーマンスを向上させることができます。
関連項目
Advanced Message Queuing Protocol
Enterprise Message Service (TIBCO softwire)
IBM WebSphere MQ
Java Message Service
メッセージ指向ミドルウェア
Microsoft Azure Services Platform
RabbitMQ
外部リンク
Minimalist Queue Service (MQS) -
Perlで実装されたメッセージキュー
システム