Go操作消息队列

NSQ是目前比较流行的一个分布式的消息队列,本文主要介绍了NSQ及Go语言如何操作NSQ。

使用消息队列的主要目的,异步、解耦、削峰

NSQ介绍

NSQ是Go语言编写的一个开源的实时分布式内存消息队列,其性能十分优异。 NSQ的优势有以下优势:

  1. NSQ提倡分布式和分散的拓扑,没有单点故障,支持容错和高可用性,并提供可靠的消息交付保证
  2. NSQ支持横向扩展,没有任何集中式代理。
  3. 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