[TOC]
0x00 Go语言项目操作之NSQ分布式消息队列实践
RabbitMQ、ZeroMQ、Kafka(大项目中推荐)、NSQNSQ 快速了解
Q: 什么是NSQ? 答: NSQ 是一个基于Go语言的分布式实时消息平台, 具有分布式,易于水平扩展,易于安装,易于集成(主流语言都有对应的客户端库)的特点。
其主要核心概念
- Topic: 在生产者publish时会创建topic,一个topic就是程序发布消息的一个逻辑键。
- Channels: 通道组与消费者相关,是消费者之间的负载均衡,channel在某种意义上来说是一个“队列”。每当一个发布者发送一条消息到一个topic,消息会被复制到所有消费者连接的channel上,消费者通过这个特殊的channel读取消息,实际上,在消费者第一次订阅时就会创建channel。(Channel会将消息进行排列,如果没有消费者读取消息,消息首先会在内存中排队,当量太大时就会被保存到磁盘中)
- Messages: 消息构成了我们数据流的中坚力量,消费者可以选择结束消息,表明它们正在被正常处理,或者重新将他们排队待到后面再进行处理。每个消息包含传递尝试的次数,当消息传递超过一定的阀值次数时,我们应该放弃这些消息,或者作为额外消息进行处理。
NSQ 的优势:
- 安装运行简单: 易于配置和部署,并且内置了管理界面。
- 协议简单: NSQ 支持多种语言客户端接入,其有一个快速的二进制协议,通过短短的几天工作量就可以很简单地实现这些协议,我们还自己创建了我们的纯JS驱动(当时只存在coffeescript驱动)
- 在线扩容:NSQ 支持横向扩展,没有任何集中式代理。
- 分布式 : 提倡分布式和分散的拓扑,没有单点故障,支持容错和高可用性,并提供可靠的消息交付保证
NSQ 的特性:
--mem-queue-size=0nsqd41504151nsqlookupd41604161nsqadmin4171utilitiesnsq_stat、nsq_tail、nsq_to_file、nsq_to_http、nsq_to_nsq、to_nsqNSQ 架构及其工作模式 我们首先开看NSQ工作模式图,值得非常注意的一点就是在非集群模式下可以直接连接指定的nsqd, 而集群模式下则通过nsqlookup查询到nsqd地址再连接。
WeiyiGeek.NSQ工作模式
上图中每个nsqd实例旨在一次处理多个数据流, 该数据流称为”topics”,并且topic与channels是1对多的关系, 每个channel都会收到topic所有消息的副本,实际上下游的服务是通过对应的channel来消费topic消息。
- topic 在首次使用时创建,方法是将其发布到指定topic,或者订阅指定topic上的channel
- channel 是通过订阅指定的channel在第一次使用时创建的。
topic 和 channel 都相互独立地缓冲数据,防止缓慢的消费者导致其他chennel的积压(同样适用于topic级别),但是channel可以并且通常会连接多个客户端。
假设所有连接的客户端都处于准备接收消息的状态,则每条消息将被传递到随机客户端,如下图所示:
WeiyiGeek.NSQ工作模式
从topic -> channelchannel -> consumersNSQ 消息队列的应用场景 (1) 异步处理: 我们可以利用消息队列把业务流程中的非关键流程异步化,从而显著降低业务请求的响应时间。
(2) 应用解耦: 通过使用消息队列将不同的业务逻辑解耦,降低系统间的耦合,提高系统的健壮性,后续有其他业务要使用订单数据可直接订阅消息队列,提高系统的灵活性。
WeiyiGeek.应用解耦
秒杀请求 --Write--> 消息队列 --根据规则读取--> 请求处理。(4) 消息通信: 消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯, 例如实现点对点消息队列,或者聊天室进行消息发布和接收等。
例如: NSQ接收和发送消息流程如下图所示。
WeiyiGeek.NSQ接收和发送消息流程
附录补充
NSQ 官网地址: https://nsq.io/
NSQ 安装配置
从NSQ官方下载页面(https://nsq.io/deployment/installing.html), 根据自己的平台下载并解压到指定目录, 然后设置环境变量即可。
此处使用Docker方式安装部署测试 实践环境说明:
步骤01.首先创建一个 docker-compose.yml 存放了容器运行配置清单。
nsqd服务nsqadmin服务步骤02.在该yml文件同级目录下执行如下命令进行创建并后台运行容器。
步骤03.访问nsqadmin提供的消息队列监控的Web管理平台 http://10.10.107.225:4171/lookup。
WeiyiGeek.nsqadmin-Web管理平台
至此安装完毕,通过docker来部署NSQ是非常简单的。
NSQ 实践操作
1.go-nsq 安装
go-nsqgo-nsq库安装命令如下所示:
2.go-nsq 简单使用
生产者Producer 简单的生产者示例代码如下:
消费者-Consumer 简单的消费者示例代码如下:
执行结果: 从结果可以看到当开启多个消费者时会一个发送一次消息队列中的信息。
WeiyiGeek.Producer与Consumer实践
Tips: 在客户端执行是如果采用ConnectToNSQLookupd方法即通过lookupd查询连NSQD,需要在hosts绑定对应的容器hostname和宿主机地址(粗暴解决)。例如此处
nsqdadmin/counterWeiyiGeek.Topic&Channel查看
/lookup3.go-nsq 直连方式
描述: 上面实践了通过nsqlookupd的http接口查询后长连接到nsqd, 本节将简单演示直连nsqd(tcp长连接)写法。
至此完毕!