目录
RocketMQ

​ 消息队列 RocketMQ 是阿里巴巴集团基于高可用分布式集群技术,自主研发的云正式商用的专业消息中间件,既可为分布式应用系统提供异步解耦 和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性,是阿里巴巴双 11 使用的核心产品。

RocketMQ 的设计基于主题的发布与订阅模式,其核心功能包括消息发送、消息存储(Broker)、消息消费,整体设计追求简单与性能第一。

  1. NameServer 设计及其简单,RocketMQ 摈弃了业界常用的 Zookeeper 充当消息管理的“注册中心”,而是使用自主研发的 NameServer 来实现 各种元数据的管理(Topic 路由信息等)
  2. 高效的 I/O 存储,RocketMQ 追求消息发送的高吞吐量,RocketMQ 的消息存储设计成文件组的概念,组内单个文件固定大小,引入了内存映射 机制,所有主题的消息存储基于顺序读写,极大提高消息写性能,同时为了兼顾消息消费与消息查找,引入消息消费队列文件与索引文件
  3. 容忍存在设计缺陷,适当将某些工作下放给 RocketMQ 的使用者,比如消息只消费一次,这样极大的简化了消息中间件的内核,使得 RocketMQ 的实现发送变得非常简单与高效。

核心概念

image-20191030152719983

NameServer

​ NameServer 是整个RocketMQ的“大脑”, 它是RocketMQ的服务注册中心,所以RocketMQ需要先启动NameServer再启动Rocket中的Broker。

​ Broker在启动时向所有NameServer注册(服务器地址信息等),生产者在发送消息之前先从NameServer获取Broker服务器地址列表(消费者也是一样),然后根据负载均衡算法从列表中选择一台服务器进行消息发送。

​ NameServer与每一台Broker服务保持长连接,并间隔30s检查Broker是否存活,如果检测到Broker宕机,则从路由注册表中将其移除。这样就可以实现RocketMQ的高可用。

主题

​ Topic, 消息主题,以及消息类型,生产者向其发送消息。消费者负责从Topic接收并消费消息。

生产者

​ 也称为消息发布者,负责生产并发送消息至Topic。

消费者

​ 也称为消息订阅者,负责从Topic接收并消费消息。

消息

​ 生产者或者消费者进行消息发送或消费的主题,对于RocketMQ来说,消息就是字节数组。

整体流程:

  1. NameServer先启动
  2. Broker启动时向NameServer注册
  3. 生产者发送某个主题的消息之前先从NameServer获取Broker服务器地址列表(可能是集群),然后根据负载均衡算法从列表中选择一台Broker进行消息发送。
  4. NameServer与每台Broker服务器保持长连接,并间隔30s检测Broker是否存活,如果检测到Broker宕机(使用心跳机制,如果检测超过120s),则从路由注册表中将其移除。
  5. 消费者在订阅某个主题的消息之前从NameServer获取Broker服务器地址列表(可能是集群),但是消费者选择从Broker中订阅消息,订阅规则由Broker配置决定。

RocketMQ的设计理念和目标

设计理念:

​ 基于主题的发布与订阅,其核心功能,消息发送、消息存储和消息消费。整体设计追求简单和性能。

​ NameServer性能对比Zookeeper有极大的提升

​ 高效的IO存储机制,基于文件顺序读写,内存映射机制

​ 容忍设计缺陷,比如消息只消费一次。Rocket自身不保证,从而简化Rocket的内核使得Rocket简单与高效,这个问题交个消费者去实现(幂等)。

设计目标:

架构模式:发布订阅模式,主要组件:消息发送者、消息服务器(消息存储)、消息消费、路由发现

顺序消息:RocketMQ可以严格保证消息有序

消息过滤:消息消费时,消费者可以对同一主题下的消息按照规则只消费自己感兴趣的消息,可以支持在服务端与消费端的消息过滤机制。

消息存储:一般MQ核心就是消息的存储,对存储一般来说两个维度:消息堆积能力和消息存储性能。RocketMQ追求消息存储的高性能,引入内存映射机制,所有的主题消息顺序存储在同一个文件中。同时为了防止无限堆积,引入消息文件过期机制和文件存储空间报警机制。

消息高可用:

  1. Rocket关机、断电等情况下,Rocket可以确保不丢失消息(同步刷盘机制不丢失,异步刷盘会丢失少量)。
  2. 另外如果Rocket服务器因为CPU、 、主板、磁盘等关键设备损坏导致无法开机。属于单点故障,该节点上的消息全部丢失,如果开启了异步复制机制,Rocket可以确保丢失很少量消息。
  3. 如果引入双写机制,这样基本上可以满足消息可靠性要求极高的场景

消息消费低延迟:RocketMQ在消息不发生消息堆积时,以长轮询模式实现准实时的消息推送模式。

确保消息必须被消费一次:消息确认机制(ACK)来确保消息至少被消费一次,一般ACK机制只能做到消息只被消费一次,有重复消费的可能。

消息回溯:已经消费完的消息,可以根据业务要求重新消费消息。

消息堆积:消息中间件的主要功能是异步解耦,还有个重要功能是挡住前端的数据洪峰,保证后端系统的稳定性,这就要求消息中间件具有一定的消息堆积能力,RocketMQ采用磁盘文件存储,所以堆积能力比较强,同时提供文件过期删除机制。

定时消息:定时消息,定时消息是指消息发送到Rocket Broker上之后,不被消费者立即消费,要等待一定的时间才能进行消费,apache的版本目前只支持等待指定的时间才能被消费,不支持任意精度的定时消息消费。(ps: 阿里云版本RocketMQ提供这样的功能,意思是收费才能使用)

文章作者: Shawn Lee
文章链接: https://longshilee.github.io/2019/10/30/RocketMQ/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Shawn·Lee
打赏
  • 微信
  • 支付宝

评论