@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が見つからない、というエラーがあったのでそれを入れることにしました。
|
|
その後ZMQ::LibZMQ3を入れてみるとうまくいきました。
|
|
また、ZMQ::LibZMQ2はAlien::ZMQを入れたあとも入らなかったのでやめておきました。
そして、ZMQは標準では2の方を使うのですが、環境変数で3の方を指定するとそっちを使ってくれるようです。
インストール時に指定すると、その後も使ってくれるようなので、一時的に指定します。
|
|
無事にインストール出来ました。
APIが変わっている
元のスクリプトは2の方の仕様なので、そのままではエラーが出てしまいますので、一部変更する必要があります。
調べてみたら同じことをしている人がすでにいました。
こちらに書いてあるスクリプトがそのまま動きます。
sub.pl
の方は、recv()
になっているところをrecvmsg()
に、pub.pl
の方は、send()
になっているところをsendmsg()
に変更すれば良さそうです。
そんなわけで、無事動くようになりました。
ターミナルを3つ立ち上げて、sub.pl
を2つ動作させたあとにpub.pl
を動かしてみると、ちゃんと購読している分にだけsub.pl
が反応しているのがわかります。
実際に動かしてみるとイメージがわかりやすいですね。
まとめ
インストール
|
|
スクリプト修正
|
|
ちなみに、pub.pl
をずっと動かしているのも面白いですよ。如何でしょうか?