ここを編集
※ メモ状態
※ メモ状態
概略
Message Queueとは?
通信にキューを使う。非同期かつ疎なシステムを構築するのに便利。基本的にはソケットのようなストリーミング(バイト単位)通信ではなく、メッセージング(メッセージの固まり)通信なのでプログラムしやすい。中核はPush/Pull通信だが、ライブラリ全体ではしばしばPub/SubやReq/Rep通信もサポートされる。
ライブラリ/サーバ
WebsphereMQ(IBM)
IBMのWebsphereシリーズの一角。一度位使ってみたいなぁ。
ActiveMQ(Aphache)
JMS。処理速度は遅め?
RabbitMQ(rabbitmq)
AMQP。Erlang言語で記述されている。
MSMQ(Microsoft)
Windowsに標準でついている。性能はわからないが使った感じ、まぁまぁ。.NETからの使いやすさが抜群。
ØMQ(zeromq)
ZeroMQ, zmq, 0mqなどとも。プロトコルは独自?だと思う。TCP,IPCなどが使える。上記とは毛色の異なるメッセージキューライブラリ(拡張ソケットライブラリ)。オンメモリなので消える。おそらく速い。
Let's Start ØMQ !!
インストール
MacならMacPortでzmqを検索してインストールすればOK。Linuxもおそらく。
メモ
基本的には抽象レベルの高いソケットライブラリと思えばよい。通信モデル(Push/Pullなど)を指定したソケットを作り、通信プロトコルを含む接続情報を指定してバインドすれば送受信できる。通信処理自体は裏でライブラリ側が非同期に実行する。context_t型がその実体(スレッド)に対応している。ライブラリは基本的にC言語のライブラリをもとに他の言語への移植がなされている。オプションでブロックノンブロックを制御できる。試していないが、winodwsでこれを一発でかえられるとすると、それだけで面倒な初期化がなくてよいかも。
サンプル(C++)
メッセージの送信側(PUSH)
zmq::context_t ctx(1);
zmq::socket_t sock(ctx, ZMQ_PUSH);
sock.bind("tcp://127.0.0.1:10000");
zmq::message_t msg(size);
strncopy(msg.data(), dat, size);
sock.send(msg);
メッセージの受信側(POP)
zmq::context_t ctx(1);
zmq::socket_t sock(ctx, ZMQ_PULL);
sock.bind("tcp://127.0.0.1:10000");
zmq::message_t msg();
sock.recv(&msg);