NSQ是一個基於Go語言的分布式實時消息平台,它基於MIT開源協議發布,代碼托管在GitHub。NSQ可用於大規模系統中的實時消息服務,並且每天能夠處理數億級別的消息,其設計目標是為在分布式環境下運行的去中心化服務提供一個強大的基礎架構。
NSQ具有分布式、去中心化的拓撲結構,該結構具有無單點故障、故障容錯、高可用性以及能夠保證消息的可靠傳遞的特征。NSQ非常容易配置和部署,且具有最大的靈活性,支持眾多消息協議。另外,官方還提供了拆箱即用Go和Python庫。如果讀者興趣構建自己的客戶端的話,還可以參考官方提供的協議規范。
一. 搭建主NSQ服務
1. 創建主服務器(虛擬機)
IP: 192.168.0.210
2. 拉取NSQ鏡像
> docker pull nsqio/nsq #拉取nsq鏡像
> docker images #查看nsq鏡像
3. 啟動nsqlookupd服務
> docker run -d --name lookupd -p 4160:4160 -p 4161:4161 nsqio/nsq:latest /nsqlookupd
> #docker exec -ti lookupd /bin/sh #進入容器,查看nsq目錄結構
> #docker rm -f `docker ps -qa` #刪除所有容器
最重要的服務,是整個集群的總控室,包括服務發現和節點拓撲信息的管理。nsqlookupd有以下特點:
- 唯一性,在集群中的節點只能指向唯一的nsqlookupd服務
- 去中心化,即使nsqlookupd崩潰,也會不影響正在運行的nsqd服務
- 充當nsqd和naqadmin信息交互的中間件
- 提供一個http查詢服務,給客戶端定時更新nsqd的地址目錄
4. 啟動nsqadmin管理系統
> docker run -d --name nsqadmin -p 4171:4171 nsqio/nsq /nsqadmin --lookupd-http-address=192.168.0.210:4161
nsqadmin可以部署在任何一個安裝有nsq服務的機器上,只需要指定唯一的
lookupd-http-address
服務IP地址
瀏覽器打開:http://192.168.0.210:4171/ ,此時的NSQd Nodes
為空
二. 部署NSQd節點服務
1.在主服務器(192.168.0.210)上開啟一個nsqd節點服務
> docker run -d --name nsqd -p 4150:4150 -p 4151:4151 nsqio/nsq:latest /nsqd --broadcast-address=192.168.0.210 --lookupd-tcp-address=192.168.0.210:4160
2.創建從服務器(IP:192.168.0.159),拉取鏡像docker pull nsqio/nsq
,啟動一個nsqd服務,此時已有兩個nsqd節點
> docker run -d --name nsqd -p 4150:4150 -p 4151:4151 nsqio/nsq:latest /nsqd --broadcast-address=192.168.0.159 --lookupd-tcp-address=192.168.0.210:4160
--broadcast-address
:當前服務器IP地址,--lookupd-tcp-address
:指向的lookupd服務器IP地址
三. 測試
1.打開任意一個shell終端,執行:
> curl -d 't1' 'http://192.168.0.210:4151/pub?topic=p1' #一個topic可多次添加
> curl -d 't2' 'http://192.168.0.210:4151/pub?topic=p2'
> curl -d 't1' 'http://192.168.0.159:4151/pub?topic=q1'
> curl -d 't2' 'http://192.168.0.159:4151/pub?topic=q2'
> curl -d 't3' 'http://192.168.0.159:4151/pub?topic=q3'
2.nsqlookupd奔潰測試(在主服務器):
> docker stop lookupd #停止nsqlookupd服務
> curl -d 'tpp' 'http://192.168.0.210:4151/pub?topic=pp' # topic可以正常發布
> docker stop nsqd #停止nsqd服務
> curl -d 'tpp' 'http://192.168.0.210:4151/pub?topic=pp' # topic可以正常發布
#顯式: curl: (7) Failed connect to 192.168.0.210:4151; 拒絕連接
> 參考: > https://www.cnblogs.com/li-peng/p/7729174.html