【IDM】MSMQ を使って確実なユーザー登録を行う その1 ~ MSMQ って何してくれるの?

こうも天気がよいと、なんだかどうでもよくなりますね。メタボドンと来い!ってかんじです。

さて、現在募集中の TechEd ライトニングトーク 登壇者に向けたサンプルスライドを作ってみたわけですが、せっかくなので少し詳細に解説したいと思います。

【TechEd】ライトニングトーク サンプル ~ MSMQ を使用した確実なユーザー登録 ~

MSMQ って、そもそもご存知でしょうか?意識してインストールしないと「コンピュータの管理」にも出てこないので、「始めて聞いた」という方もいらっしゃるかもしれません。

Microsoft Message Queueing(Microsoft Message Queue Service てのは古い言い方だったようです。失礼しまし) の略で、分散メッセージングアプリケーションを開発するための基盤となるサービスです...と書くと、なんか IT Pro とは無縁のもののように思えてきますが、これがまた使ってみるとやめられなくなるくらい面白いです。Developer だけに触らせていたのではもったいないので、IT Pro も使いましょう!

で、ここでいう「メッセージ」という言葉ですが、これはメールのようなものだと思ってください。次々と送られてくるメッセージをうまく捌くためのエンジンが MSMQ です。

では、MSMQ がなんでユーザー登録にとって便利なのかということですが。

ユーザー登録は、基本的にシーケンシャルな処理です。おそらく、スクリプトには以下のようなコードを書くことになるでしょう。

  1. ユーザー一覧が書かれたCSVファイルを開く
  2. CSVファイルを1行よみとる
  3. ユーザーIDをキーにしてActive Directory 上にユーザーを作成
  4. 作成できたら氏名やホームディレクトリ等をセット
  5. 登録結果の確認処理後、ログを吐き出し
  6. 2.に戻って繰り返し

例えば10000人のユーザーを登録する場合、すべての処理をひとまずやってしまってから、ログから正常に終了したかどうかを確認する必要があります。処理に慣れている方であれば、「失敗したユーザー一覧」を別に吐き出して、それをベースに再登録を行ったりなんてことも考えるのではないでしょうか。

処理が失敗する原因はいくつか考えられます。

  • ネットワーク障害
  • ドメインコントローラ側の障害
  • 登録データの不備
  • コードの不備(想定外の入力データ等)

いずれにしても重要なのは、失敗した後のことがきちんと想定されているかどうかということです。

そのためにも、ILM などのパッケージを導入するのがお勧めなわけですが、そうは言ってもお金がかかる世界ですから内々でなんとかできるものならなんとかしたい。。と思うのが人情ってものです。

そこで、OS標準機能である MSMQ を使ってしまい、エラー処理に関するコーディングを簡略化してしまおうと。

以下の図をご覧ください。

クリックで拡大

この図の上に書かれた流れが、いまお話した普通の方法です。

下に書かれているのがMSMQを使用した方法です。

「普通の方法」の場合、エラー処理はバッチ処理全体として考慮する必要があるため、制御が面倒になります。コードも増えますので、ミスも発生しやすく、出来上がってみれば完全なスパゲッティコード(うわ、古い表現)になってしまうこともシバシバ。

#もしかして、それは僕の頭が悪いから??

そこで、従来バッチ的に行っていたユーザー登録を、一人づつのジョブに分割し、コードはあくまでも「一人を登録するための処理」として記述すればよいため、コーディングを簡略化することができます。

MSMQ には、「トリガー」という便利が機能が用意されており、

ジョブ(メッセージ)が生成されたらあらかじめ関連付けられたプログラムを自動実行する

ことができます。これがまた、たまらなくうれしいです。もちろん、リアルタイムに処理されます。

トリガー機能を自身でコーディングしようとしたら...WMIでファイルシステムの変更を検出して、ファイルを正当性をチェックし、問題が無ければスクリプトを起動する...なんて処理をサービスプログラムとして作成して常駐化しなければなりません。それだけなら「なんだ簡単ジャン」という声もあるかもしれませんが、インストーラを作ったり、環境設定用のGUIを作ったり、ドキュメントを作ったり...納品するまでには長い道のりをたどらなければなりません。

MSMQ のトリガー機能を使用することで、作成するスクリプトは増えますが、個々のスクリプトが完全に独立しているためメンテナンス性や生産性が向上しますし、キューを増やすことで複数の処理を平行に動かすことも可能になります。

例えば、大量のユーザー登録を行っている最中にパスワードリセットを行わなければならない場合には、そちらを優先して行いたいですよね。その場合には、パスワード変更用のキューを独立させておけばユーザー登録とパラレルに処理が走ります。

また、もし処理が失敗してしまったら、いちいちログを吐き出してやり直すなんてことは考えず、ジョブをいったん「失敗キュー」に移動後、再び元に戻してあげれば、トリガーによって処理を繰り返すことが可能です。もちろん、「すぐに繰り返さずに、すこし待つ」なんて考慮も必要ではありますが、バッチ処理で考慮するよりははるかにシンプルに実装できます。

どうでしょう。使いたくなりましたよね、MSMQ。

次回は、MSMQ のインストールと環境設定を行います。

MSMQ についてもっと勉強したい!という方は、MSDN の以下のページをご覧ください。日本語で丁寧に解説されています。

Microsoft Message Queueing(日本語)
http://msdn.microsoft.com/ja-jp/library/bb970313.aspx

メッセージキュー SDKドキュメント(日本語)
http://msdn.microsoft.com/ja-jp/library/cc448132.aspx

OSにもヘルプがついていますので、そちらもご覧ください。