RocketMQ入门

角色

  1. 生产者(Producer): 生产者是消息的发送者,负责将业务系统产生的消息发送到RocketMQ。生产者将消息发送到指定的Topic(主题),Topic是RocketMQ中消息分类的基本单位。生产者将消息发送到Broker后,Broker负责将消息存储和分发给消费者。

  2. 消费者(Consumer): 消费者是消息的接收者,负责从RocketMQ中拉取消息并对其进行处理。消费者订阅感兴趣的Topic,并通过消费者组(Consumer Group)来实现负载均衡和容错。消费者组内的多个消费者实例共同消费一个Topic的消息,以提高系统的吞吐量。

  3. NameServer: NameServer是RocketMQ的注册中心和路由发现组件。它维护了生产者、消费者和Broker之间的路由信息。生产者和消费者可以通过NameServer找到Broker,从而完成消息的发送和接收。NameServer本身是无状态的,可以横向扩展以支持大规模的集群。

  4. Broker: Broker是RocketMQ的核心组件,负责存储和传输消息。Broker接收来自生产者的消息,并将其存储在磁盘上。同时,Broker将消息推送给订阅了相应Topic的消费者。为了实现高可用性和容错,Broker可以进行集群部署,每个Broker集群包含一个主节点(Master)和多个从节点(Slave)。主节点负责读写消息,从节点仅负责消息的备份。

基本概念

  1. 分组(Group):

    分组是RocketMQ中的一个逻辑概念,主要用于区分生产者(Producer Group)和消费者(Consumer Group)。在RocketMQ中,生产者和消费者通过分组来实现负载均衡和容错。

    生产者分组(Producer Group):生产者分组通常用于区分不同的生产者应用。一个生产者分组内的生产者实例可以发送相同或不同的Topic的消息。

    消费者分组(Consumer Group):消费者分组用于实现消息的并行消费。一个消费者分组内的消费者实例共同消费一个Topic的消息,以提高系统的吞吐量。消费者分组还可以实现容错,当一个消费者实例出现故障时,其他实例可以继续消费消息,确保消息不会丢失。

  2. 主题(Topic):

    主题是RocketMQ中消息分类的基本单位。生产者将消息发送到指定的Topic,消费者订阅感兴趣的Topic来接收消息。一个Topic可以有多个生产者和消费者,它们可以是属于同一个分组或不同分组的实例。Topic的设计使得生产者和消费者可以解耦,提高系统的可扩展性和灵活性。

  3. 消息队列(Message Queue):

    消息队列是RocketMQ中用于存储消息的数据结构。每个Topic的消息都分布在多个消息队列中,这样可以实现消息的并行存储和消费。消息队列的数量可以根据系统的负载动态调整。消费者分组内的消费者实例会从不同的消息队列中拉取并消费消息,实现负载均衡。

  4. 偏移量(Offset):

    偏移量是RocketMQ中用于表示消费者在消息队列中的消费进度的数字。每个消费者分组内的消费者实例都有自己的偏移量,表示已经消费到哪个消息。当消费者消费了一个消息后,偏移量会自动递增。RocketMQ会定期将消费者的偏移量持久化到磁盘,以防止消费者实例重启或故障后消息的重复消费。

普通消息的发送

 

顺序消息

 

事务消息

半事务    本地事务/回查       消费者幂等性及确保成功

 

其他

延时消息    批量消息   过滤消息(Tag过滤,SQL语法)

 

消息存储结构

  1. CommitLog:

    CommitLog 是 RocketMQ 中的消息存储文件,它采用追加写的方式进行持久化。所有的消息(包括不同 Topic 的消息)都会写入到同一个 CommitLog 文件中。CommitLog 会按照一定大小划分为多个文件,当一个文件写满后,会继续写入到下一个文件。这种设计确保了 RocketMQ 的高写入性能。

  2. ConsumeQueue:

    ConsumeQueue 是 RocketMQ 中用于存储消息消费队列的文件。每个 Topic 下的每个 Message Queue 都有一个独立的 ConsumeQueue。ConsumeQueue 里的每一项包含了消息在 CommitLog 中的物理偏移量(offset)和消息长度等信息。ConsumeQueue 的设计使得消费者能够快速地定位到 CommitLog 中的消息,提高了消息的消费速度。

  3. IndexFile:

    IndexFile 是 RocketMQ 中用于存储消息索引的文件。它为消息的唯一键(例如消息ID)提供了一个索引,使得生产者和消费者能够快速地根据消息的唯一键查找到消息。IndexFile 的设计提高了 RocketMQ 的查询性能,但同时会增加一定的写入开销。

  4. MappedFile:

    MappedFile 是 RocketMQ 存储结构的基础组件。CommitLog、ConsumeQueue 和 IndexFile 都是由 MappedFile 组成的。MappedFile 是一个基于内存映射(Memory Mapped)的文件,将磁盘上的文件映射到内存中,从而提高了文件的读写性能。RocketMQ 通过 MappedFile 实现了高性能的文件存储。
     

零拷贝与MMAP

 

  1. 零拷贝(Zero-copy):

    零拷贝是一种减少数据拷贝次数的技术,目的是提高数据传输的性能。在传统的数据传输过程中,数据会在内核空间和用户空间之间进行多次拷贝。零拷贝技术通过避免这些额外的拷贝操作,提高数据传输速度和效率,同时减少 CPU 的负担。

    零拷贝技术的实现方法有很多,例如 sendfile() 系统调用、splice() 系统调用等。这些方法可以将数据直接从内核空间传输到内核空间,或者从内核空间传输到用户空间,而无需在用户空间进行额外的拷贝。

  2. 内存映射(Memory Mapped,MMAP):

    内存映射是一种将磁盘上的文件映射到内存中的技术。通过内存映射,文件的内容可以直接映射到进程的虚拟地址空间,使得进程可以像访问内存一样访问文件。内存映射提高了文件读写的性能,同时简化了文件操作的编程模型。

    内存映射的实现依赖于操作系统的虚拟内存管理和页面缓存机制。当进程访问映射的文件内容时,操作系统会将文件的内容加载到页面缓存中。进程对映射的内存进行读写操作时,操作系统会自动处理页面缓存的同步和更新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值