Engineer's Way

主にソフトウェア関連について色々書くブログです。

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分ほど集計してみたらこんな結果に。 やっぱりJavaRubyPHPは人気が高いなあ。

f:id:matsnow:20161023152605p:plain