RocketMQStream学习

架构

RocketMQStreams架构

  • 采用 shared-nothing 的分布式架构设计,依赖消息队列做负载均衡和容错机制,单实例可启动,增加实例实现能力扩展,并发能力取决于分片数;
    其实就是stateless
  • 利用消息队列的分片做 shuffle,利用消息队列负载均衡实现容错
  • 利用存储实现状态备份,实现 Exactly-ONCE 的语义。用结构化远程存储实现快速启动,不等本地存储恢复;
  • 重力打造过滤优化器,通过前置指纹过滤,同源规则自动归并,hyperscan 加速,表达式指纹提高过滤性能

RocketMQ Streams消费一条消息的过程

github - rocketmq-streams

ISource消费数据源

触发条件:

分类:

  • RocketMQSource读取来自RocketMQ的消息

流程(RocketMQSource):

1.

IStreamOperator算子处理来自Source的数据

触发条件:

  • AbstractSource处理消息AbstractSource#executeMessage

ISink存储数据

触发条件:

  • SinkAction算子触发

流程(SinkAction):

  1. 默认写到cache IMessageCache#addCache
    触发时机:接收消息时 SinkAction#doMessage
  2. 启动自动flush ISink#openAutoFlush
    触发时机:刷新配置后的处理 SinkAction#doProcessAfterRefreshConfigurable
    触发逻辑:把队列排空,并写入到存储中 MessageCache#flush()
    触发间隔:100ms ScheduleManager#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

Exactly-ONCE 语义

shuffle