RocketMQStream学习
架构
- 采用 shared-nothing 的分布式架构设计,依赖消息队列做负载均衡和容错机制,单实例可启动,增加实例实现能力扩展,并发能力取决于分片数;
其实就是stateless - 利用消息队列的分片做 shuffle,利用消息队列负载均衡实现容错;
- 利用存储实现状态备份,实现 Exactly-ONCE 的语义。用结构化远程存储实现快速启动,不等本地存储恢复;
- 重力打造过滤优化器,通过前置指纹过滤,同源规则自动归并,hyperscan 加速,表达式指纹提高过滤性能
RocketMQ Streams消费一条消息的过程
ISource
消费数据源
触发条件:
分类:
RocketMQSource
读取来自RocketMQ的消息
流程(RocketMQSource
):
1.
IStreamOperator
算子处理来自Source的数据
触发条件:
AbstractSource
处理消息AbstractSource#executeMessage
ISink
存储数据
触发条件:
SinkAction
算子触发
流程(SinkAction
):
- 默认写到cache
IMessageCache#addCache
触发时机:接收消息时SinkAction#doMessage
- 启动自动flush
ISink#openAutoFlush
触发时机:刷新配置后的处理SinkAction#doProcessAfterRefreshConfigurable
触发逻辑:把队列排空,并写入到存储中MessageCache#flush()
触发间隔:100msScheduleManager#start
shared-nothing
shared-nothing体现在RocketMQ的以下属性:
- 消息的存储采用Topic+Queue的模式;
- Consumer端消费采取pull模式而不是push;
- Consumer端负载均衡Rebalance,同时Rebalance也可以实现容错;
RocketMQ 消息的存储和查询原理
RocketMQ 如何发送一条消息
负载均衡
RocketMQ Streams在启动时会对上游的ISource拆分分片,AbstractPullSource#startSource
- 获取所有分片
IPullSource#fetchAllSplits
- 拆分分片
ISourceBalance#doBalance
- 定时监听分片的变更
AbstractPullSource#doSplitChanged