0.相关参考文章:

官网:https://nsq.io/

golang实战-nsq集群入门与坑

nsq系统架构

NSQ消息队列

1.启动命令

①nsqlookupd

②nsqd -lookupd-tcp-address=xxx.xxx.xxx.xxx:4160  -broadcast-address=xxx.xxx.xxx.xxx -max-msg-size=50000000 -data-path=your save data path

这里需要注意:xxx.xxx.xxx.xxx为对外ip地址

-broadcast-address:如果需要外网访问,必须设置这个参数为对外ip地址。(当在同一台机器上开多个nsqd的情况下需要设置成不一样的)

-max-msg-size:设置单条消息的最大字节数,如果消息超过这个字节数将被丢弃。

-data-path:数据存储路径(当在同一台机器上开多个nsqd的情况下需要设置成不一样的)

③nsqadmin -lookupd-http-address=xxx.xxx.xxx.xxx:4161

2.端口相关

①外网访问必须开放4150(TCP Producer),4151(HTTP Producer),4160,4161,4171(管理页面)四个端口

②nsqlookupd 监听两个端口:

4160 TCP 用于接收nsqd的广播,记录nsqd的地址以及监听TCP/HTTP端口等。
4161 HTTP 用于接收客户端发送的管理和发现操作请求(增删话题,节点等管理查看性操作等)。当Consumer进行连接时,返回对应存在Topic的nsqd列表。

③nsqd监听两个端口:

4151 HTTP Producer使用HTTP协议的curl等工具生产数据;Consumer使用HTTP协议的curl等工具消费数据;
4150 TCP Producer使用TCP协议的nsq-j等工具生产数据;Consumer使用TCP协议的nsq-j等工具消费数据;

④nsqadmin监听一个端口 
4171 HTTP 用于管理页面

使用地址http://xxx.xxx.xxx.xxx:4171打开管理页面

3.下面的示意图清晰的展示了整个NSQ架构的端口关系:

(1)单点

NSQ端口关系以及注意事项-LMLPHP

流程说明:

①Consumer1首先使用HTTP连接nsqlookupd的4161端口,获取Topic1相关nsqd的TCP4150端口。

②使用TCP连接到nsqd的4150端口,并生成对应的Channel1;

特别需要注意的是,当所需Topic不变的情况下,就算nsqlookupd和nsqadmin进程都杀掉,也不影响nsqd的生产和消费。

(2)集群

NSQ端口关系以及注意事项-LMLPHP

说明:

①当开启多个nsqd才存在集群的意义。

②尽量避免多个nsqd存在相同的Topic。如果多个nsqd真的存在相同的Topic的情况下,通过nsqlookupd将会返回所有这个Topic的IP并都能进行读取处理。(使用nsq-j进行过测试验证。)

4.Channel相关

NSQ端口关系以及注意事项-LMLPHP

其实主要有两个点:

①多个Consumer消费同一个Topic和同一个Channel:将会轮训,按序分配给就绪(当前无处理任务)的消费者。因此,多消费者情况下,无法保证有序执行。(像上面动图的"metrics"所示)

②多个Consumer消费同一个Topic和不同的Channel:将会将同一个数据同时到不同的Channel中。(像上面动图的三个Channel所示)

注意:Consumer与Topic没有直接联系,而是通过具体的Channel接受数据。如果Consumer退出,Channel不会自动删除。 如果不再需要,需要通过http端口删除Channel,否则很可能会导致磁盘空间不足。

以上。

05-23 20:33