其他
大写的服,看完这篇你还不懂RocketMQ算我输
The following article is from 猿天地 Author 尹吉欢
目录
RocketMQ介绍
RocketMQ概念
为什么要用RocketMQ?
异步解耦
削峰填谷
分布式事务最终一致性
数据分发
RocketMQ架构
RocketMQ消息类型
普通消息
顺序消息
定时消息
事务消息
最佳实践
消息重试
消息过滤
消费模式
消费幂等
本地事务消息封装
参考代码
RocketMQ 介绍
RocketMQ 概念
Topic:消息主题,用于将一类的消息进行归类,比如订单主题,就是所有订单相关的消息都可以由这个主题去承载,生产者向这个主题发送消息。 生产者:负责生产消息并发送消息到 Topic 的角色。 消费者:负责从 Topic 接收并消费消息的角色。 消息:生产者向 Topic 发送的内容,会被消费者消费。 消息属性:生产者发送的时候可以为消息自定义一些业务相关的属性,比如 Mesage Key 和 Tag 等。 Group:一类生产者或消费者,这类生产者或消费者通常生产或消费同一类消息,且消息发布或订阅的逻辑一致。
为什么要使用 RocketMQ?
异步解耦
锁库存 创建订单 用户支付 扣减库存 给用户发送购买短信通知 给用户增加积分 通知商家发货
削峰填谷
分布式事务最终一致性
数据分发
RocketMQ 架构
Name Server:是一个几乎无状态节点,可集群部署,在消息队列 RocketMQ 版中提供命名服务,更新和发现 Broker 服务,就是一个注册中心。 Broker:消息中转角色,负责存储消息,转发消息。分为 Master Broker 和 Slave Broker,一个 Master Broker 可以对应多个 Slave Broker,但是一个 Slave Broker 只能对应一个 Master Broker。Broker 启动后需要完成一次将自己注册至 Name Server 的操作;随后每隔 30s 定期向 Name Server 上报 Topic 路由信息。 生产者:与 Name Server 集群中的其中一个节点(随机)建立长连接(Keep-alive),定期从 Name Server 读取 Topic 路由信息,并向提供 Topic 服务的 Master Broker 建立长链接,且定时向 Master Broker 发送心跳。 消费者:与 Name Server 集群中的其中一个节点(随机)建立长连接,定期从 Name Server 拉取 Topic 路由信息;并向提供 Topic 服务的 Master Broker、Slave Broker 建立长连接,且定时向 Master Broker、Slave Broker 发送心跳。Consumer 既可以从 Master Broker 订阅消息,也可以从 Slave Broker 订阅消息,订阅规则由 Broker 配置决定。
RocketMQ 消息类型
普通消息
同步发送
异步发送
单向发送
顺序消息
定时消息
事务消息
发送方首先发送半事务消息到 RocketMQ 服务端。 RocketMQ 服务端接收到消息,然后将消息持久化成功之后,向发送方返回 ACK(消费确认), 确认消息已经发送成功,此时消息为半事务消息,不会投递给消费方。 收到半事务消息的 ACK 后,发送方开始执行本地事务逻辑。 发送方根据本地事务执行结果向服务端提交二次确认,如果本地事务执行成功则进行消息的 Commit,如果执行失败则进行消息的 Rollback,服务端收到 Commit 状态则将半事务消息标记为可投递,消费方最终将收到该消息;服务端收到 Rollback 状态则删除半事务消息,消费方将不会收到该消息。 如果出现意外情况,步骤 4 没有进行消息的二次确认,等待固定时间后服务端将对该消息发起消息回查。 发送方收到消息回查后,需要检查对应消息的本地事务执行的最终结果。发送方根据检查得到的本地事务的最终状态再次提交二次确认,服务端仍按照步骤 4 对半事务消息进行操作。
最佳实践
消息重试
消息过滤
消费模式
消费幂等
本地事务消息封装
参考代码
往期推荐:
技术琐话
以分布式设计、架构、体系思想为基础,兼论研发相关的点点滴滴,不限于代码、质量体系和研发管理。本号由坐馆老司机技术团队维护。