ØMQ がちょっと面白そうだったので、サンプルを書いて動作確認してみました。
MQ という名前がついているので MOM の一種かと思うのですが、ちょっしたキューの機能はあるものの、メッセージの永続化やトランザクション機能を持っていないので、下記の解説にもあるとおり使いやすいソケットライブラリと考えた方が良さそうです。
The Intelligent Transport Layer - zeromq
ØMQ \zeromq\:
Ø The socket library that acts as a concurrency framework.
Ø Faster than TCP, for clustered products and supercomputing.
Ø Carries messages across inproc, IPC, TCP, and multicast.
Ø Connect N-to-N via fanout, pubsub, pipeline, request-reply.
Ø Asynch I/O for scalable multicore message-passing apps.
Ø Large and active open source community.
Ø 30+ languages including C, C++, Java, .NET, Python.
Ø Most OSes including Linux, Windows, OS X.
Ø LGPL free software with full commercial support from iMatix.
以下、動作確認メモ。
[ØMQ ( zeromq ) 事始め の続きを読む]おそらくこういう事をやろうという人がいないのだろうと思いますが、ググっても情報が出てきません。やりたいのは以前に書いた「Ruby から MSMQ を使う」「JRuby と IronRuby と Ruby-mingw32 のスレッド実装の違い」のあわせ技のような感じなのですが、意外と時間がかかってしまいました。
大まかな話としては Java から COM を呼び出せれば目標達成なわけなので、JRubyも使っていると思っていたJACOBというライブラリを使ってみました。
JACOB - Java COM Bridge | Download JACOB - Java COM Bridge software for free at SourceForge.net
JACOB is a JAVA-COM Bridge that allows you to call COM Automation components from Java. It uses JNI to make native calls to the COM libraries. JACOB runs on x86 and x64 environments supporting 32 bit and 64 bit JVMs
これで最低限のことはできるのですが、どうしても既存のAPIだけでは定数が名前で呼び出せません。最初はちょっとダサいけど、ライブラリの制限なので仕方ないかなーと思いましたが、よくよく考えたらjruby-win32ole は WIN32OLE::const_load で定数取れてるじゃないかということに気づいたので、じゃあそのの実装はどうなってるんだろうと調べ始めてしまったのが、運の尽きでした。
[Java から MSMQ を使う の続きを読む]先日ちょっと書いたRuby から MSMQを使う話の続き。
このプログラムをちょっといじって、スレッドを使って複数のキューを待つようにしてみたら、うまく動かなくて色々試行錯誤したのでメモ。
結論から述べると、スレッドでやりたい場合にはRuby 1.9系に移行するのがいいみたいです。
どうしても1.8でやりたい場合には、forkなどを使ってマルチプロセス化しないといけなさそうな感です。
この対処方法は誤りです。現状のWin32OLEはマルチスレッド動作しません。
MSMQでRubyからメッセージ受送信できる方法を調べてみたのでメモ。
ちょっと調べてみたところ、RubyにはMSMQ向けのライブラリはないようなのでWIN32OLE経由で呼び出だすことにします。よって、ホストがWindowsでない場合、以下のサンプルスクリプトは動作しません。MSMQのCOMのインタフェイスについてはMSDNの「メッセージ キュー COM コンポーネント」で調べることができます。
プログラミング自体はそんなに難しくはありませんが、ハマりやすいポイントとしてはキューがトランザクションキューかそうでないかで、受送信方法が異なることでしょうか。トランザクションキューにするか否かの設定はキュー作成時に行う必要があり、作成後は変更することができないので、うっかりキューの種類にそぐわない方法で受送信を行おうとするとうまくいきません。
[Ruby から MSMQ を使う の続きを読む]仕事でバッチの多重起動を防止するスクリプトを書いたのですが、これだと後続のバッチがキャンセルされてしまって実行されないので、ジョブをQueueに溜めて逐次実行してくれる仕組みが欲しくなったので、Rubyを使ってMQサーバを書いてみました。
RubyにはQueueクラスがあるので、これを使ってdrbからメッセージを投げ込むようにすれば簡単なMQサーバはすぐにできるのですが、これだとメッセージの永続化機能がないので、不慮の事故でマシンの電源が落ちたりするとそのままメッセージが消滅してしまいます。それだと色々と問題があるので、今回はap4rのバックエンドにも使われている永続化機能を持ったメッセージキューであるreliable-msgを使います。
僕がかつて使っていたIBM MQ Series ( Webshere MQ Series )と比べればおもちゃのようなものですが、ちょっと使う分にはこれで十分です。
[Rubyでお手軽MQ の続きを読む]前々からPHPでMOM使えたら便利なんだけどなぁと思ってたんですが、PHPからActiveMQを呼び出す方法があるみたいです。これはちょっと面白そう。これはmemcached以来の発見かもしれません。
秋元@サイボウズラボ・プログラマー・ブログ: PHPでメッセージキューを使う
ActiveMQは、デフォルトでStompプロトコルもサポートしているので、Stompを話すコードを書くか、自分の使っている言語でStompライブラリを探せばよい。Stompライブラリのほうは、SubVersionでのみ公開。一ファイルだし中身もとても短いが、PHPからActiveMQを(というかStompプロトコルに対応したサーバを)呼び出すことができるライブラリ。
使いどころとしてすぐに思いつくのはメールまとめ送りとかだけど、オンラインバッチのトリガをキューに入れておいたりすると便利なんだよな。ちょっと時間を作って試してみようと思います。
ちなみに表題の表記をMQにしないのは、どうもMQというと以前使っていたIBM MQを思い出してしまうからです。
最近、研究のために開発するアプリで採用するアーキテクチャを考えています。大体OKかなというレベルにまでまとまってきたと思っていたのですが、要件を良く考え直してみたみると大量にメールを送る処理があることをすっかり見落としていることに気づきました。
メール送信は意外に時間がかかるので、その部分はやっぱりトランザクションから切り離したい。さらに、大学のメールサーバはメンテナンスが十分に行き届いているとはいえない*1ので、再送のことなんかを考え始めると非常に頭が痛いところです。
バッチ処理とかがほとんど必要ないアプリケーションなので、同期処理の部分だけに頭がいっていて、非同期処理部分をぜんぜん考慮していませんでした。
ソフトウェア設計は難しいです。まだまだ修行が必要ですね。
[JMSを調べる の続きを読む]