ZMQを使った簡単なPub/SubExample Pub/Sub code with ZMQ

最近はテニスに再び熱が入っています。松浦です。
先日は研究室のメンバーにラケットの購入を勧めるつもりでウェブサイトを見ていて、気が付いたら自分が買っていました。

今日はZeroMQを使ったPublish/Subscribeの簡単な例を紹介します。メッセージキューイングシステムは沢山ありますが、ZeroMQは軽くて速いし、各言語のモジュールも充実しているので気に入っています。他のMQも含めての比較はここが読んでいて中々まとまっており面白かったです。先にpub/subを実現するコードを載せ、後にZeroMQやZMQのインストール方法を載せます。

環境

– OS : OSX 10.8.2 / ubuntu 12.04 LTS server edition
– ZeroMQ: 3.2.2
– Perl : 5.12.4 / 5.14.2
– ZMQ : 1.05

簡単なpub/subの例

郵便番号と気温等がセットになったデータが定期的に生成され、特定の郵便番号に合致するデータのみを取得するという単純な例を示します。参考URLにあるgistの例(*2)を基に、最新版モジュールのAPIを利用して動くように作成しました。

実行例

ターミナルを複数(ここでは6個)用意し、下記のコマンドを各々のターミナルで実行します。それぞれのターミナルでsubscriptionに合致するデータのみが表示され、
10個受け取った後に平均気温が表示されます。

publisher側のコード

pub.pl

subscriber側のコード

sub.pl

 

ここではlocalhost固定でやっていますが、複数の端末を使ってsubscribeしてみるとpub/subが動作している雰囲気を味わえる かと思います。sub.plのコードの中でポイントとなる部分の一つはforループ内部にある my $msg = $sub->recvmsg();です。subscriptionと合致するデータがpublishされるとrecvmsg()がそのデータを返し ます。それまではrecvmsgは待機状態にあります。つまり処理の流れはrecvmsg()の箇所で一定時間ブロックされます。複数の subscribe用socketを扱いたい場合は今回の様に複数のプロセスを立ち上げるか、スレッドを使う事が解決手段の候補となります。しかし、 pub/subという非同期通信を使ったイベント駆動型のスタイルを使っているのだから、最後までそのスタイルでコードを書きたいという要望もあるかと思 います。そういう場合はAnyEvent等を使ってrecvmsg()の箇所を書き換えるという方法があります。複数のsubscriptionを登録し その中で合致するメッセージが届いたらその都度表示する、といったプログラムを書くことが可能です。

ZeroMQおよびZMQのインストール

ZMQはZeroMQを利用するためのPerl製ラッパーです。下記の手順でインストールします。

インストール (linux)

ZeroMQが入ってない場合はダウンロードページ からソースコードを取ってきてインストールします。./configure, make, sudo make install後にsudo ldconfigを忘れずに実行して下さい。ZMQはver.2がデフォルトの設定で、cpanm ZMQなどとするとエラーで失敗します。ver.3を前提にするためには下記の様にします。

ここで下記のように2 -> 3と変更します(20行目)。

そのあと引き続き、下記のコマンドを実行してインストールします。

インストール (mac)

macでもほぼ同様の手順を踏みます。zeroMQをインストール後にZMQ::LibZMQ3を先にインストールし、その後でZMQを入れました (そうでないと入らなかった)。場合によってはlibzmqが見つからないのか、色々な物がナイナイと言われてエラーが大量に発生しました。この場合は setenv ZMQ_HOME /usr/local などとしてZMQ_HOMEを適切に設定するとZMQ::LibZMQ3がインストール可能となります。

参考文献

*1 ZMQ::Socket
http://search.cpan.org/~dmaki/ZMQ-1.05/lib/ZMQ/Socket.pm
*2 riywo / pub.pl @ Gist
https://gist.github.com/riywo/4070597
*3 pyzmqでZeroMQを触ってみる (PUB/SUB)
http://ymotongpoo.hatenablog.com/entry/20120328/1332915057
*4 ZeroMQ official page
http://www.zeromq.org/
*5 ZMQ
http://search.cpan.org/~dmaki/ZMQ-1.05/lib/ZMQ.pm
*6 ZMQ::LibZMQ3
http://search.cpan.org/~dmaki/ZMQ-LibZMQ3-1.00_04/lib/ZMQ/LibZMQ3.pm
*7 ActiveMQ or RabbitMQ or ZeroMQ or
http://stackoverflow.com/questions/731233/activemq-or-rabbitmq-or-zeromq-or

by 松浦 知史 (MATSUURA Satoshi)