RocKetMQ分布式消息通信
RocKetMQ是一个低延迟,高可靠,可伸缩、易于使用的分布式消息中间件,也叫消息队列。其优点是高吞吐、低延迟、海量消息堆积等优点,同时提供顺序消息,事务消息,定时消息,消息重试,与追踪功能。
RocketMQ的应用常见
- 削峰填谷:如果秒杀、抢红包
- 异步解藕:交易系统、物流、购物车
- 顺序收发:交易系统创建订单、支付、退款
- 分布式事务一致性:交易系统、红包
- 大数据分析:业务数据实时分析
- 分布式缓存同步:双11感应价格变化
RocketMQ集群
整体架构设计
- Producer:消息发布的角色,主要把消息发送到Broker,支持分布式集群方式部署。
- Consumer:消息消费者的角色,主要负责把Broker订阅消息消费,支持分布式集群方式部署。
- Broker:消息存储的角色,主要负责消息的存储、投递和查询,以及服务高可用保证,支持分布式集群方式部署。
- NameServer服务管理角色,主要负责管理Broker集群的路由信息,支持分布式集群方式。
NameServer是一个Topic路由注册中心
- 服务注册:NameServer接受Broker集群的注册信息,保存下来作为路由信息的基本数据,并提供心跳检测机制,检查Broker是否存活。
- 路由信息管理:NameServer保存了Broker集群的路由信息,用于提供给客户端查询Broker的队列信息。Producer和Consumer通过NameServer可以知道Broker集群的路由信息,从而进行信息交换
基本概念
- Message:消息
- Topic:主题
- Queue:消息队列
- Tag:消息标志
- UserProperties:用户自定义的属性集合,属于消息的一部分
- ProducerGroup:同一个Producer集合,这类发送同一类消息。
- ConsumerGroup:同一类的Consumer集合消费同一类消息。
如何实现顺序消费
顺序发送的技术原理
- 局部有序:指发送同一个队列的消息有序,可以在发送消息时指定队列,在消费消息时也按顺序消费。不同订单ID之间并行,统一个ID有序。
- 全局有序:设置Topic只有1个队列可以实现全局有序,创建Topic时手动设置。
RocketMQ三种消息发送方式
- 同步:发送网络请求后会根据同步等待Broker服务器的返回结果,支持发送失败重试,适用于比较重要的消息通知场景。
- 异步:异步发送网络请求,不会阻塞当前线程,不支持失败重试,适用于对响应时间要求更高的场景。
- 单向:单向发送原理和异步一直,不支持回调。适用于响应时间非常短、对可靠性要求不高的场景,例如日志收集。
顺序消费的技术原理
顺序消费的原理:是因为同一个消息队列只允许Consumer中的一个消费线程拉去消费。Consumer中有多个消费线程池,多个线程会同时消费消息。在有序消费的情况下线程请求到Broker时会先申请独占锁,获得锁的请求则允许消费。
消息的幂等性
- at-most-once:消息投递后不论消费是否成功,不会重复投递,有可能会导致数据未被消费,RocketMQ未使用该方式。
- at-least-once:消费投递后,消费完成后,向服务器返回ACK,如果没有消费则一定不会返回ACK。由于网络异常】客户端重启等原因,服务器未能收到客户端返回的ACK,服务器则会再次投递,这就会导致可能重复 消费,RocketMQ通过ACK保证消息至少被消费一次。
- exactly-only-once:
事务消息的原理
-
发送预处理消息成功后,开始执行本地事务。
-
如果本地事务执行成功,发送提交请求提交本地事务。
-
如果本地事务执行失败了,发送回滚请求回滚事务消息,消息不回投递给客户端
-
如果本地事务状态未知,网络故障或Producer宕机,Broker未收到二次确定的消息。由Broker端发送请求给Producer进行消息回查,确认提交或者回滚。如果消息状态一直未被确认,需要人工介入。
版权声明:本文为qq_39734254原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。