RocketMQ学习(一):RocketMQ的设计理念和目标
设计理念
RocketMQ的设计是基于主题的发布与订阅模式,核心功能包括:消息发送、消息存储、消息消费;
整体设计有两个目标:简单与高性能,具体体现如下三个方面:
首先,引入Nameserver作为协调组件,与业界普通使用Zookeeper作为协调组件不同,RocketMQ通过自研Nameserver来实现元数据的管理(Topic路由信息等)。RocketMQ从实际需求出发,因为Topic路由信息无须在集群之间保持强一致,而追求的是最终一致性,并且能容忍分钟级的不一致,所以RocketMQ的Nameserver集群间是互不通信的。基于此种情况,既可以降低Nameserver实现复杂度,也降低了对网络的要求,而性能却比使用Zookeeper要高。
其次是高效的IO存储机制。RocketMQ追求消息发送的高吞吐量,RocketMQ的消息存储文件设计成文件组的概念,组内单个文件大小固定(CommitLog 1G,ConsumeQueue 600W个字节,IndexFile (40 + 500W*4 + 2000W*20)个字节),方便引入内存映射机制,所有的主题消息都是基于顺序写,这样可以极大提升消息写性能,同时为了兼顾消息消费与消息查找,又引入了消息消费队列(ConsumeQueue)和索引文件(IndexFile)。
最后是容忍设计存在缺陷。在使用消息中间件时,通常会遇到一个问题,就是如何保证消息一定会被消费者消费,并且只被消费一次。RocketMQ解决方案是:不解决,谁用谁负责处理。因为这样将极大简化RocketMQ的内核实现,并且可以保证发送简单与高效的高可用消息,消息重复问题由消费者在消费时自己实现幂等。
设计目标
RocketMQ作为一款消息中间件,必须解决如下问题:可被顺序消费至少一次的具有高可用性及具备处理特殊情况的消息中间件。
-
架构模式RocketMQ与大部分消息中间一样,采用发布订阅模式,基本的参与组件主要包括:消息发送者(Producer)、消息服务器(Broker)、消息消费者(Consumer)、路由发现(Nameserver)。
- 顺序消息RocketMQ是局部有序,即队列内有序,保证消费消息的顺序和存储到队列的顺序一致。
- 消息过滤消息过滤是指在消息消费时,消息消费者可以对同一主题下的消息按照规则只消费自己感兴趣的消息。RocketMQ消息过滤分别支持在服务端过滤或在消费端过滤机制。1)消息在服务端过滤,Broker提前对消息过滤,确保发送给消费者的消息都是消费者感兴趣的消息。2)消息在消费端过滤,会将所有的消息都发送给消费端,然后再根据消费者自己的过滤方式过滤,这种情况下,会包括无用的消息。
- 消息存储一个中间件的非常重要的两个维度:消息堆积能力和消息存储性能。RocketMQ追求消息存储的高性能,引入了内存映射机制,所有主题消息顺序存储在同一个文件中。同时为了避免消息无限在消息存储服务器中累积,引入了消息文件过期机制与文件存储空间报警机制。
- 消息高可用性影响消息可靠性的有以下几种情况:1)Broker正常关机。2)Broker异常宕机。3)操作系统宕机。4)机器断电,但是能立刻恢复供电。5)机器无法开机(某一硬件损坏,如:CPU、硬盘、内存)。6)磁盘设备损坏。针对以上情况,RocketMQ有不同的处理机制;情况1-4,Rocket在同步刷盘模式下可以确保消息不丢失,在异步刷盘模式下,情况1不会丢失消息,情况2、3、4会丢失少量消息;情况5、6属于单点故障,一旦发生该节点的消息全部丢失,如果开启了异步复制机制,RocketMQ能保证只丢失少量消息,RocketMQ在后续版本中将引入多副本机制,以满足消息可靠性要求极高的场合。
- 消息到达低延迟RocketMQ在未发生消息堆积时,通过长轮询模式实现准实时的消息推送模式。
- 确保消息必须被消费一次RocketMQ通过消息消费确认机制(ACK)来确保消息至少被消费一次,但由于ACK消息有可能丢失等其他原因,RocketMQ无法做到消息只被消费一次,有重复消费的可能。
- 回溯消息回溯消息是指消息消费端已经消费成功的消息,由于业务要求需要重新消费消息。RocketMQ支持按时间回溯消息,时间维度可精确到毫秒,可以向前或向后回溯。
- 消息堆积消息中间件的主要功能是异步、解耦,必须具备应对前端数据洪峰的能力,提高后端系统的可用性,必然要求消息中间件具备一定的消息堆积能力。RocketMQ消息存储使用磁盘文件(内存映射机制),并且在物理布局上为多个大小相等的文件组成逻辑文件组,可以无限循环使用。RocketMQ消息存储文件并不是永久存储在消息服务器端,而是提供了过期机制,默认保留72小时。
- 定时消息定时消息是指消息发送到Broker后,不能被消息消费者立即消费,要到特定的时间点或者等待特定的时间后才能被消费。如果要支持任意精度的定时消息消费,必须在消息服务端对消息进行排序,势必带来很大的性能损耗,故RocketMQ不支持任意精度的定时消息,而只支持特定延迟级别。
- 消息重试机制消息重试是指消息在消费时,如果发生异常,消息中间件需要支持消息重新投递,RocketMQ支持消息重试机制。
浙公网安备 33010602011771号