解锁快速上手NSQ的新姿势
1. 介绍
NSQ是Go语言编写的,开源的分布式消息队列中间件,具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征,同时支持横向扩展,操作友好,是一个成熟的、已在大规模生成环境下应用的产品。
2. 消息中间件应用场景
2.1 异步处理
参照下图利用消息队列把业务流程中的非关键流程异步化
,从而显著降低业务请求的响应时间。
]
2.2 应用解耦
通过使用消息队列将不同的业务逻辑解耦,降低系统间的耦合,提高系统的健壮性。后续有其他业务要使用订单数据可直接订阅消息队列,提高系统的灵活性。
2.3 流量削峰
类似秒杀(大秒)等场景下,某一时间可能会产生大量的请求,使用消息队列能够为后端处理请求提供一定的缓冲区,保证后端服务的稳定性。
3. 组件
3.1 nsqd
nsqd是一个守护进程,它接收、排队并向客户端发送消息。默认监听了两个tcp端口,一个(4150)用来服务客户端,一个(4151)用来提供http端口,此外还可以选择性地监听一个可选的https端口。
3.2 nsqlookupd
nsqlookupd是维护所有nsqd状态、提供服务发现的守护进程。它能为消费者查找特定topic
下的nsqd提供了运行时的自动发现服务。 **它不维持持久状态,也不需要与任何其他nsqlookupd实例协调以满足查询。**因此根据你系统的冗余要求尽可能多地部nsqlookupd
节点。它们消耗的资源很少,可以与其他服务共存。我们的建议是为每个数据中心运行至少3个集群。
3.3 nsqadmin
一个实时监控集群状态、执行各种管理任务的Web管理平台。
4. NSQ架构设计
4.1 流程图
4.2 Topic和Channel
-
每个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的一部分消息)。
4.3 NSQ接收和发送消息流程
4.4 特性
- 消息默认不持久化,可以配置成持久化模式。nsq采用的方式时内存+硬盘的模式,当内存到达一定程度时就会将数据持久化到硬盘。
- 如果将
--mem-queue-size
设置为0,所有的消息将会存储到磁盘。 - 服务器重启时也会将当时在内存中的消息持久化。
- 如果将
- 每条消息至少传递一次。
- 消息不保证有序。
5. 安装和使用教程
5.1 安装
下载地址: https://nsq.io/deployment/installing.html,选择对应的环境去下载NSQ
5.2 使用教程
双击nsqlookupd.exe启动
监听了4160的tcp端口和4161的http端口
打开bin的cmd界面 输入命令指定
nsqlookupd
地址nsqd --lookupd-tcp-address=127.0.0.1:4160
指定nsqadmin地址 打开nsqadmin
nsqadmin -lookupd-http-address=127.0.0.1:4161