RocketMQ简介
RocketMQ是一款开源的分布式消息中间件,具有高吞吐量、低延迟和高可靠性的特点。
主要解决,如下4大场景:
1、应用解耦
通过消息队列将生产者、和消费者解耦,比如:电商平台中,用户下单后,物流服务…等,可以通过消息队列解耦,彼此独立处理自己的业务逻辑。
2、异步通信
在系统间传递消息时,生产者发送消息后,不需要立即等待消费者处理完毕,而是可以继续执行其他操作,这样可以提高系统的响应速度、和吞吐量。
3、削峰填谷
最典型的就是:阿里双11,秒杀活动中,用户的抢购请求通过消息队列暂存,这就是典型的“削峰填谷”,避免因为瞬时高并发导致数据库压力过大。
4、消息广播
支持消息的多播,便于实现通知、和广播功能,比如:系统监控报警,当发现系统异常时,报警消息通过消息队列广播多个。
RocketMQ原理
架构和组件
RocketMQ架构,如下图所示:
RocketMQ架构:主要由NameServer、Broker、Producer以及Consumer四部分构成。
1.NameServer
提供命名服务,负责管理Topic和Broker的元数据信息。
要包括两个功能,如下图所示:
1)Broker管理
- NameServer接受Broker集群的注册信息,并且保存下来作为路由信息的基本数据;
- 然后提供心跳检测机制,检查Broker是否还存活;
2)路由信息管理
每个NameServer将保存关于Broker集群的整个路由信息,Producer和Conumser通过NameServer,就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。
2.Broker
消息中间件的服务器,负责存储和传递消息。
如下图所示:
Broker的核心功能包含:
- 接收 Producer 发过来的消息;
- 处理 Consumer 的消费消息请求;
- 消息的持 久化存储;
- 消息的 HA 机制;
- 服务端过滤功能等 。
3.Producer
消息的生产者,负责发送消息到Broker。
生产者发送消息时,先与Namesrv交互获取Broker信息,然后与Broker建立连接发送消息。
如下图所示:
- Producer创建消息时,需要指定消息的主题(Topic)、标签(Tag)和消息体(Body)等内容。
- 主题用于对消息进行分类和归类,标签用于对消息进行更细粒度的过滤和筛选。
- 消息体是实际的业务数据。
4.Consumer
消息的消费者,负责从Broker订阅并消费消息。
如下图所示:
消费者通过与Namesrv交互获取Broker信息,并根据主题和队列进行消息订阅。
消费者从Broker拉取消息进行消费,可以设置消费模式(顺序消费或并发消费)和消费进度。
消息存储
RocketMQ采用顺序写磁盘的方式持久化消息,以保证高吞吐量和消息的持久性。
消息存储在CommitLog文件中,其中包含了消息的主题、标签、属性等信息。
消息索引存储在Index文件中,用于快速查找消息。
消息的顺序性保证
RocketMQ支持顺序消费,在同一个队列上的消息按照发送顺序被消费。
对于全局有序的场景,可以将消息发送到同一个队列中。
对于局部有序的场景,可以将消息发送到多个队列中,并在消费端根据消息的某个关键属性进行排序。
高可用和容错性
RocketMQ通过主从复制机制实现高可用性和容错性。
Broker集群中的每个主节点都有相应的备份节点,当主节点出现故障时,备份节点可以接管服务。
Namesrv也可以配置为集群模式,提供高可用性和容错性。
消息的事务性
RocketMQ支持消息的事务性,允许生产者发送带有事务标记的消息。
生产者发送事务消息时,会先执行本地事务,然后根据事务结果提交或回滚消息。
事务消息的状态和进度由Broker和生产者共同管理和维护。
以上就是RocketMQ原理详解,更多RocketMQ请查看:RocketMQ最全详解(万字图文教程)
陈睿mikechen
十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》