RocketMQ核心架构设计思想

RocketMQ中NettyRemotingServer的Reactor多线程模型

图1
图1
1、
一个 Reactor 主线程(eventLoopGroupBoss)
负责监听 TCP网络连接请求
建立好连接
创建SocketChannel
并注册到selector上

2、拿到网络数据后
再丢给Worker线程池(eventLoopGroupSelector)

3、在真正执行业务逻辑之前先需要defaultEventExecutorGroup进行
SSL验证、编解码、空闲检查、网络连接管理

4、根据 RomotingCommand 的业务请求码code去processorTable
这个本地缓存变量中找到对应的 processor
然后封装成task任务后
提交给对应的业务processor处理线程池来执行

消息过滤

图2
图2
1、
Consumer端订阅消息
是需要通过ConsumeQueue这个消息消费的逻辑队列拿到一个索引
然后再从CommitLog里面读取真正的消息实体内容

2、ConsumeQueue的存储结构
有8个字节存储的Message Tag的哈希值
基于Tag的消息过滤正式基于这个字段值的
  • Tag过滤方式
图3
图3
1、
一个消息有多个TAG
Consumer端在订阅消息时可以指定Topic或指定TAG
2、
发送一个Pull消息的请求给Broker端
3、
Broker端从RocketMQ的文件存储层—Store读取数据之前
a、
会用这些数据先构建一个MessageFilter
然后传给Store
b、
Store从 ConsumeQueue读取到一条记录后
会用它记录的消息tag hash值去做过滤
c、
由于在服务端只是根据hashcode进行判断
无法精确对tag原始字符串进行过滤
故在消息消费端拉取到消息后
还需要对消息的原始tag字符串进行比对
如果不同,则丢弃该消息,不进行消息消费
  • SQL92的过滤方式
图4
图4
和上面的Tag过滤方式区别只是在Store层的具体过滤过程不太一样
Store层通过SQL表达式检索ConsumeQueue索引
因会影响效率
所以在检索之前通过布隆过滤器避免每次都通过SQL表达式检索

负载均衡

Producer负载均衡

图5
图5
1、
Producer端在发送消息的时候
会先根据Topic找到指定的TopicPublishInfo
2、
在获取了TopicPublishInfo路由信息后
RocketMQ的客户端在默认方式下selectOneMessageQueue()方法
会从TopicPublishInfo中的messageQueueList中
3、
选择一个队列(MessageQueue)进行发送消息
具体的容错策略
图6
图6

何为不可用

就是按之前失败的
按一定的时间做退避
如果上次请求的延迟超过550Lms
就退避3000Lms
在这期间该broker代理不可用

Consumer负载均衡

图7
图7
消息拉取线程在从服务器拉取到一批消息后
然后提交到消息消费线程池后
又马不停蹄的继续向服务器再次尝试拉取消息

一个消费者可以同时消费一个topic下的不同队列

图8
图8

不同的消费者不可以消费同一个队列

图9
图9

不同的消费者组可以消费同一个队列

图10
图10

同消费者组下的消费者,不可以同时消费不同Topic下的消息

图11
图11
  • Consumer端的心跳包发送
图12
图12
1、
在Consumer启动后
它就会通过定时任务不断地向RocketMQ集群中的
所有Broker实例发送心跳包
(包含:消息消费分组名称、订阅关系集合、消息通信模式和客户端id的值等信息)
2、
Broker端在收到Consumer的心跳消息后
会将它维护在ConsumerManager的本地缓存变量—consumerTable
同时并将封装后的客户端网络通道信息保存在本地缓存变量—channelInfoTable中
为之后做Consumer端的负载均衡提供可以依据的元数据信息
  • Consumer端实现负载均衡的核心类—RebalanceImpl
图13
图13
在消费者启动的时候完成负载均衡逻辑

集群模式处理流程

同一个主题下的消费队列和消费者分配

1、先对消费队列和消费者排序
2、消费者类似于页数、消费队列类似于所有记录数
一个消费者所消费的消费队列 类似第5页包含的记录数
3、消息队列分配策略算法(默认为:消息队列的平均分配算法)
  • 过滤分配到的消息的队列集合
将分配到的消息队列集合与现有的集合做对比
过滤掉失效的
  • 红色
表示与分配到的消息队列集合互不包含

剔除无效数据

  • 绿色
表示与分配到的消息队列集合的交集

处理过期数据

  • 白色
表示新增的待消费的队列

处理新增数据

向broker拉取消息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值