NSQ 是一套用 GO 開發的訊息傳遞系統。同樣角色時常拿來比較的對象是 rabbitMQ、kafka。

安裝 NSQ 在本機測試環境

NSQ 本身有提供 brew / docker 版本。在這邊我是直接使用 github 原始碼下載編譯,注意 golang 1.7+ 並且已經有 dep 套件管理。在 test.sh 會執行 golang test & 編譯出所有的可執行檔。

下載 source code & 安裝相依性套件

git clone https://github.com/nsqio/nsq $GOPATH/src/github.com/nsqio/nsq
cd $GOPATH/src/github.com/nsqio/nsq
dep ensure

測試 & 編譯

./test.sh

安裝 NSQ

安裝至 /usr/local/bin 目錄

make install

依序啟動服務

nsqlookupd 預設監聽 http:4161 / tcp:4160,而 nsqd 啟動時自動到 nsqlookupd 註冊。

nsqlookupd
nsqd --lookupd-tcp-address=127.0.0.1:4160
nsqadmin --lookupd-http-address=127.0.0.1:4161

使用 go-nsq 發布與接受訊息

發佈環境配置

使用在 microservices 中時候,nsqd 建議並不是全部 services 共用,而是個別配置一個 localhost 的 nsqd 註冊到 nsqlookupd。

在 nsq gitlab issue 中提到,建議在每個 node 都部署一個 nsqd 再註冊到一台或多台的 nsqlookup 中,這樣各自的 service 生產的訊息就通一推到各自的 localhost,再由 nsqd 處理訊息這一段。
> You may have your nsqds and nsqlookupds segregated so that all nodes are good candidates (we do this also), but this isn’t a requirement. nsqlookupd can handle several nsqd “clusters” with distinct responsibilities, like a service discovery service.

When you get the nodes back you’ll have to make a decision about which node you want to publish to. In our setup we either publish to localhost if nsqd is on the same box or a VIP.

ref

https://nsq.io/deployment/production.html
https://github.com/nsqio/go-nsq/issues/170
https://segmentfault.com/a/1190000009194607