Golang消息队列之NSQ

NSQ

NSQ是一个实时分布式消息传递平台,设计用于大规模操作,能每天处理数十亿条消息。

它促进了没有单点故障的分布式和分散拓扑,支持容错和高可用性,并提供可靠的消息传递保证。

优缺点
优点:
1、部署非常方便,没有任何环境的依赖,一个二进制可执行文件
2、轻量级没有过多的配置参数,只需要简单配置即可直接使用
3、性能极高(基于go编写)
4、消息不存在丢失的情况
缺点:
1、消息无顺序
2、节点之间没有消息复制
3、没有鉴权

消息队列场景

场景介绍来自于

异步执行

将注册信息写入数据库成功后,同时进行发送注册邮件和发送注册短信的操作。而所有任务执行完成后,返回信息给客户端。同串行方式相比,并行方式可以提高执行效率,减少执行时间。
并行方式:

异步方式:

应用解耦

场景说明:用户下单以后,订单系统需要通知库存系统。

传统的做法为:订单系统调用库存系统接口。如下图所示:

传统方式具有如下缺点:
1、假设库存系统访问失败,则订单减少库存失败,导致订单创建失败
2、订单系统同库存系统过度耦合

那么如何解决上述的缺点呢?需要引入消息队列,引入消息队列后的架构如下图所示:

  • 订单系统:用户下单后,订单系统进行数据持久化处理,然后将消息写入消息队列,返回订单创建成功
  • 库存系统:使用拉/推的方式,获取下单信息,库存系统根据订单信息,进行库存操作。

流量削锋

应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。

1、可以控制参与活动的人数;
2、可以缓解短时间内高流量对应用的巨大压力;
流量削锋处理方式系统图如下:

  • 服务器在接收到用户请求后,首先写入消息队列。这时如果消息队列中消息数量超过最大数量,则直接拒绝用户请求或返回跳转到错误页面;
  • 秒杀业务根据秒杀规则读取消息队列中的请求信息,进行后续处理。

NSQ组件

nsqd:一个守护进程,它接收、排队并向客户端发送消息
nsqlookupd:汇总节点信息,提供查询和管理topic等服务
nsqadmin:管理端展示UI界面,能有一个web页面去查看和操作

NSQ安装

NSQ github

1.下载nsq软件包

$ wget https://github.com/nsqio/nsq/releases/download/v1.2.0/nsq-1.2.0.linux-amd64.go1.12.9.tar.gz

2.启动nsqlookupd

$ ./nsqlookupd &

3.启动nsqd,并注册到指定lookupd

$ ./nsqd -broadcast-address=127.0.0.1 -lookupd-tcp-address=127.0.0.1:4160 &

4.启动nsqweb界面

$ ./nsqadmin --lookupd-http-address=127.0.0.1:4161 &

5.访问nsqadmin
![](https://img2018.cnblogs.com/blog/1679739/202003/1679739-20200301162720259-1060774575.png)
posted @ 2020-03-01 00:37  jasonminghao  阅读(1741)  评论(0编辑  收藏  举报