レベル: 初級 恩田 洋仁, WebSphereテクニカル・セールス, IBM
2007年 4月 21日 更新 2009年 3月 17日 ご好評の記事、「MQ虎の巻」の久々の改訂版(V7対応)です。今回は第1回「WebSphere MQの特長と主な機能(前編)」を改訂いたしました。
1 WebSphere MQとは
WebSphere MQ(*1)は、アプリケーション間通信用のミドルウェアであり、メッセージ・キューイング・モデルを用いた非同期通信によって異機種システム間のメッセージ転送を保証します。
(*1) 過去のバージョン(V5.2)まではMQSeriesという製品名でしたが、V5.3以降はWebSphere
MQという名称になります。この連載ではこれ以後、MQと省略します。
代表的なMQの稼動イメージを下図に示します。
拡大図
非同期モデル
キュー経由のアプリケーション間通信を行うため、送信側と受信側のアプリケーションが同時に稼働している必要がありません。
アプリケーションAがキューAにメッセージをMQPUTすればキューBへのメッセージの配送はMQが保証してくれます。
アプリケーション間でコネクションを確立する必要はありません(コネクションレス型通信)。
また、アプリケーションAはMQPUTの完了後、相手(アプリケーションB)の応答を待たずに次の作業へ移ることができます。
相手の応答を確認しながら動作を進める「電話」方式に対し、「郵便」方式に例えられます。
マルチプラットフォーム対応
MQは多くのプラットフォーム上で稼動します。サポートされるプラットフォームの詳細は以下のURLを参照ください。
図中に現れる用語についての説明です。
アプリケーション
MQIを使用した適用業務プログラムを指します。
MQI
メッセージ・キュー・インターフェースの略であり、キューにメッセージを保存するMQPUT、キューからメッセージを取得するMQGETなどのインターフェースが用意されています。
メッセージ
MQ独自のヘッダーが付加された、アプリケーション間で受け渡されるデータを指します。
以下は代表的なMQオブジェクトです。
キューマネージャー
MQのシステムプロセス群であり、以下の機能を提供します。
- キューなどのMQオブジェクトの管理
- 管理コマンドの受付
- ロギング
- エラー情報の書き出し
キュー
アプリケーションからのメッセージを一時的に保持するものです。
基本的にはFirst In First Out(FIFO)により処理されます。
チャネル
ネットワーク経由でメッセージを転送するための仕組みです。チャネルが活動状態の時にはキューマネージャーとキューマネージャー間、又は、キューマネージャーとMQクライアントプログラム(*2)間でメッセージをやり取りすることができます。
チャネルを構成するエージェント・プログラムであるMCA(Message Channel Agent)によりメッセージの送受信が実行されます。
(*2)MQクライアントプログラムに関しては後の章で紹介します。
リスナー
リモートのキューマネージャーやMQクライアントプログラムからのチャネル接続要求を受け付けるためのデーモン・プログラムです。
リスナーに設定したプロトコル、ポート番号がMQの通信に利用されます。
これらについての詳細は、次章のMQオブジェクトの説明で解説します。
2 Message Queue Interface
ここでは、メッセージ・キューを用いて相互に通信し合うアプリケーションプログラムを開発するために
MQが提供するAPIであるMQIについて紹介します。
MQIは、アプリケーションがキュー及びキューに保持されているメッセージにアクセスするためのインターフェースです。MQIはアプリケーションが稼動する環境(プラットフォーム、ネットワークプロトコル)の違いを吸収すると共に、リカバリーロジックを始めとする様々な複雑なロジックを提供するため、アプリケーションの開発生産性を大幅に向上させます。
主要なMQIの一覧を下図に示します。
キューマネージャーとの接続、切断
-
MQCONN
キューマネージャーとの接続を確立します。
-
MQCONNX
MQCONNの機能拡張版です。
-
MQDISC
キューマネージャーとの接続を切断します。
オブジェクトのオープン、クローズ
-
MQOPEN
MQオブジェクト(キューなど)をオープンします。
-
MQCLOSE
オブジェクトへのアクセスを解放します。
メッセージのPUTとGET
-
MQPUT
キューへメッセージを書き込みます。
-
MQPUT1
キューをオープンしてメッセージを書き込み、キューをクローズします。
-
MQGET
キューからメッセージを取り出します。
オブジェクトの属性の照会、変更
-
MQINQ
キュー、名前リスト、プロセス定義、キューマネージャーの属性を照会します。
-
MQSET
キューの属性を変更します。
以下は作業単位(UOW:Unit Of Work)を制御するためのMQIです。
作業単位の開始
-
MQBEGIN
キューマネージャーによって調整される作業単位を開始します。
この作業単位は外部リソース・マネージャー(DB管理システム等)を伴うこともあります。
同期点コール
-
MQCMIT
作業単位のコミットを行います。
-
MQBACK
作業単位のバックアウト(処理取り消し)を行います。
以下はMQ V7で追加されたAPIです。
Publish/Subscribe
-
MQSUB
トピックに対してサブスクリプション登録を行います。
-
MQSUBRQ
トピックに対して保存されている最新のパブリケーションを要求します。
メッセージ・プロパティ
-
MQSETMP
メッセージ・プロパティの登録を行います
-
MQINQMP
メッセージ・プロパティを参照します。
-
MQDLTMP
メッセージ・プロパティを削除します。
-
MQCRTMH
メッセージ・ハンドルを作成します。
-
MQDLTMH
メッセージ・ハンドルを削除します。
-
MQBUFMH
バッファーをメッセージ・ハンドルに変換します。
-
MQMHBUF
メッセージ・ハンドルをバッファーに変換します。
非同期メッセージ受信
-
MQCB
処理ルーチンの登録を行います。
-
MQCTL
処理ルーチンの制御を行います。
-
MQCB_FUNCTION
処理ルーチンの登録を行います(CICS用)
非同期メッセージ送信
-
MQSTAT
非同期メッセージ送信の状況を照会します。
(参考)作業単位について
作業単位とは、回復可能な一連の操作のことを指します。
作業単位は、トランザクションの開始時またはユーザーが要求した同期点のあとから始まり、ユーザー要求の同期点、またはトランザクションの終了時に終わります。
(参考)同期点について
同期点とは、トランザクション処理における中間点または終点であって、リソースの整合性を維持している点のことを指します。
同期点では、リソースへの変更内容をコミットしたり、直前の同期点までバックアウトしたりできます。
開発時に利用可能な言語
利用可能な言語のうち、主なものを挙げます。
| 言語 | プラットフォーム |
|---|
| C | MQがサポートするほとんどのプラットフォーム | | C++ | MQがサポートするほとんどのプラットフォーム | | Java(※1) | JVMが動く環境 | | Visual Basic | Windows環境 | | C# | Windows環境 | | RPG | OS/400, i5/OS, System i | | COBOL | z/OS等 | | PL/I | z/OS等 |
(※1)MQが提供するJava用のAPIには、MQ Base JavaおよびJMS(Java Messaging Service)の二種類があります。
JMSは、Java EEで規定されている非同期メッセージングのための仕様であり、MQ V5.2以降で使用可能です。
JMSの詳細については、以下を参照してください。
3 接続形態
MQの接続形態に関する説明を行います。
MQの接続形態として、下記の3つのタイプが挙げられます。いずれの形態であってもMQPUT、MQGETを実行するアプリケーションプログラムは全く同じものを使用することが可能です。この事からシステムの成長に合わせた柔軟性を提供する事が可能になります。
スタンドアロン型
同一システム上のアプリケーション間でメッセージ通信を行います。
メモリーやファイルを経由してアプリケーション間のデータのやり取りを行う代わりに、キューを経由してデータのやり取りを行う例です。
システムの構成は以下のようになります。
- キューマネージャー
- ローカルキュー
- メッセージをキューに入れるアプリケーション
- メッセージをキューから取り出すアプリケーション
拡大図
キューマネージャー接続
異なるシステム上のアプリケーション間で、メッセージ通信を行います。
非同期なアプリケーション連携を実現する、MQを利用する最も典型的な例です。
キューマネージャー間接続を行うために必要な構成を以下に示します。
送信側システムの構成
- ローカルキューマネージャー
- リモートキュー定義
- トランスミッションキュー
- チャネルの定義(送信側)
- メッセージをキューに入れるアプリケーション
受信側システムの構成
- リモートキューマネージャー
- 宛先ローカルキュー
- チャネルの定義(受信側)
- リスナー
- メッセージをキューから取り出すアプリケーション
MQクライアント接続
MQクライアントはキューマネージャーが稼動していないシステムでもMQアプリケーションを稼動させる事ができる機能です。
メッセージの宛て先となるキューはキューマネージャーが稼動しているサーバー側で管理します。
クライアント側のアプリケーションは接続するキューマネージャーを選択し、メッセージの書き込み・取り出しを行います。
MQクライアント接続を行うためには、クライアントシステム側にMQクライアントモジュールが導入されている必要があります。
またキューマネージャー間接続と異なり、メッセージ通信は同期処理にて行われます。
上図のようなMQクライアント接続を行うために必要な構成を以下に示します。
クライアント側の構成
- クライアント接続の定義
- メッセージをキューに書き込むアプリケーション
- メッセージをキューから取り出すアプリケーション
サーバー側の構成
- キューマネージャー
- 宛先ローカルキュー
- サーバー接続チャネルの定義
- リスナー
- メッセージをキューから取り出す(MQGET)アプリケーション
MQクライアント接続におけるクライアント側、サーバー側の特徴はそれぞれ以下のようになります。
クライアント側
全てのMQIコールを使用できます。
少ないシステムリソースで動作可能です。
クライアント側での同期点コーディネーションはMQ資源のみとなります(1フェーズ・コミット処理)。
サーバー側
サーバーは常に稼働している必要があります。
キューマネージャー間接続によるメッセージ転送に比べ、システムリソースを多く消費します。
MQクライアントはCDメディア、およびサポートパックにより提供されています。
サポートパックに関しては以下のURLを参照してください。
4 WebSphere MQの主な機能
MQの主な機能には以下のようなものがあります。
メッセージ処理
-
ブラウズ処理
キュー内のメッセージを削除せずに照会ができます。
-
優先処理
メッセージに優先順位をつけてPUTすることができます。優先度は0~9の整数値で指定できます。
-
メッセージIDと相関ID
同一キュー内で特定のメッセージを識別するために2種類のキー(メッセージID、相関ID)が用意されています。
MQPUT/MQGET時にこれらのIDを扱うことにより特定のメッセージをキューから取り出す事が可能です。
-
永続性
キューマネージャーの再始動をまたがって、メッセージを保持することができます。
-
グループ化、セグメント化
1つのメッセージを物理的に分割したり(セグメント化)、複数のメッセージを論理的にまとめて扱ったり(グループ化)できます。
-
文字コード変換
ユーザー・メッセージの文字コード変換を行うことができます。文字コード変換は送信側のシステムでも受信側のシステムでも実行することが可能です。
-
参照メッセージ
MQのメッセージ長制限(100MB)を超えるファイルをキューを介さずに転送する事が可能です。
この機能により、事実上最大メッセージ長の制限をなくすことができます。
-
暗号化
SSL/TSLの機能によりチャネル転送時におけるメッセージの暗号化や改ざん防止が可能です。
-
データ圧縮
データ圧縮機能によりチャネル転送時のメッセージ圧縮が可能です。
トランザクション・サポート
-
同期点処理
コミットプロトコルに基づいた、信頼性あるデータ転送を提供します。
-
データベース・コーディネーション
キューマネージャーはトランザクションマネージャーとしての機能を持っています。 XAインターフェースを用いた2フェーズ・コミットを行うことで、MQリソース(メッセージ)とDBの同期を取ることが可能です。
モニタリング
-
エラー/システム・メッセージ
MQは、発生したエラーを、エラーログとしてファイルに書き出したりイベント・ビューア(Windows)などのシステムログに書き出したりする機能を提供します。
これらのメッセージを問題判別に用いることができます。
-
イベント
イベントを使用すると、キューマネージャーの動作をモニターできます。
例えばキュー内のメッセージが一定量に達したときに、システム管理者に警告を発するなどの処理を行うことができるようになります。
メッセージ・ドリブン処理 以下の機能はメッセージの到着をきっかけにアプリケーションの起動や特定の関数呼び出しを行うための機能です。
-
待ち受け受信機能
MQGET関数にWAITオプションを指定することでメッセージの到着を待ち受けるプログラムを記述することができます。
これにより簡単にメッセージの到着を待つ常駐プログラムを作成することができます。
-
非同期メッセージ受信機能(V7~)
コールバック関数を呼び出させる事ができます。コールバック関数にメッセージ受信処理を実装する事によって、MQGETでメッセージを待ち受けるためにアプリケーションが処理を休止する必要が無くなります。
-
トリガー機能
キューにメッセージが到着するなどの特定の条件を満たしたとき、アプリケーションを自動的に起動させることができます。
必要に応じて、メッセージ(1つまたは複数)が処理されたときに、アプリケーションを停止させることもできます。
障害対応
-
ロギング
MQはデータベース管理システムと同等のロギング機能を有しています。この事により、信頼性のあるメッセージング機能を提供します。
ログの種類には、ログ容量が少なくて済む循環ログと、過去の履歴を全て保持し障害時の確実な復旧が可能となるリニアログの二種類があります。
-
リカバリー
ロギングされるメッセージ(パーシステントメッセージ)であれば、システムハング、ネットワーク遮断、停電などの、いずれの障害からでもメッセージを復旧できます。
ただしログファイルはディスク障害に備えて二重化を検討する必要があります。
負荷分散と可用性の向上
-
クラスター
複数のキューマネージャーを論理的にグループ化したクラスターを構成することにより、システム管理作業の削減、負荷分散などを実現できます。
5 MQ V7の新機能とMQの新しいテクノロジー
ここでは、2008年6月に出荷開始されたMQ V7.0で強化された機能を中心に最新テクノロジーへの対応状況を紹介します。
Publish/Subscribeの機能強化 メッセージングには大きく二つのメッセージ通信モデルがあります。
-
Point-to-Point型
送信アプリケーションと受信アプリケーションがキューを介して1対1で通信するモデルであり、 MQで一般的に利用されてきました。
- Publish/Subscribe型(Pub/Sub型)
送信アプリケーションと受信アプリケーションがトピックを介して多対多で通信するモデルです。 Pub/Sub型のメッセージングではトピックを介してメッセージの受け渡しが行われます。 送信プログラムはメッセージをトピックに対してPublishします。 受信プログラムは関心のあるトピックに対してSubscribeを行うことで、そのトピックに対するメッセージを受信できるようになります。
送信プログラムは送信したメッセージが誰によりSubscribeされるかを意識しません。 受信プログラムも受信するメッセージを誰がPublishしたものなのかを意識しません。
Point-to-Point型のモデルよりも一層疎結合な通信が可能で、メッセージのやり取りを行うプログラムが追加・削除される際にシステムに与える影響を最小化することができます。
MQ V6までのMQIはPoint-to-Pointモデルに最適なように設計されていました。Pub/Subモデルの通信も可能でしたが、専用のAPIは提供されておらず、煩雑なプログラミングが必要でした。
MQ V7からはPub/Sub用のAPI、およびトピック、サブスクリプション等のPub/Sub関連のMQオブジェクトが新たに追加され、簡単にPub/Subアプリケーションが作成できるようになりました。
Java標準のメッセージング・インターフェースであるJMS(Java Message Service)ではPub/Sub用のAPIが以前から提供されていましたが、V7でMQネイティブのAPI(MQI)でPub/Subをサポートするようになったおかげでパフォーマンスが大幅に改善されました。
JMSとの相互運用性強化 MQ V7ではMQネイティブのAPI(MQI)とJava標準のメッセージング・インターフェースであるJMSとの相互運用性が強化されました。
MQ V6まではJMSに備わっている以下の機能がMQIでは提供されていませんでした。
- Pub/Sub API
- メッセージ・プロパティへのアクセス
- メッセージ・セレクター
- 非同期リスナー
V7では上にあげた機能を実現するAPIがMQIに追加され、MQIを利用する場合もJMS同様の機能を簡単に利用できるようになりました。
逆にJMSを利用した場合、V6までは一部のMQメッセージのヘッダー(MQMD)に対するアクセスが制限されていましたが、V7でJMSを利用する場合には、追加されたJMSプロパティを介して、MQMDへアクセスできるようになっています。
上記の機能強化によりMQIアプリケーションとJMSアプリケーションの相互運用性が強化されています。
JCAアダプターの提供 MQ V6.0.2.1よりJCA1.5対応のアダプターを提供するようになりました。 JCAアダプターは、J2EE 1.4 仕様に準拠するすべてのアプリケーション・サーバー上にインストール可能です。
MQがより多くのJava EEアプリケーション・サーバー上からJMSインターフェースを介して利用できるようになりました。
JCAアダプターについての詳細は下記のWebページを参照ください。
Web 2.0 MQ V7にはWebSphere MQ Bridge for HTTPと呼ばれるサーブレット・コンポーネントが付属しています。 WebSphere Application ServerなどJ2EE 1.4準拠のアプリケーション・サーバーにデプロイすることでHTTPとMQJMSのブリッジとして動作します。 AjaxアプリケーションなどHTTP通信を行うアプリケーションがMQのキューやトピックにアクセスできるようになります。
参考文献
著者について  | |  | 恩田 洋仁, WebSphereテクニカル・セールス, IBM |
記事の評価
|