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
The Times 03/Jan/2009 Chancellor on brink of second bailout for banks