角色
-
生产者(Producer): 生产者是消息的发送者,负责将业务系统产生的消息发送到RocketMQ。生产者将消息发送到指定的Topic(主题),Topic是RocketMQ中消息分类的基本单位。生产者将消息发送到Broker后,Broker负责将消息存储和分发给消费者。
-
消费者(Consumer): 消费者是消息的接收者,负责从RocketMQ中拉取消息并对其进行处理。消费者订阅感兴趣的Topic,并通过消费者组(Consumer Group)来实现负载均衡和容错。消费者组内的多个消费者实例共同消费一个Topic的消息,以提高系统的吞吐量。
-
NameServer: NameServer是RocketMQ的注册中心和路由发现组件。它维护了生产者、消费者和Broker之间的路由信息。生产者和消费者可以通过NameServer找到Broker,从而完成消息的发送和接收。NameServer本身是无状态的,可以横向扩展以支持大规模的集群。
-
Broker: Broker是RocketMQ的核心组件,负责存储和传输消息。Broker接收来自生产者的消息,并将其存储在磁盘上。同时,Broker将消息推送给订阅了相应Topic的消费者。为了实现高可用性和容错,Broker可以进行集群部署,每个Broker集群包含一个主节点(Master)和多个从节点(Slave)。主节点负责读写消息,从节点仅负责消息的备份。
基本概念
-
分组(Group):
分组是RocketMQ中的一个逻辑概念,主要用于区分生产者(Producer Group)和消费者(Consumer Group)。在RocketMQ中,生产者和消费者通过分组来实现负载均衡和容错。
生产者分组(Producer Group):生产者分组通常用于区分不同的生产者应用。一个生产者分组内的生产者实例可以发送相同或不同的Topic的消息。
消费者分组(Consumer Group):消费者分组用于实现消息的并行消费。一个消费者分组内的消费者实例共同消费一个Topic的消息,以提高系统的吞吐量。消费者分组还可以实现容错,当一个消费者实例出现故障时,其他实例可以继续消费消息,确保消息不会丢失。
-
主题(Topic):
主题是RocketMQ中消息分类的基本单位。生产者将消息发送到指定的Topic,消费者订阅感兴趣的Topic来接收消息。一个Topic可以有多个生产者和消费者,它们可以是属于同一个分组或不同分组的实例。Topic的设计使得生产者和消费者可以解耦,提高系统的可扩展性和灵活性。
-
消息队列(Message Queue):
消息队列是RocketMQ中用于存储消息的数据结构。每个Topic的消息都分布在多个消息队列中,这样可以实现消息的并行存储和消费。消息队列的数量可以根据系统的负载动态调整。消费者分组内的消费者实例会从不同的消息队列中拉取并消费消息,实现负载均衡。
-
偏移量(Offset):
偏移量是RocketMQ中用于表示消费者在消息队列中的消费进度的数字。每个消费者分组内的消费者实例都有自己的偏移量,表示已经消费到哪个消息。当消费者消费了一个消息后,偏移量会自动递增。RocketMQ会定期将消费者的偏移量持久化到磁盘,以防止消费者实例重启或故障后消息的重复消费。
普通消息的发送
顺序消息
事务消息
半事务 本地事务/回查 消费者幂等性及确保成功
其他
延时消息 批量消息 过滤消息(Tag过滤,SQL语法)
消息存储结构
-
CommitLog:
CommitLog 是 RocketMQ 中的消息存储文件,它采用追加写的方式进行持久化。所有的消息(包括不同 Topic 的消息)都会写入到同一个 CommitLog 文件中。CommitLog 会按照一定大小划分为多个文件,当一个文件写满后,会继续写入到下一个文件。这种设计确保了 RocketMQ 的高写入性能。
-
ConsumeQueue:
ConsumeQueue 是 RocketMQ 中用于存储消息消费队列的文件。每个 Topic 下的每个 Message Queue 都有一个独立的 ConsumeQueue。ConsumeQueue 里的每一项包含了消息在 CommitLog 中的物理偏移量(offset)和消息长度等信息。ConsumeQueue 的设计使得消费者能够快速地定位到 CommitLog 中的消息,提高了消息的消费速度。
-
IndexFile:
IndexFile 是 RocketMQ 中用于存储消息索引的文件。它为消息的唯一键(例如消息ID)提供了一个索引,使得生产者和消费者能够快速地根据消息的唯一键查找到消息。IndexFile 的设计提高了 RocketMQ 的查询性能,但同时会增加一定的写入开销。
-
MappedFile:
MappedFile 是 RocketMQ 存储结构的基础组件。CommitLog、ConsumeQueue 和 IndexFile 都是由 MappedFile 组成的。MappedFile 是一个基于内存映射(Memory Mapped)的文件,将磁盘上的文件映射到内存中,从而提高了文件的读写性能。RocketMQ 通过 MappedFile 实现了高性能的文件存储。
零拷贝与MMAP
-
零拷贝(Zero-copy):
零拷贝是一种减少数据拷贝次数的技术,目的是提高数据传输的性能。在传统的数据传输过程中,数据会在内核空间和用户空间之间进行多次拷贝。零拷贝技术通过避免这些额外的拷贝操作,提高数据传输速度和效率,同时减少 CPU 的负担。
零拷贝技术的实现方法有很多,例如 sendfile() 系统调用、splice() 系统调用等。这些方法可以将数据直接从内核空间传输到内核空间,或者从内核空间传输到用户空间,而无需在用户空间进行额外的拷贝。
-
内存映射(Memory Mapped,MMAP):
内存映射是一种将磁盘上的文件映射到内存中的技术。通过内存映射,文件的内容可以直接映射到进程的虚拟地址空间,使得进程可以像访问内存一样访问文件。内存映射提高了文件读写的性能,同时简化了文件操作的编程模型。
内存映射的实现依赖于操作系统的虚拟内存管理和页面缓存机制。当进程访问映射的文件内容时,操作系统会将文件的内容加载到页面缓存中。进程对映射的内存进行读写操作时,操作系统会自动处理页面缓存的同步和更新。