消息队列的作用
1️⃣ 程序解耦
举个栗子:
用户注册成功会发送注册成功的短信通知。
传统模式下需要将用户信息持久化到数据库后,再调用发送短信接口。当短信平台暂时出现连通性问题,则会导致用户注册失败,也就是数据库存储失败,说明注册模块与短信功能高耦合,违反程序设计原则高内聚低耦合。
引用消息队列,将用户注册数据持久化到数据库后,把消息写入消息队列然后返回用户注册成功,短信平台通过从消息队列中获取消息为用户发送通知。
2️⃣ 异步处理
被调用者维度(内核):同步&异步
同步:在调用者A发起对被调用者B的调用后,B在未生成结果之前不会向A返回结果
异步:在调用者A发起对被调用者B的调用后,B直接返回,待生成结果后通过状态、通知或回调调用者A告知结果
调用者维度(用户):阻塞和非阻塞
阻塞:在调用者A发起对调用者B的调用后,A在未得到B告知的结果之前一直处于等待状态(线程挂起,不能进行其他操作)
非阻塞:在调用者A发起对调用者B的调用后,A可以进行的其他操作
3️⃣ 日志处理
日志采集客户端:负责日志数据采集和解析,并将日志数据 实时/定时 写入到消息队列
消息队列:负责日志数据的接收,存储和转发
日志处理应用:订阅消息队列,并消费日志数据
常见应用:ELK
4️⃣ 流量削峰
常见于商城秒杀活动,为解决访问量过大,导致流量暴增,应用挂掉。
常在服务器接收用户数据后,写入消息队列,后台业务根据消息队列中的请求信息继续后续逻辑处理。
5️⃣ 消息通信
消息队列一般都内置了高效的通信机制,可用于在消息通讯。比如实现点对点、广播消息队列,或者聊天室等场景。
NSQ介绍
什么是NSQ
用go语言开发的消息队列
NSQ组件
1️⃣ nsqd
用于接收、分发、传递消息到客户端的守护程序。
常侦听两个TCP端口,4150用于TCP客户端连接,4151用于提供HTTP APl,也可启用HTTPS API
2️⃣ nsqlookupd
用于管理nsqd拓扑信息的守护程序。
(消费者)客户端查询nsqlookupd以发现nsqd特定topic的生产者,常侦听两个TCP端口,4160用于nsqd的通信,4161用于提供HTTP API
3️⃣ nsqadmin
提供一个Web UI,用于实时查看群集信息并进行各种任务管理
NSQ工具
NSQ架构
根据上图梳理NSQ数据流:
- 生产者客户端连接到nsqd,并将数据消息发送到指定topic中
- nsqd将topic中数据分发到所有关联的channel中
- nsqd将channel中消息推送到订阅channel的
某个
客户中进行处理(比如上图中,最后的消息会发送给consumerA 或 B 的其中一个进行处理)
NSQ部署
单机部署
1️⃣ 启动nsqd
nsqd.exe --data-path=./datas
2️⃣ 启动nsqdadmin
nsqdadmin.exe --nsqd-http-address="localhost:4151"
3️⃣ 测试
- 生产者发送消息:启动to_nsq从控制台将消息发送到test主题
to_nsq.exe --nsqd-tcp-address="localhost:4150" --topic=test
- 消费者订阅消息:启动nsq _tail订阅test主题channel管道并将消息打印到控制台
nsqd_tail.exe --nsqd-tcp-address="localhost:4150" --topic test --channel test
集群部署
1️⃣ 启动nsqlookupd
nsqlookupd.exe
2️⃣ 启动nsqd
nsqd.exe --data-path=./datas --lookupd-tcp-address="localhost:4160"
3️⃣ 启动nsqdadmin
nsqdadmin.exe --nsqd-http-address="localhost:4161"
4️⃣ 测试
- 生产者发送消息:启动to_nsq从控制台将消息发送到test主题
to_nsq.exe --nsqd-tcp-address="localhost:4150" --topic=test
- 消费者订阅消息:启动nsq _tail订阅test主题channel管道并将消息打印到控制台
nsqd_tail.exe --lookupd-tcp-address="localhost:4161 --topic test --channel test