《RocketMQ技术内幕》学习笔记

一、RocketMQ源码目录

《RocketMQ技术内幕》学习笔记
RocketMQ核心目录说明:

  • broker:broker模块
  • client:消息客户端:包括消息生产者、消息消费者等
  • common:公共包
  • dev:开发者信息(非源代码)
  • distribution:部署实例文件夹(非源代码)
  • example:RocketMQ示例代码
  • filter:消息过滤相关基础类
  • filtersrv:消息过滤服务器相关实现类
  • logappender:日志实现相关类
  • namesrv:NameServer实现相关类
  • openmessaging:消息开放标准,正在定制定
  • remoting:远程通信模块,基于Netty
  • srvutil:服务器工具类
  • store:消息存储相关实现类
  • style:checkstyle相关实现
  • test:测试相关类
  • tools:工具类,监控命令相关实现类。

二、RocketMQ设计

2.1、设计理念

RocketMQ的设计基于topic的sub/pub模式,其核心功能包括消息发送、消息存储、消息消费。

整体设计追求简单与性能第一,主要体现在如下三个方面:
1、NameServer:摒弃了zookeeper,自研了NameServer来做元数据的管理(topic路由信息等)。由于topic路由信息能容忍分钟级别的不一致,所以不必强一致,做到最终一致性即可。所以RocketMQ的NameServer集群之间互不通信,极大地降低了NameServer实现的复杂度,但性能比zk强许多。-- 这个是对kafka zk的优化
2、IO存储机制:RocketMQ的消息存储文件设计成文件组,组内单个文件的大小固定,引入了内存映射机制(啥是内存映射?),所有topic消息的存储都是顺序写磁盘,极大提升了写性能。为了兼顾消息消息与消息查找,引入了消息消费队列文件与索引文件。-- 这些基本都是学的kafka啊。
3、容忍设计缺陷,将某些MQ的工作留给MQ的使用方来处理。即消息如何做到不丢、不重。RocketMQ只保证消息不丢,不保证消息不重。消息不重需要使用在在消费后自己实现幂等。

2.2、设计目标

RocketMQ作为一款消息中间件,用来解决下面的问题。

1、架构模式

RocketMQ与大多数消息中间件一样,采用sub/pub模式,参与组件主要包括:
消息生产者、消息存储(broker)、消息消费者、路由发现。

2、顺序消息:这点比kafka强,kafka只保证同一个partition中的顺序

所谓顺序消息,指消息消费者按照消息到达消息存储服务器的顺序消费。RocketMQ可以严格保证消息有序。

3、消息过滤:这点kafka没有

消息过滤指,消息消费者可以按照指定规则,只消费topic下自己感兴趣的消息。RocketMQ消息过滤支持在服务端过滤和消费端过滤:
1)消息在broker过滤:broker只把consumer感兴趣的消息发给consumer
2)消息在consumer过滤:由consumer自己实现过滤,但缺点是很多无用的消息会从broker传输到consumer。

4、消息存储

消息存储会考虑:消息积压能力 和 消息存储写性能。
1)消息存储写性能:RocketMQ引入内存映射机制,所有topic的消息,顺序存储到了同一个文件中。 – kafka是写入多个文件中(多个partition),所以kafka无序,RocketMQ有序。
2)消息积压能力:为了避免消息无限制在服务器中堆积,引入了消息文件过期机制 与 文件存储空间报警 机制。-- 这与kafka类似

5、消息高可用性

可能影响消息可用性的场景:
1)Broker正常关机
2)Broker异常Crash
3)OS Crash
4)集群断电,但能立即恢复供电
5)集群无法开机(可能CPU、主板、内存等关键设备损坏)
6)磁盘设备损坏

对于上述情况,1~4 RocketMQ在同步刷盘时可保证消息不丢;在异步刷盘的模式下会丢少量消息。
5~6属于单点故障,一旦发生,该节点上的消息全部丢失;如果开启了异步复制机制,RocketMQ只丢少量消息。(怎样异步复制?)

6、消息消费低延迟

RocketMQ在消息不发送积压时,以长轮询模式实现准实时的消息推送。-- 是推还是拉?

7、确保消息必须被消费一次:消息不丢

RocketMQ通过ack来确保消息至少被消费一次,但有重复消费的可能。

8、回溯消息

回溯消息指消息已经被consumer成功消费,但由于业务需求,还要重新消费。RocketMQ支持回溯消息,时间维度可精确到毫秒,还可以向前会向后回溯。-- 这点kafka只支持用offset回溯?

9、消息堆积

RocketMQ消息存储使用磁盘文件(内存映射机制),在物理布局上为多个大小相等的文件组成逻辑文件组,可以无限循环使用。RocketMQ的消息存储文件默认保留3天。-- 跟kafka类似

10、定时消息

定时消息指消息发送到broker后,不会马上被consumer消费,要等到特定时间点才被消费。RocketMQ不支持任意精度的定时消息,只支持特定延迟级别。
说明:如果要支持按任意精度的定时消息消费,需要再服务端对消息排序,势必极大损耗性能。所以RocketMQ不支持。

11、消息重试机制

消息重试指消息在被消费时,如果发送异常,RocketMQ支持消息重新发送。

三、路由中心NameServer