NSQ是目前比较流行的一个分布式的消息队列,本文主要介绍了NSQ及Go语言如何操作NSQ。
使用消息队列的主要目的,异步、解耦、削峰
NSQ介绍
NSQ是Go语言编写的一个开源的实时分布式内存消息队列,其性能十分优异。 NSQ的优势有以下优势:
- NSQ提倡分布式和分散的拓扑,没有单点故障,支持容错和高可用性,并提供可靠的消息交付保证
- NSQ支持横向扩展,没有任何集中式代理。
- NSQ易于配置和部署,并且内置了管理界面。
NSQ的应用场景
通常来说,消息队列都适用以下场景。
异步处理
参照下图利用消息队列把业务流程中的非关键流程异步化,从而显著降低业务请求的响应时间。
应用解耦
通过使用消息队列将不同的业务逻辑解耦,降低系统间的耦合,提高系统的健壮性。后续有其他业务要使用订单数据可直接订阅消息队列,提高系统的灵活性。
流量削峰
类似秒杀(大秒)等场景下,某一时间可能会产生大量的请求,使用消息队列能够为后端处理请求提供一定的缓冲区,保证后端服务的稳定性。
安装
官方下载页面根据自己的平台下载并解压即可。
NSQ组件
nsqd
nsqd是一个守护进程,它接收、排队并向客户端发送消息。
nsqd-broadcast-address=127.0.0.1
nsqlookupdnsqlookupd
最后我们还需要启动图形化的界面 nsqadmin
然后在启动成功后,在浏览器输入 127.0.0.1:4171,即可进入图形化界面
nsqlookupd-lookupd-tcp-address
nsqdq
nsqlookupd
topicnsqlookupd
nsqlookupd
nsqadmin
nsqadminnsqlookupd
http://127.0.0.1:4171/
nsqadmin
NSQ架构
NSQ工作模式
Topic和Channel
“topics”topic“channels”channeltopicchanneltopic
topicchanneltopictopictopicchannelchannelchannel
topicchannelchenneltopic
channel
topic -> channelchannel -> consumers
NSQ接收和发送消息流程
- input Chan:就是go语言中的通道
- In-Memory Chan:是内存的通道,负责将消息进行持久化
- Output Chan:
NSQ特性
--mem-queue-size
Go操作NSQ
官方提供了Go语言版的客户端:go-nsq,更多客户端支持请查看CLIENT LIBRARIES。
启动
首先进入bin目录下,打开cmd,输入
然后就开启了nsq服务,端口号是4160
-broadcast-address=127.0.0.1
nsqlookupdnsqlookupd
启动成功的图片如下所示
安装
生产者
一个简单的生产者示例代码如下:
123456
http://127.0.0.1:4171/topic
topic_demotopicLWZMBP:4151 (127.0.01:4151)nsqdchannel
/nodeslookupdnsqd
/counter
/lookuptopicchannel
消费者
一个简单的消费者示例代码如下:
将上面的代码保存之后编译执行,就能够获取之前我们publish的两条消息了:
/counter
go-nsq