实时数据订阅与分发系统概述

简介: 实时数据订阅与分发系统概述

1. 简介


Databus 是一个实时的低延迟数据抓取系统, 它抓取业务数据源的实时变更, 并发送到中继(Databus Relay), 下游业务从中继获得变更数据进行业务处理:


86.jpg


根据Linkdin的介绍, Databus有以下特性:


  • 来源独立:Databus支持多种数据来源的变更抓取,包括Oracle和MySQL。
  • 可扩展、高可用:Databus能扩展到支持数千消费者和事务数据来源,同时保持高度可用性。
  • 事务按序提交:Databus能保持来源数据库中的事务完整性,并按照事务分组和来源的提交顺序交付变更事件。
  • 低延迟:数据源变更完成后,Databus能在微秒级内将事务提交给消费者。
  • 无限回溯:Databus对消费者支持无限回溯能力。当消费者需要产生数据的完整拷贝时(比如新的搜索索引), 直接进行一次全量回溯即可。


2. 系统设计


Databus的结构与工作流如下图:

87.jpg


  • 通过CDC订阅数据库变更
  • 将变更消息放入Relay的缓存队列
  • 各个client对队列中的消息进行消费


我们可以看到,核心组件为五个部分:


1)DatabusEventProducer


负责实时数据抓取CDC, 针对MySQL数据源, 开源方案提供了基于OpenReplicator(一个Binlog解析框架)的方案。


2)SchemaRegistry


注册DatabusEvent对应的Schema, 所有DatabusEvent需要按Schema进行序列化, 并在消息中保持Schema信息。


3)DatabusRelay


基于Netty实现的一个Server, 内部维护高性能的缓存消息队列RingBuffer,作为订阅消息的内存消息中间件,保证了消息的有序性。


4)BootstrapService


BootStrapService是特殊的DatabusClient, 它将来自DatabusRelay中的所有数据写入MySQL, 当客户端需要无限回溯时, 便请求BootstrapService拉取历史数据。


有很多系统是将消息直接投递到kafka或者rocketMQ,就能同时实现了DatabusRelays和BootstrapService的功能。


5)ClientLib:


ClientLib就是消费客户端Client,用来实时接收变更消息。其中封装了一些数据抓取细节, 比如当回溯的SCN(System Change Number)在中继上不存在时自动请求BootstrapService, 回溯完成后切回中继。


3. 核心模块浅析


DatabusRelay


DatabusRelay模块可类比为基于内存实现的消息队列, 下面是DatabusRelay的结构图:

88.jpg

我们可以看到,DatabusRelay运行于Netty容器中。

同时,它会启动一系列EventProducer, 从数据源或其他Relays拉取实时增量数据并写入EventBuffers。


EventBuffers由多RingBuffer组成, RingBuffer通过mmap进行写盘持久化。这种设计下,使得EventProducer与DatabusRelay在同一个Netty容器中, 避免了rpc调用,效率更高。


所有的增量数据, 都有一个System Change Number(SCN), 这个SCN由EventProducer产生, 保证全局递增, DatabusRelay需要记录每个RingBuffer目前的MaxSCN(类似Kafka的offset), 并使用MaxSCN Reader/Writer进行持久化。持久化方式是本地文件存储。


DatabusClient


DatabusClient用于消费来自DatabusRelay的数据, 它作为一个lib提供给需要接入的服务。下面是官方给出的DatabusClient架构图:

89.jpg


客户端代码以回调形式注册到DatabusClient上, 并声明自己关心的资源。


启动后, Client通过读取当前checkpoint, 假如checkpoint在Relay中不存在, 那么启动Relay Puller 和 Bootstrap Puller分别从Relay和Bootstrap Service拉取数据, 并写入本地EventBuffer, Dispatcher不断poll EventBuffer中的数据, 分发到Callback Driver上, 并通知Checkpoint Persistence Provider记录当前读取的checkpoint(即SCN)。


这样就能实现对订阅消息的全量回溯, 向客户端代码屏蔽Relay与Boostrap Service的差异。


