rocketmq-各模块-实现原理(简化的实现思想构建高效的系统)

RocketMQ设计理念追求简单和速度,NameServer采用极简设计,不保证消息只被消费一次。文章详细介绍了NameServer、消息发送、存储、消费、过滤、主从机制和事务实现。消息存储利用内存映射技术,关键数据结构包括commitlog、ConsumeQueue和IndexFile。消息发送支持同步、异步和oneway,提供延时消息功能。消息过滤支持tag、SQL92和class过滤。主从机制确保高可用,事务机制通过2阶段提交实现。
摘要由CSDN通过智能技术生成

设计理念

  • 追求简单和速度
  1. NameServer简化,减少复杂度,提高速度;
  2. 高效的io存储,
  3. 简化系统,不保证消息只被消费一次,需要消费者自己做幂等;

核心模块

NameServer

NameServer采用了极简设计,节点之间不进行数据同步,因为即使NameServer不是强一致性,客户端也会通过重试避免故障。
整体工作流程如下:

  1. broker向所有NameServer注册路由元数据,每30秒更新一次
  2. NameServer每10秒发送一次心跳检测,如果超过120秒未收到反馈则移除该broker相关元数据
  3. NameServer收到broker发送的更新元数据,进行路由元数据和时间戳更新

消息发送

发送方式:同步、异步、oneway,其中oneway发送出去就返回,不能设置回调函数

整体流程
  1. 生产者创建并与MQClientInstance关联,后者负责同server之间的网络通信
  2. 从NameServer更新topic路由信息,并且每30秒定时刷新
  3. 如果没有该topic会请求默认topic的路由信息,在发送消息给broker的时候,broker会初始化该topic
  4. 发送前会检查消息体大小不能超过4M
  5. 选择可写的消息队列进行发送,同步消息发送失败可以进行重试,发送失败会更新broker的不可用延时,从而选择可用的broker进行发送,增加发送成功率
  6. 非oneway消息发送支持回调处理
  7. 支持批量消息发送
延时消息发送
  1. rocketmq只支持不同等级的延迟消息,不能支持精度的延时消息
  2. 生产者发送消息的delay-level>0,broker会更改主题为schedual_topic_xxx
  3. 然后根据延时等级,存入对应的ConsumeQueue
  4. 通过异步定时线程将消息全部取出,恢复消息的原主题,重新写入commitlog
  5. 实现粗略定时发送的目的

消息存储

整体工作流程如下:

  1. 存储消息的入口DefaultMessageStore::putMessage
  2. 校验:如果broker不支持写入,或者消息主题长度超过256个字符、属性长度超过65526个字符则拒绝写入
  3. 如果是延迟消息则更新消息的主题为延迟消息主题和队列为对应的延迟等级
  4. 获取当前可写入的commitlog,名称为当前偏移量,大小为1G
  5. 申请putMessageLock,串行化
  6. 如果第一次写入,则以偏移量0创建文件
  7. 写入MappedFile
  8. 生成消息id:4字节ip、4字节端口、8字节消息偏移量
  9. 获取消息的队列偏移量
  10. 计算消息的字节长度
  11. 如果消息+空闲字节数>commitlog空闲空间,则新建commitlog文件存储
  12. 更新消息逻辑队列的偏移量
  13. 释放putMessage锁
  14. 根据同步异步策略进行刷盘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值