通常の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へ接続できる。
リンク