MacOSXにZMQをインストールしてpub/subを試してみました

@nqounetです。

今日はYAPC::Asiaの0日目ですね!(2回目)

大分遅れ気味な気もしますが、pub/subに興味を持ってZMQを入れようとしましたがチョット苦労したので備忘録的な感じで書いてみます。

pub/sub

pub/subというのは何かというと、Wikipediaによれば「出版-購読型モデル」のことです。

WebSocketを使って通信をする時に使う関数を、何かしらの用語から引っ張ってこようと思って色々と調べているうちに、ZeroMQというのを見つけました。

それで、そのPerl実装がZMQというわけです。

1年半以上前にriywoさんが書いたgistのスクリプトを試してみようと思ったら、ZMQがcpanmですんなり入らなくてチョット苦労しました。

ZMQ

大体ログ見ればわかりますよ。と、いろんな人に吹聴しているのですが、結構わかりませんでした。

ログを見てみると、libzmqが必要っぽいのですが、homebrewにはないっぽい(brew install libzmqでは失敗)ので、なんだか面倒ですね。

Alien::ZMQとZMQ::LibZMQ3を入れて環境変数をセット

ZMQ::LibZMQ3をインストールできなかったログを見てみると、Alien::ZMQが見つからない、というエラーがあったのでそれを入れることにしました。

1
$ cpanm Alien::ZMQ

その後ZMQ::LibZMQ3を入れてみるとうまくいきました。

1
$ cpanm ZMQ::LibZMQ3

また、ZMQ::LibZMQ2Alien::ZMQを入れたあとも入らなかったのでやめておきました。

そして、ZMQは標準では2の方を使うのですが、環境変数で3の方を指定するとそっちを使ってくれるようです。

インストール時に指定すると、その後も使ってくれるようなので、一時的に指定します。

1
$ PERL_ZMQ_BACKEND=ZMQ::LibZMQ3 cpanm ZMQ

無事にインストール出来ました。

APIが変わっている

元のスクリプトは2の方の仕様なので、そのままではエラーが出てしまいますので、一部変更する必要があります。

調べてみたら同じことをしている人がすでにいました。

こちらに書いてあるスクリプトがそのまま動きます。

sub.plの方は、recv()になっているところをrecvmsg()に、pub.plの方は、send()になっているところをsendmsg()に変更すれば良さそうです。

そんなわけで、無事動くようになりました。

ターミナルを3つ立ち上げて、sub.plを2つ動作させたあとにpub.plを動かしてみると、ちゃんと購読している分にだけsub.plが反応しているのがわかります。

実際に動かしてみるとイメージがわかりやすいですね。

まとめ

インストール

1
$ PERL_ZMQ_BACKEND=ZMQ::LibZMQ3 cpanm Alien::ZMQ ZMQ::LibZMQ3 ZMQ

スクリプト修正

1
2
3
4
5
# sub.pl 16行目付近 recv() -> recvmsg()
my $msg = $sub->recvmsg();

# pub.pl 21行目付近 send() -> sendmsg()
$pub->sendmsg($update);

ちなみに、pub.plをずっと動かしているのも面白いですよ。如何でしょうか?

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。