本章目录:

  • 0x00 Go语言项目操作之NSQ分布式消息队列实践

    • 1.go-nsq 安装

    • 2.go-nsq 简单使用

    • 3.go-nsq 直连方式

    • NSQ 快速了解

    • NSQ 安装配置

    • NSQ 实践操作



0x00 Go语言项目操作之NSQ分布式消息队列实践
RabbitMQ、ZeroMQ、Kafka(大项目中推荐)、NSQ


NSQ 快速了解

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=0


nsqd41504151


nsqlookupd41604161nsqadmin4171
utilitiesnsq_stat、nsq_tail、nsq_to_file、nsq_to_http、nsq_to_nsq、to_nsq


NSQ 架构及其工作模式
我们首先开看NSQ工作模式图,值得非常注意的一点就是在非集群模式下可以直接连接指定的nsqd, 而集群模式下则通过nsqlookup查询到nsqd地址再连接。

上图中每个nsqd实例旨在一次处理多个数据流, 该数据流称为"topics",并且topic与channels是1对多的关系, 每个channel都会收到topic所有消息的副本,实际上下游的服务是通过对应的channel来消费topic消息。

  • topic 在首次使用时创建,方法是将其发布到指定topic,或者订阅指定topic上的channel

  • channel 是通过订阅指定的channel在第一次使用时创建的。

topic 和 channel 都相互独立地缓冲数据,防止缓慢的消费者导致其他chennel的积压(同样适用于topic级别),但是channel可以并且通常会连接多个客户端。

假设所有连接的客户端都处于准备接收消息的状态,则每条消息将被传递到随机客户端,如下图所示:

从topic -> channelchannel -> consumers


NSQ 消息队列的应用场景
(1) 异步处理: 我们可以利用消息队列把业务流程中的非关键流程异步化,从而显著降低业务请求的响应时间。

(2) 应用解耦: 通过使用消息队列将不同的业务逻辑解耦,降低系统间的耦合,提高系统的健壮性,后续有其他业务要使用订单数据可直接订阅消息队列,提高系统的灵活性。

秒杀请求 --Write--> 消息队列 --根据规则读取--> 请求处理。

(4) 消息通信: 消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯, 例如实现点对点消息队列,或者聊天室进行消息发布和接收等。


// # 点对点客户端A -->> 消息队列 <<-- 客户端B// # 聊天室订阅主题进行消息发布和接收客户端A <<-->> 消息队列 <<-->> 客户端B

例如: 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。

至此安装完毕,通过docker来部署NSQ是非常简单的。



NSQ 实践操作1.go-nsq 安装
go-nsq

go-nsq库安装命令如下所示:



2.go-nsq 简单使用

生产者Producer
简单的生产者示例代码如下:


消费者-Consumer
简单的消费者示例代码如下:


执行结果: 从结果可以看到当开启多个消费者时会一个发送一次消息队列中的信息。

Tips: 在客户端执行是如果采用ConnectToNSQLookupd方法即通过lookupd查询连NSQD,需要在hosts绑定对应的容器hostname和宿主机地址(粗暴解决)。例如此处

nsqdadmin/counter
/lookup



3.go-nsq 直连方式

描述: 上面实践了通过nsqlookupd的http接口查询后长连接到nsqd, 本节将简单演示直连nsqd(tcp长连接)写法。


至此完毕!

欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】 

Fake it until you become it!

专栏书写不易,如果你觉得这个专栏还不错的,请给这篇专栏点个赞、投个币、收个藏、关个注,转个发,这将对我的肯定,谢谢!。

fmt.Printf("不要白嫖哟,亲!")