4. 扩展性


在上面的DataBus Relay的架构图可以看到

90.png


Event Producer除了可以订阅数据源之外,还能订阅其他Relays,可以通过Relay Chaining进行扩展。在Follower Relay中使用RelayEventProducer, 从Master Relay拉取数据, 这两个Relay就组成了Master和Follower的链式结构。当然,这种设计会使得变更数据在多个Relay中冗余,有些浪费空间。

目录
相关文章
|
存储 编解码 安全
现代IM系统中聊天消息的同步和存储方案探讨
本文原作者:木洛,阿里云高级技术专家,内容有删减和修订,感谢原作者。 1、前言 IM全称是『Instant Messaging』,中文名是即时通讯。在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉、微信、QQ等以IM为核心功能的产品。
5136 0
|
3月前
|
程序员 数据库 UED
微信也在用的消息时序性技术,你知道多少?
本文由程序员小米撰写,探讨了在个人项目中如何保证消息的时序性。文章详细介绍了消息时序性的概念及其重要性,并提出了三种方案:ID设计(借鉴微信号段与跳跃式生成)、单聊场景下的单点序列化同步,以及群聊场景中的单点序列化处理。此外,还提供了多种优化方法,如消息时序对齐、本地时序记录等,帮助读者更好地解决消息乱序问题。适合所有关心即时通讯和社交应用技术细节的开发者阅读。
60 4
|
4月前
|
消息中间件 分布式计算 Kafka
联通实时计算平台问题之实时计算平台对于用户订阅和数据下发是如何支持的
联通实时计算平台问题之实时计算平台对于用户订阅和数据下发是如何支持的
|
4月前
|
消息中间件 负载均衡 Kafka
MQ消息路由大揭秘!从菜鸟到高手,一文带你玩转消息传递的‘高速公路’,轻松实现订单秒级响应!
【8月更文挑战第24天】在现代分布式系统中,消息队列(MQ)作为系统间解耦的核心工具,支持异步处理、负载均衡及高可用性。消息路由是MQ中的关键环节,决定消息从生产者到消费者的路径。主流MQ产品如RabbitMQ、Kafka等采用相似的路由机制,涉及交换器、队列、路由键等概念。常见的路由模式包括直接交换、主题交换及发布/订阅模式。以RabbitMQ为例,通过直接交换模式,可以根据订单类型(如“普通订单”、“紧急订单”)将消息路由至相应的处理队列。这一过程展示了MQ系统如何基于路由键和队列绑定关系实现消息的有效传递。
94 2
|
7月前
|
存储 消息中间件 小程序
从数据同步到异步通知:用户分群功能全揭秘
小米分享了开发用户分群功能的经验。面对数据同步问题,他们选择新建用户分群服务而非多数据源配置,以遵循微服务原则。为解决大规模通知发送导致的卡死,采用了异步处理,包括任务创建、数据查询和通知发送。在用户标签查询方面,通过精确存储和查询方法解决了标签重叠的误差。总结经验:合理拆分微服务,利用异步处理提升性能,确保精确查询。关注“软件求生”获取更多内容。
86 3
|
存储 JavaScript 前端开发
TDengine极简实战:从采集到入库,从前端到后端,体验物联网设备数据流转
TDengine极简实战:从采集到入库,从前端到后端,体验物联网设备数据流转
1335 1
【鸿蒙】订阅分布式数据变化
客户端需要实现KvStoreObserver接口。 构造并注册KvStoreObserver实例。
【鸿蒙】订阅分布式数据变化
|
消息中间件 存储 RocketMQ
消息达到后实时推送机制|学习笔记
快速学习消息达到后实时推送机制
消息达到后实时推送机制|学习笔记
|
监控 Java API
与实时消费对接 | 学习笔记
快速学习与实时消费对接
消息转发流程分析
1. 先来看下动态方法决议的分析;2. 通过instrumentObjcMessageSends来辅助分析;3. 有关反汇编;
196 0
消息转发流程分析