nsqdが「dial tcp: i/o timeout」を返してくる場合の対処法
問題
「Go言語による Webアプリケーション開発」というオライリーの本を読み進めていたら、途中で1箇所ハマったので、その対処法を。
5章、6章でnsqdというメッセージキューを起動することになっているが、そのnsqdに対して文中にあるようにnsq_tailコマンドなどでアクセスしても、以下のエラーが出てしまう。
% nsq_tail --topic="votes" --lookupd-http-address=localhost:4161 2016/10/23 15:04:46 INF 1 [votes/tail115633#ephemeral] querying nsqlookupd http://localhost:4161/lookup?topic=votes 2016/10/23 15:04:46 INF 1 [votes/tail115633#ephemeral] (mypc:4150) connecting to nsqd 2016/10/23 15:04:47 ERR 1 [votes/tail115633#ephemeral] (mypc:4150) error connecting to nsqd - dial tcp: i/o timeout
解決方法
nsqdの起動時に"--broadcast-address"というオプションを追加で指定する。
nsqd --lookupd-tcp-address=127.0.0.1:4160 --broadcast-address=127.0.0.1
これでキューの中身を取得することができるようになる。
% nsq_tail --topic="votes" --lookupd-http-address=localhost:4161 2016/10/23 15:08:10 INF 1 [votes/tail084404#ephemeral] querying nsqlookupd http://localhost:4161/lookup?topic=votes 2016/10/23 15:08:10 INF 1 [votes/tail084404#ephemeral] (127.0.0.1:4150) connecting to nsqd win win happy happy happy win :
本が書かれた時とNSQのバージョンが違うからなのかは分からないが、とりあえず本に書かれていないオプションをつける必要がある。
おまけ
この本で作ったTwitterつぶやきの集計プログラムを使って、プログラミング言語のつぶやき数を10分ほど集計してみたらこんな結果に。 やっぱりJava、Ruby、PHPは人気が高いなあ。