大規模アプリケーション開発時には,処理負荷の分散あるいは集約にメッセージキューイング(Message Queuing)が有効な場合が多い。負荷の分散に対して,メッセージキューイングは無理なく適合する。ひとつのキューに複数の受信処理をアタッチしておけば,ほとんどの場合は十分だ。集約は通常,単一の受信者と複数の送信者という形式で実装され,多数の更新処理を大きなブロックにまとめるために使用される。insert/update 文の個別の実行に代えて bulk insert を使用するなど,高度なデータベーステクニックの利用が容易になる。
.NET のエコシステムには,メッセージキューイングを使用するための選択肢がいくつか存在する。この記事では,人気のある機能やユニークな機能を紹介するとともに,それらを評価する上で必要な基本的用語についても取り上げる。
用語
キュー:キューを理解するのは簡単だ。ひとつ以上の送信者がメッセージを追加し,ひとつ以上の受信者が送信時と同じ順序でそれを取り出す。キューは,個々のメッセージがただひとつの受信者に配信されるように設計されている。ただしそれを保証するレベルは,使用する製品や設定方法によってまちまちだ。
トピック: トピックという概念は,MSMQ 以外の使用経験がない .NET 開発者には目新しいかも知れない。キューとは違って,トピックでは出版/購読(publish/subscribe)の機構を採用する。個々のメッセージは,すべての購読者(subscriber)が参照可能である。トピックはコントロールメッセージの送信には大変便利だが,処理の遅い受信者によって他の受信者への配信が阻害されないように考慮する必要がある。そのような受信者による影響の度合いはキューと同じく,使用する製品やその設定方法によって異なる。
トランザクション:データベースと同じように,メッセージキューイングでもトランザクションをサポートすることが多い。通常は,メッセージが参照されてからサーバがコミットを受信するまでの間,メッセージを削除せずに保持しておく,という意味である。
恒久的メッセージ (Durable Messages):システム再起動後も存続するメッセージである。恒久的メッセージは,ある種のメッセージには必要不可欠かも知れないが,その他のケースではパフォーマンスコストに見合うメリットが得られない場合がある。
サービスバス:サービスバスというのはかなり漠然とした用語で,多種多様な製品や機能に対して頻繁に使用されている。メッセージキューイングのコンテキストにおいては,メッセージキューイングライブラリの機能を拡張する製品の意味で用いられる。
製品
Microsoft Message Queuing,別名 MSMQ ,は Windows NT 4 時代からの長い歴史を持った製品であり,C++ や COM,.NET 自体,WCF など,幅広いバインディング機能を提供する。MSMQ はトピックをサポートしていないため,過大な開発作業を必要としない設計パターン範囲は非常に制限されたものになる。これを回避する手段として,MassTransit や NServiceBus といったサービスバスを MSMQ 上に配置する構成が検討されることが多い。また最大限の信頼性が必要な環境に対して,Windows スタイルの分散トランザクション機能がサポートされている。
Apache の ActiveMQ は,クロスプラットフォームのサポートが必要な状況でよく利用される製品だ。ActiveMQ では主要な通信手段として,Apache の OpenWire プロトコルを使用する。Apache ではこれを Java,C,C++,.NET でバインディング可能な高性能クライアントと位置付けた上で,Ruby や Perl,Python,PHP,ActionScript あるいは Flash,Smalltalk からのアクセスには Stomp という名称の別製品を推奨している。ActiveMQ は JMS 1.1 と J2EE 1.4 に完全準拠し,キューとトピックの両方,JMS および XA 形式のトランザクションをサポートする。
ZeroMQ は非常に軽量なメッセージキューイング製品である。他の製品のようなスタンドアロンのサーバを持たず,アプリケーションからアプリケーションに直接メッセージを送信する。ZeroMQ は,非常に高いパフォーマンスを提供できるように設計されている。Mike Hadlow 氏は 1K のメッセージを使用して,ZeroMQ が MSMQ や ActiveMQ より 10 倍以上高速である ことを実証した。この性能を実現するために,恒久的メッセージや分散トランザクションといった,他の製品が備えている信頼性に関する機能が犠牲になっている。ZeroMQ は ActiveMQ と同様,ほとんどのオペレーティングシステムと言語で使用可能だ。
WebSphere MQ: これは実際には "HTTP,REST,ファイル転送,JMS" などをサポートする,IBM のメッセージ製品ファミリである。正式名称を MQSeries というこの製品は,今回のリストの中で唯一,商用ライセンスを別途必要とするものだ。(MSMQ は Windows に含まれる。その他はオープンソースである。) この製品には 1992 年からという,MSMQ に劣らない長い歴史がある。ただし開発ははるかに積極的で,現在稼働しているほとんどすべてのサーバクラスのオペレーティングシステムで稼働し,COBOL から .NET WCF に至るあらゆるバインディングを備えている。