Docker NSQのConsumerへローカルGoプロセスから接続する

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

通常のNSQ、Consumerへの接続は、lookupdを通して、

q, err := nsq.NewConsumer("topic", "key", nsq.NewConfig())
...
if err := q.ConnectToNSQLookupd("localhost:4161"); err != nil {
...
}

のようにlookupdでConsumerを抽象化して接続するんだけど、docker-composeなんかでnsqdとlookupdとをdepends_onしているような環境だと、ConnectToNSQLookupdメソッドのnsqdのアドレスがDockerのコンテナIDが返されて、go-nsqからだと実際のコンシューマへの接続に失敗する...

2020/07/06 21:42:12 INF    1 [votes/counter] querying nsqlookupd http://localhost:4161/lookup?topic=votes
2020/07/06 21:42:12 INF    1 [votes/counter] (6537430ba5a1:4150) connecting to nsqd
2020/07/06 21:42:12 ERR    1 [votes/counter] (6537430ba5a1:4150) error connecting to nsqd - dial tcp: lookup 6537430ba5a1: no such host


Goを実行する環境もDockerコンテナ上で実行して、同じdocker network上で上記メソッド叩けば解決するんだろうけど、コンシューマは1台だけなので、lookupdを通さずに直結する方法はないのかな?と思って調べたらありました。

q.ConnectToNSQD("localhost:4150"); err != nil {

で直結できます。

go-nsq/consumer.go at master · nsqio/go-nsq · GitHub

コメントであるように、本番環境などトピックがサーバ間で分散されている時は素直にConnectToNSQLookupdを使用しよう。


追記

直結せずとも、goが実行される環境の/etc/hosts

127.0.0.1       6537430ba5a1  # コンテナID

と記載することで、名前解決できることに気がついた(^_^;)

これで、

q.ConnectToNSQLookupd("localhost:4161")

が、lookupdからコンテナIDを返されてても、localhostに名前解決でき、nsqdへ接続できる。