Apache RocketMQ是阿里开源的一款高性能、高吞吐量的分布式消息中间件。
一、系统部署架构
下图为RocketMQ系统部署架构:
整体的架构设计主要分为四大部分,分别是:Producer、Consumer、Broker、NameServer。
- Producer:消息生产者,可以集群部署。会先和 NameServer 集群中的随机一台建立长连接,得知当前要发送的 Topic 存在哪台 Broker Master上,然后再与其建立长连接,定时向Broker发送心跳。同时支持多种负载平衡模式发送消息。
- Consumer:消息消费者,可以集群部署。会先和 NameServer 集群中的随机一台建立长连接,得知当前要消息的 Topic 存在哪台 Broker Master、Slave上,然后它们建立长连接,定时向Broker发送心跳。同时支持集群消费和广播消费消息。
- Broker:主要负责消息的存储、查询消费,支持主从部署,一个 Master 可以对应多个 Slave。Master 支持读写,Slave 只支持读。Broker 会向集群中的每一台 NameServer 注册自己的路由信息。定期30s向NameServer上报Topic路由信息。
- NameServer:是Topic 路由注册中心,支持 Broker 的动态注册和发现,保存 Topic 和 Borker 之间的关系。也是集群部署,但是各 NameServer 之间不会互相通信, 各 NameServer 都有完整的路由信息,即无状态。
二、RocketMQ常见名词
- Topic : 消息主题,一级消息类型,通过Topic对消息进行分类。
- Producer : 消息生产者,负责生产并发送消息。
- Consumer : 消息消费者,负责接收并消费消息。根据消费方式分为两类:
- Push Consumer:消息由消息队列推送至Consumer。
- Pull Consumer:Consumer主动从消息队列拉取消息。可以一次拉取固定数量消息,防止Consumer打垮。
- Group:生产组(Producer Group)或消费组(Consumer Group),Producer或Consumer通常生产或消费同一类消息,且消息发布或订阅的逻辑一致。这样可以实现负载均衡和容错策略。
- Tag : 消息标签,二级消息类型,可以对Topic下消息进一步分类。
- Message ID:消息全局唯一标识。
- Message Key:消息业务标识Key,可以通过Key进行Hash打到相同消息队列中。
- Message: 消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。每个消息拥有唯一的Message ID,且可以携带具有业务标识的Key。
- offset:偏移量可以认为就是消息下标。offset是long 类型,不会溢出。
- 集群消费:相同Group 的消费组下的所有Consumer平分消费消息。
- 广播消费:所有Consumer都会消费消息,保证消息至少被每个消费者消费一次。但不会重发消费消息失败需要业务方关注。
- 延迟消息:生产端设定一个时间点,消费端并不立即消费到,直到设定的时间点后消费端才收到消息。现阶段只支持时间级别,后续会支持自定义时间点。
- 事务消息:通过消息队列事务消息能达到分布式事务的最终一致。
- 顺序消息:消息生产端按照指定的Sharding Key发送消息时进行分区,消费端则按照消息的发送时间先后顺序消费。
- 消息堆积:Producer生产消息后,消费端由于处理能力慢或者其他因素导致消息没有被及时消费掉。业务方可以基于消息堆积进行监控告警,可以扩容消费端或者限制发送消息速率。
- 消息过滤:根据消息Tag标签进行过滤,只接受符合条件的消息。消费者订阅消息支持多种方式包括运算符,等于null或者*,则表示全部订阅。
- 消息轨迹:一条消息从Producer发出到Consumer消费处理过程中,由各个相关节点的时间、ip等数据汇聚而成的完整链路信息。通过消息轨迹,您能清晰定位消息从Producer发出,经由消息队列服务端,投递给Consumer的完整链路,方便定位排查问题。
三、RocketMQ常用场景
1、异步解耦
生产者发送消息到MQ中,然后下游消费端订阅Topic获取消息并完成后续消息。生产端不会因为消息没处理而阻塞,可以完成后续逻辑处理。下游业务端根据消息进行不同业务逻辑处理。
例如订单发送消息后,下游物流、售后、保险等业务订阅消息并完成相应逻辑处理,互不影响。
2、削峰填谷
当业务方发起的请求,下游系统在短时间内无法处理海量请求数据,导致系统压力大甚至会导致系统崩溃等问题而发生漏通知的情况。可以堆积在MQ中,下游系统按照消费能力进行处理消息,秒杀系统就是这么实现的。
3、 订阅场景
当上游系统发起请求希望客户端都能够收到消息,RocketMQ支持 Consumer 使用广播模式,每条消息都会被 Consumer 集群内所有的 Consumer 实例消费一次。常见场景消息通知。
4、分布式事务一致性
业务方希望将消息发送和业务持久化逻辑处理作为原子性,希望要么都成功,要么都失败。 消息队列RocketMQ版提供类似X或Open XA的分布式事务功能,通过消息队列RocketMQ版事务消息,能达到分布式事务的最终一致。下图则是Rocketmq支持的事务消息的流程处理。