理系学生日記

おまえはいつまで学生気分なのか

MQMDおよびMQIの整理

WebSphere MQ なんて聞いたこともなかったんだけど、なんかまぁ特定エリアではよく使われているらしい。 以下、WebSphere MQ と RabbitMQ とかと比較するのは比較軸としてふさわしくない気がしないでもないけど、Google Trends の結果としては以下のようなかんじ。

まぁそんな製品を勉強しなければならない状況は変わっていないので、いろいろと調べてみてる。 今読んでいるのは WebSphere MQ V6 Fundamentals。これを読んだら、全体感は掴めそうな気がする。

MQMD

個々の MQ メッセージに付与されるヘッダ。WebSphere MQ Message Descriptor の略。 代表的なヘッダフィールドには以下のようなものがある。

  • MsgType: レスポンスを不要とするメッセージであることを示すdatagramや、リクエストとそれに対する返信を示す requestreply、あるいは report など、メッセージの種別を示す。
  • Report: 通信先のシステム (キューマネージャ、あるいは、アプリケーション) に report の返信を要求することを示す。
  • ReplyToQ: 通信先のシステムに対し、「どのキューに」reply あるいは report を返信してほしいのかを示す。
  • ReplyToQMgr: ReplyToQ をホストしているキューマネージャ名を示す。通常、WebSphere MQ は、MQ メッセージが最初に PUT されたキューマネージャ名をこのフィールドに自動で書き込む。アプリケーションでの書き換えは可能。
  • MsgId: 名前のとおり、MQ メッセージの ID。アプリケーションが明示的に指定することも、WebSphere MQ に自動で生成させることも可能。
  • CorrelId: メッセージとメッセージの関連付けるフィールド。通常は、reply MQ メッセージの CorrelId フィールドに request MQ メッセージのメッセージ ID を格納することで、request-reply の対を関連付ける。
  • Persistence: MQ メッセージの永続性を示す。
  • CodedCharSetId: MQ の文脈では CCSID とも呼ばれ、文字コードセットの ID を示す。Web Sphere MQ はこの値を元にして、データを文字に変換することが「できる」 (変換可否は Format に依存し、例えばバイナリデータは変換不可)
  • Encoding: 数値データのエンディアンを示す
  • Expiry: メッセージの生存時間の指定で、1/10 秒単位で指定する。これを超えた MQ メッセージは、次に WebSphere MQ 内で参照 (原文的には "when an attempt is made to retrive or view them by an application") されたタイミングで削除される。WebSphere MQ V6.0 からは "expiry task" というのがあり、定期的にこういうメッセージを削除してくれるらしい。

Expiry については、後の参考文献に示すとおり Legacy Communities - IBM Community に気になる情報がある。Web Sphere MQ V6.0 以上の場合は内部に expiry task が存在しており、5 分毎に消してくれるらしい。コメント欄には以下の既述がある。

By default, the internal expirer task runs every 300 seconds (5 minutes). Lowering the frequency to every second could impact performance depending on your overall configuration (number of queues, etc).

MQI

MQI っていうのは、WebSphere MQ を使用した手続型のメッセージングインタフェースのことで、Message Queue Interface の略。全部で 13 の関数が定義されている。 Java や C++ のようなオブジェクト指向言語で直接使用するわけではないが、JMS 等の実装の中ではこの MQI が使われている。

MQCONN/MQCONNX

WebSphere MQ のキューマネージャとのコネクションを確立するためのインタフェース。MQCONNX は、単純に MQCONN よりも渡せる引数が多くなっているだけ。 成功すると、HConn と呼ばれるコネクションのハンドルを返却する。

MQOPEN

"Connected" な状態になったキューマネージャ上のオブジェクト (Queue を含む) にアクセスするためのインタフェース。ちなみに、キューを開く場合は、Object Descriptor (MQOD) とキュー名とともに、キューマネージャも渡すことで、ローカルキューマネージャが知っている別のキューマネージャに送ることもできる。 MQOPEN が成功した場合は、Hobj と呼ばれるオブジェクトハンドルを返却する。

MQCLOSE

まぁ閉じるんでしょう。あれを。

MQPUT

Open したキューに対し、名前の通りメッセージを PUT する。この MQPUT は、アプリケーションが接続しているキューマネージャ上のキューにメッセージを PUT できるまでブロックする。 ちなみに、Open したキューが「別のキューマネージャ上のキュー」である場合は、ローカルキューマネージャ上のトランスミッションキューに PUT できた時点で制御が戻ることになる。

MQPUT には MQMD とともに、MQPUT の振舞を定める MQPMO (PUT Message Options Structure) を渡すことができる。典型的には、syncpoint (MQ の文脈でいうトランザクション) を使うか否かを制御できる。

MQPUT1

クソみたいに名前がわかりにくいけど、このインタフェースは既述の MQOPENMQPUTMQCLOSE を行う。便利なだけでなく、効率も良い。

MQGET

これは MQGET とは逆に、Open したキューから、名前の通りメッセージを GET する。MQGET の振舞いは MQGMO (Get Message Options Structure) で指定でき、GET したメッセージをキューから消すか残すか、どういう基準でメッセージを選択するか (CorrelId 指定とか) などを既述できる。

MQBEGIN/MQCMIT/MQBACK

WebSphere MQ には、DBMS 等の外部リソースを巻き込んだトランザクションの概念として global unit of work がある。このトランザクションを開始するのが MQBEGINMQCMIT、あるいは MQBACK で終了する。

MQINC/MQSET

あんまり使わないかと思うので今のところ興味がないんだけど、open したオブジェクトの属性を参照するのが MQINC、設定するのが MQSET

MQDISK

キューマネージャとアプリケーションとの接続を切断する。MQCONN あるいは MQCONNX の逆操作。 MQDISK が呼び出されないままアプリケーションが終了し、それをキューマネージャが検知すると、キューマネージャは MQBACK をコールしてロールバックを行い、コネクションを切断する。

参考文献