NSQ

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

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

优缺点

优点:

1、部署非常方便,没有任何环境的依赖,一个二进制可执行文件

2、轻量级没有过多的配置参数,只需要简单配置即可直接使用

3、性能极高(基于go编写)

4、消息不存在丢失的情况

缺点:

1、消息无顺序

2、节点之间没有消息复制

3、没有鉴权

消息队列场景

异步执行

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

并行方式:

bc65a6fd322d6549732898851ca487e2.png

异步方式:

6479ce88f7a8d8212ef4d437d0d9c3af.png

应用解耦

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

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

5a055d17c44bba537d02c2514d1ad011.png

传统方式具有如下缺点:

1、假设库存系统访问失败,则订单减少库存失败,导致订单创建失败

2、订单系统同库存系统过度耦合

34e986cb6e8cbfeadcbb43558daa34fc.png

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

4e1934cfc720e86ffb9dc3140d94c2b4.png

订单系统:用户下单后,订单系统进行数据持久化处理,然后将消息写入消息队列,返回订单创建成功

库存系统:使用拉/推的方式,获取下单信息,库存系统根据订单信息,进行库存操作。

流量削锋

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

1、可以控制参与活动的人数;

2、可以缓解短时间内高流量对应用的巨大压力;

流量削锋处理方式系统图如下:

c4bbf3578936429b3ca3d8507877d550.png

服务器在接收到用户请求后,首先写入消息队列。这时如果消息队列中消息数量超过最大数量,则直接拒绝用户请求或返回跳转到错误页面;

秒杀业务根据秒杀规则读取消息队列中的请求信息,进行后续处理。

NSQ组件

nsqd:一个守护进程,它接收、排队并向客户端发送消息

nsqlookupd:汇总节点信息,提供查询和管理topic等服务

nsqadmin:管理端展示UI界面,能有一个web页面去查看和操作

NSQ安装

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)