设计思想
整体的设计思想80%借鉴kafka
基于主题的发布和订阅,其核心功能,消息发送、消息存储和消息消费。整体设计追求简单和性能
高效的IO存储机制,基于文件顺序读写,内存映射机制
相较于zookeeper,nameserver更专一、性能相对较好
设计目标
架构模式:发布订阅模式,主要组件:消息发送者、消息服务器(消息存储)、消息消费、路由发现。
顺序消息:RocketMQ 可以严格保证消息有序
消息过滤:消费者可以对同一主题下的消息按照规则只消费自己感兴趣的消息,可以支持在服务端与消费端的消息过滤机制。
消息存储:一般 MQ 核心就是消息的存储,对存储一般来说两个维度:消息堆积能力和消息存储性能。RocketMQ 追求消息存储的高性能,引入内存映射机制,所有的主题消息顺序存储在同一个文件中。同时为了防止无限堆积,引入消息文件过期机制和文件存储空间报警机制。
消息高可用:
1. Rocket 关机、断电等情况下,Rokcet 可以确保不丢失消息(同步刷盘机制不丢失,异步刷盘会丢失少量)。
2. 另外如果 Rocket 服务器因为 CPU、内存、主板、磁盘等关键设备损坏导致无法开机,这个属于单点故障,该节点上的消息全部丢失,如果开启了异步复制机制,Rocket 可以确保只丢失很少量消息。
3. 如果引入双写机制,这样基本上可以满足消息可靠性要求极高的场景(毕竟两台主服务器同时故障的可能性还是非常小)
消息消费低延迟:RocketMQ 在消息不发生消息堆积时,以长轮询模式实现准实时的消息推送模式。
确保消息必须被消费一次:消息确认机制(ACK)来确保消息至少被消费一次,一般 ACK 机制只能做到消息只被消费一次,有重复消费的可能,需要自己做幂等处理。
消息回溯:已经消费完的消息,可以根据业务要求重新消费消息。
消息堆积:消息中间件的主要功能是异步解耦,还有个重要功能是挡住前端的数据洪峰,保证后端系统的稳定性,这就要求消息中间件具有一定的消息堆积能力,RocketMQ 采用磁盘文件存储,所以堆积能力比较强,同时提供文件过期删除机制。
定时消息:定时消息,定时消息是指消息发送到 Rocket Broker 上之后,不被消费者理解消费,要到等待一定的时间才能进行消费,apache 的版本目 前只支持等待指定的时间才能被消费,不支持任意精度的定时消息消费。
消息重试机制:消息重试是指在消息消费时,如果发送异常,那么消息中间件需要支持消息重新投递,RocketMQ 支持消息重试机制。