12.1 Go nsq
1.nsq是Go语言编写的,开源的内存分布式消息队列中间件
2.可以大规模的处理每天数以十亿级别的消息
3.分布式和去中心化拓扑结构,无单点故障
4.地址https://github.com/nsqio/nsq
1.1. nsq应用场景
1.异步处理,把非关键流程异步化,提高系统的响应时间和健壮性
2.应用解耦,通过消息队列。
想必同学们都点过外卖,点击下单后的业务逻辑可能包括:检查库存、生成单据、发红包、短信通知等,如果这些业务同步执行,完成下单率会非常低,如发红包,短信通知等不必要的流程,异步执行即可。
此时使用MQ,可以在核心流程(扣减库存、生成订单记录)等完成后发送消息到MQ,快速结束本次流程。消费者拉取MQ消息时,发现红包、短信等消息时,再进行处理。
场景:双11是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口。
这种做法有一个缺点:
- 当库存系统出现故障时,订单就会失败。(这样马云将少赚好多好多钱钱。。。。)
- 订单系统和库存系统高耦合.
引入消息队列
- 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
- 库存系统:订阅下单的消息,获取下单消息,进行库操作。 就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失(马云这下高兴了,钞票快快的来呀~~)。
1.2. nsq架构原理
nsq组件
nsqd 负责接收,保存以及发送消息给消费者,的一个进程 nsqlookupd 负责维护所有nsqd的状态,提供服务发现的进程 nsqadmin 一个web管理平台,实时监控集群以及各种管理任务,(如topic,channel等任务)
架构图
概念
topic主题概念,对应一个具体的队列,如订单数据放到order_queue这个topic channel概念,每个消费者对应一个channel,实现消息可重复消费
nsq特性
消息默认不持久化,可配置成持久化 每条消息至少传递一次,保证消息不丢失,可能重复消费,需要业务去重 消息不保证有序
1.3. nsq使用
下载地址
https://nsq.io/deployment/installing.html
组件
nsqd 消息发送,存储,转发 nsqlookupd 服务发现 nsqadmin 管理后台 启动步骤:https://nsq.io/overview/quick_start.html 启动nsqlookupd 默认监听4160 启动nsqd --lookupd-tcp-address=127.0.0.1:4160 启动nsqadmin --lookupd-http-address=127.0.0.1:4161 可以访问http://127.0.0.1:4171/lookup看到后台,在Lookup视图创建topic
1.4. 创建topic/channel
1.5. nsq写入消息
生产者