参考文档:
李文周nsq
nsq介绍
NSQ是Go语言编写的一个开源的实时分布式内存消息队列,其性能十分优异。
NSQ的优势有以下优势:
- NSQ提倡分布式和分散的拓扑,没有单点故障,支持容错和高可用性,并提供可靠的消息交付保证
- NSQ支持横向扩展,没有任何集中式代理。
- NSQ易于配置和部署,并且内置了管理界面。
缺点
- 消息默认不持久化,可以配置成持久化模式。nsq采用的方式时内存+硬盘的模式,当内存到达一定程度时就会将数据持久化到硬盘。
-
如果将--mem-queue-size设置为0,所有的消息将会存储到磁盘。
-
服务器重启时也会将当时在内存中的消息持久化。
- 每条消息至少传递一次。
- 消息不保证有序。
应用场景
- 异步任务
- 应用解耦
- 流量削峰
- 定时任务
安装
mac直接通过brew安装
brew install nsq
组件
- nsqd:消息队列节点,真正提供接受、排队、发送消息的服务;
- nsqlookupd:管理和维护nsqd节点,可以理解为nsqd集群;
- nsqadmin:nsqlookupd的web管理平台。
启动服务
- 启动nsqlookupd,开放端口4161(http)和4160(tcp)
cd /usr/local/bin
./nsqlookupd
显示结果
[nsqlookupd] 2021/04/27 10:00:46.800332 INFO: nsqlookupd v1.2.0 (built w/go1.13.5)
[nsqlookupd] 2021/04/27 10:00:46.800911 INFO: HTTP: listening on [::]:4161
[nsqlookupd] 2021/04/27 10:00:46.800920 INFO: TCP: listening on [::]:4160
- 启动注册nsqd,指定nsqlookupd地址和广播地址(即nsqlookupd查找nsqd节点的地址)
cd /usr/local/bin
./nsqd -broadcast-address=127.0.0.1 -lookupd-tcp-address=127.0.0.1:4160
显示结果
[nsqd] 2021/04/27 10:02:12.927888 INFO: nsqd v1.2.0 (built w/go1.13.5)
[nsqd] 2021/04/27 10:02:12.929290 INFO: ID: 59
[nsqd] 2021/04/27 10:02:12.930200 INFO: NSQ: persisting topic/channel metadata to nsqd.dat
[nsqd] 2021/04/27 10:02:12.959597 INFO: HTTP: listening on [::]:4151
[nsqd] 2021/04/27 10:02:12.959617 INFO: TCP: listening on [::]:4150
[nsqd] 2021/04/27 10:02:12.959821 INFO: LOOKUP(127.0.0.1:4160): adding peer
[nsqd] 2021/04/27 10:02:12.959828 INFO: LOOKUP connecting to 127.0.0.1:4160
- 启动nsqadmin,指定ndqlookupd地址,开放http端口:4171
cd /usr/local/bin
./nsqadmin -lookupd-http-address=127.0.0.1:4161
显示结果
[nsqadmin] 2021/04/27 10:03:17.456356 INFO: nsqadmin v1.2.0 (built w/go1.13.5)
[nsqadmin] 2021/04/27 10:03:17.459248 INFO: HTTP: listening on [::]:4171
在浏览器访问:127.0.0.1:4171
nsq的工作模式
channel和topic
每个nsqd实例旨在一次处理多个数据流。这些数据流称为“topics”,一个topic具有1个或多个“channels”。每个channel都会收到topic所有消息的副本,实际上下游的服务是通过对应的channel来消费topic消息。
topic和channel不是预先配置的。topic在首次使用时创建,方法是将其发布到指定topic,或者订阅指定topic上的channel。channel是通过订阅指定的channel在第一次使用时创建的。
topic和channel都相互独立地缓冲数据,防止缓慢的消费者导致其他chennel的积压(同样适用于topic级别)。
channel可以并且通常会连接多个客户端。假设所有连接的客户端都处于准备接收消息的状态,则每条消息将被传递到随机客户端。例如:
总而言之,消息是从topic -> channel(每个channel接收该topic的所有消息的副本)多播的,但是从channel -> consumers均匀分布(每个消费者接收该channel的一部分消息)。
个人理解(如有错误还请指正)
nsqd——>电视;
topics:电视频道;
topic:某个电视频道:CCTV5
channel:CCTV5的某个节目:CBA、NBA、龙舟比赛,用A收看NBA,用户B收看CBA,用户C收看龙舟比赛,即一个用户只能收看一个节目(上面说的每个消息至少专递一次)。