過去にdeveloperWorksに掲載されていた連載を復旧公開します。
MQの概要・導入・設計・運用の基本を解説します。
MQ V7を元に記述された記事となっておりますのでそれ以降のバージョンや新機能や変更点については記載が無い点容赦ください。
MQ V9.2までの新機能・変更点については以下のマニュアルを参照ください。
1. WebSphere MQとは (前編)
1.1 WebSphere MQとは?
WebSphere MQ(*1)は、アプリケーション間通信用のミドルウェアであり、メッセージ・キューイング・モデルを用いた非同期通信によって異機種システム間のメッセージ転送を保証します。
(*1) 過去のバージョン(V5.2)まではMQSeriesという製品名でしたが、V5.3以降はWebSphere MQという名称になっています。代表的なMQの稼動イメージを下図に示します。
- 非同期モデル
- キュー経由のアプリケーション間通信を行うため、送信側と受信側のアプリケーションが同時に稼働している必要がありません。アプリケーションAがキューAにメッセージをMQPUTすればキューBへのメッセージの配送はMQが保証してくれます。アプリケーション間でコネクションを確立する必要はありません(コネクションレス型通信)。
- また、アプリケーションAはMQPUTの完了後、相手(アプリケーションB)の応答を待たずに次の作業へ移ることができます。
- 相手の応答を確認しながら動作を進める「電話」方式に対し、「郵便」方式に例えられます。
- マルチプラットフォーム対応
- MQは多くのプラットフォーム上で稼動します。サポートされるプラットフォームの詳細は以下のURLを参照ください。
図中に現れる用語について説明します。
- アプリケーション
- MQI
- メッセージ・キュー・インターフェースの略であり、キューにメッセージを保存するMQPUT、キューからメッセージを取得するMQGETなどのインターフェースが用意されています。
- メッセージ
- MQ独自のヘッダーが付加された、アプリケーション間で受け渡されるデータを指します。
以下は代表的なMQオブジェクトです。
- キューマネージャー
- MQのシステムプロセス群であり、以下の機能を提供します。
- キューなどのMQオブジェクトの管理
- 管理コマンドの受付
- ロギング
- エラー情報の書き出し
- キュー
- アプリケーションからのメッセージを一時的に保持するものです。
- 基本的にキュー内のメッセージはFirst In First Out(FIFO)で処理されます。
- チャネル
- ネットワーク経由でメッセージを転送するための仕組みです。チャネルが活動状態の時にはキューマネージャーとキューマネージャー間、又は、キューマネージャーとMQクライアントプログラム(*2)間でメッセージをやり取りすることができます。
- チャネルを構成するエージェント・プログラムであるMCA(Message Channel Agent)によりメッセージの送受信が実行されます。
- (*2)MQクライアントプログラムに関しては後の章で紹介します。
- リスナー
- リモートのキューマネージャーやMQクライアントプログラムからのチャネル接続要求を受け付けるためのデーモン・プログラムです。
- リスナーに設定したプロトコル、ポート番号がMQの通信に利用されます。
これらについての詳細は、次章のMQオブジェクトの説明で解説します
1.2 MQI (Message Queue Interface)
ここでは、メッセージ・キューを用いて相互に通信し合うアプリケーションプログラムを開発するためにMQが提供するAPIであるMQI(Message Queue Interface)について紹介します。
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が動く環境
- VB : Windows
- RPG : OS/4oo, 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の詳細については、以下を参照してください。
http://java.sun.com/products/jms/docs.html
1.3 接続形態
MQの接続形態に関する説明を行います。
MQの接続形態として、下記の3つのタイプが挙げられます。いずれの形態であってもMQPUT、MQGETを実行するアプリケーションプログラムは全く同じものを使用することが可能です。この事からシステムの成長に
合わせた柔軟性を提供する事が可能になります。
スタンドアロン型
同一システム上のアプリケーション間でメッセージ通信を行います。
メモリーやファイルを経由してアプリケーション間のデータのやり取りを行う代わりに、
キューを経由してデータのやり取りを行う例です。
システムの構成は以下のようになります。
-
- キューマネージャー
- ローカルキュー
- メッセージをキューに入れるアプリケーション
- メッセージをキューから取り出すアプリケーション
キューマネージャー接続
異なるシステム上のアプリケーション間で、メッセージ通信を行います。
非同期なアプリケーション連携を実現する、MQを利用する最も典型的な例です。
キューマネージャー間接続を行うために必要な構成を以下に示します。
- 送信側システムの構成
- ローカルキューマネージャー
- リモートキュー定義
- トランスミッションキュー
- チャネルの定義(送信側)
- メッセージをキューに入れるアプリケーション
- 受信側システムの構成
- リモートキューマネージャー
- 宛先ローカルキュー
- チャネルの定義(受信側)
- リスナー
- メッセージをキューから取り出すアプリケーション
MQクライアント接続
MQクライアントはキューマネージャーが稼動していないシステムでもMQアプリケーションを稼動させる事ができる機能です。
メッセージの宛て先となるキューはキューマネージャーが稼動しているサーバー側で管理します。
クライアント側のアプリケーションは接続するキューマネージャーを選択し、メッセージの書き込み・取り出しを行います。
MQクライアント接続を行うためには、クライアントシステム側にMQクライアントモジュールが導入されている必要があります。
またキューマネージャー間接続と異なり、メッセージ通信は同期処理で行われます。
上図のようなMQクライアント接続を行うために必要な構成を以下に示します。
- クライアント側の構成
- クライアント接続の定義
- メッセージをキューに書き込むアプリケーション
- メッセージをキューから取り出すアプリケーション
- サーバー側の構成
- キューマネージャー
- 宛先ローカルキュー
- サーバー接続チャネルの定義
- リスナー
MQクライアント接続におけるクライアント側、サーバー側の特徴はそれぞれ以下のようになります。
- クライアント側
- 全てのMQIコールを使用できます。
- 少ないシステムリソースで動作可能です。
- クライアント側での同期点コーディネーションはMQ資源のみとなります(1フェーズ・コミット処理)。
- サーバー側
- サーバーは常に稼動している必要があります。
- キューマネージャー間接続によるメッセージ転送に比べ、システムリソースを多く消費します。
MQクライアントはCDメディア、およびサポートパックにより提供されています。
サポートパックに関しては以下のURLを参照してください。
-
-
- http://www-01.ibm.com/support/docview.wss?rs=171&uid=swg27007197#1
1.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はデータベース管理システムと同等のロギング機能を有しています。この事により、信頼性のあるメッセージング機能を提供します。
- ログの種類には、ログ容量が少なくて済む循環ログと、過去の履歴を全て保持し障害時の確実な復旧が可能となるリニアログの二種類があります。
- リカバリー
- ロギングされるメッセージ(パーシステントメッセージ)であれば、システムハング、ネットワーク遮断、停電などの、いずれの障害からでもメッセージを復旧できます。ただしディスク障害に対しては、バックアップなどの対策を取る必要があります。
負荷分散と可用性の向上
- クラスター
- 複数のキュー・マネージャーを論理的にグループ化したクラスターを構成することによりシステム管理作業の削減、負荷分散などを実現できます。
1.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ページを参照ください
- http://java.sun.com/j2ee/connector/index.jsp
Web 2.0
MQ V7にはWebSphere MQ Bridge for HTTPと呼ばれるサーブレット・コンポーネントが付属しています。
WebSphere Application ServerなどJ2EE 1.4準拠のアプリケーション・サーバーにデプロイすることでHTTPとMQJMSのブリッジとして動作します。
AjaxアプリケーションなどHTTP通信を行うアプリケーションがMQのキューやトピックにアクセスできるようになります
なります。