今天是青训营的第12次课了,我将会对消息队列的概念与应用做一个知识梳理,并且着重对RocketMQ这个消息中间件做知识梳理。
一、消息队列
什是消息队列?
消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。
通俗讲就是一种消息容器,本质上是个队列,且该队列需要高吞吐、高并发、高可用。
消息队列的适用场景
- 解耦:以搜索与点击商品为例,将搜索行为记录发送到消息队列中,再由存储服务去消息队列中将消息拉取出来进行消费。即便是存储服务出现故障或宕机,搜索行为记录等消息也会成功发送至消息队列中,不会对整个搜索、点击流程造成影响。以我个人大白话的理解来说,就是一个系统产生的消息,送至消息队列中,其他系统“按需”去消息队列中拉取消息进行消费,使各系统之间大大解耦。
- 削峰:以处理订单请求为例,当有大量订单请求时,将请求存入消息队列中,服务端每次只从消息队列中拉取10个请求进行处理,可以避免请求高峰期海量请求导致系统崩溃的问题。
- 异步:以处理订单为例,在发起订单的消息存入消息队列后,将整套流程中订单记录、库存记录、通知商家的操作异步地在不同链路上进行。而在发起订单的消息存入队列后,用户便可以收到下单成功的通知了,大大减少了用户等待的时间。
- 日志处理:将日志存入消息队列中,通过一些日志处理组件写入SQL引擎,再交由例如Kibana这样的数据查询、数据可视化平台进行分析。
消息队列的应用实例
- 电商系统
- 日志收集系统
消息队列的优缺点
优点
- 解耦
- 异步
- 削峰
缺点
- 系统可用性降低
- 系统复杂度增高
- 一致性问题
二、消息中间件——RocketMQ
RocketMQ事务消息处理流程简述
1.事务消息发送及提交
- 发送消息(half消息)
- 服务端响应消息写入结果
- 根据发送消息执行本地事务(若发送失败,此时half消息对业务不可见,本地逻辑不执行)
- 根据本地事务执行Commit或者Rollback(Commit操作生成消息索引,消息对消费者可见)
2.事务补偿流程
- 对没有Commit/Rollback的事务消息(pending状态的消息),从服务端发起一次“回查”
- Producer收到回查消息,检查回查消息对应的本地事务的状态
- 根据本地事务状态,重新Commit或者Rollback
RocketMQ的特点
- 单机吞吐量:10万级,支持高吞吐
- topic数量对吞吐量的影响:topic数量可以达到几百几千级别。在同等机器下,RocketMQ可以支持更多的topic
- 时效性:ms级
- 可用性:非常高,分布式架构
- 可靠性:经过参数优化配置,可以做到0丢失
- 功能支持:分布式,扩展性好