Golang消息队列之NSQ
NSQ
NSQ是一个实时分布式消息传递平台,设计用于大规模操作,能每天处理数十亿条消息。
它促进了没有单点故障的分布式和分散拓扑,支持容错和高可用性,并提供可靠的消息传递保证。
优缺点
优点:
1、部署非常方便,没有任何环境的依赖,一个二进制可执行文件
2、轻量级没有过多的配置参数,只需要简单配置即可直接使用
3、性能极高(基于go编写)
4、消息不存在丢失的情况
缺点:
1、消息无顺序
2、节点之间没有消息复制
3、没有鉴权
消息队列场景
异步执行
将注册信息写入数据库成功后,同时进行发送注册邮件和发送注册短信的操作。而所有任务执行完成后,返回信息给客户端。同串行方式相比,并行方式可以提高执行效率,减少执行时间。
并行方式:
异步方式:
应用解耦
场景说明:用户下单以后,订单系统需要通知库存系统。
传统的做法为:订单系统调用库存系统接口。如下图所示:
传统方式具有如下缺点:
1、假设库存系统访问失败,则订单减少库存失败,导致订单创建失败
2、订单系统同库存系统过度耦合
那么如何解决上述的缺点呢?需要引入消息队列,引入消息队列后的架构如下图所示:
- 订单系统:用户下单后,订单系统进行数据持久化处理,然后将消息写入消息队列,返回订单创建成功
- 库存系统:使用拉/推的方式,获取下单信息,库存系统根据订单信息,进行库存操作。
流量削锋
应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。
1、可以控制参与活动的人数;
2、可以缓解短时间内高流量对应用的巨大压力;
流量削锋处理方式系统图如下:
- 服务器在接收到用户请求后,首先写入消息队列。这时如果消息队列中消息数量超过最大数量,则直接拒绝用户请求或返回跳转到错误页面;
- 秒杀业务根据秒杀规则读取消息队列中的请求信息,进行后续处理。
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)