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

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

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中冗余,有些浪费空间。

目录
相关文章
|
13天前
|
消息中间件 SQL API
TDengine 数据订阅 vs. InfluxDB 数据订阅:谁更胜一筹?
在时序数据的应用场景中,数据的实时消费和处理能力成为衡量数据库性能和可用性的重要指标。TDengine 和 InfluxDB 作为时序数据库(Time Series Database)中的佼佼者,在数据订阅方面各有特点。但从架构设计、灵活性和系统负载上看,TDengine 提供了更加全面且高效的解决方案。
27 2
|
存储 编解码 安全
现代IM系统中聊天消息的同步和存储方案探讨
本文原作者:木洛,阿里云高级技术专家,内容有删减和修订,感谢原作者。 1、前言 IM全称是『Instant Messaging』,中文名是即时通讯。在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉、微信、QQ等以IM为核心功能的产品。
5109 0
|
3月前
|
消息中间件 分布式计算 Kafka
联通实时计算平台问题之实时计算平台对于用户订阅和数据下发是如何支持的
联通实时计算平台问题之实时计算平台对于用户订阅和数据下发是如何支持的
|
消息中间件 存储 负载均衡
对于钉钉OA事件订阅出现的网络波动导致的通知丢失问题
对于钉钉OA事件订阅出现的网络波动导致的通知丢失问题
134 1
|
消息中间件 存储 SQL
关于 TDengine 3.0 数据订阅,你需要知道这些
TDengine 3.0 对数据订阅功能又进行了优化升级,本文将详细介绍其语法规则,方便开发者及企业使用。
332 0
|
JSON 安全 API
通过 slack 快速构建实时日志
通过 slack 快速构建实时日志
224 0
【鸿蒙】订阅分布式数据变化
客户端需要实现KvStoreObserver接口。 构造并注册KvStoreObserver实例。
【鸿蒙】订阅分布式数据变化
|
消息中间件 存储 RocketMQ
消息达到后实时推送机制|学习笔记
快速学习消息达到后实时推送机制
消息达到后实时推送机制|学习笔记
|
网络协议 测试技术 Go
海量用户通讯系统-收发消息分析|学习笔记
快速学习海量用户通讯系统-收发消息分析
海量用户通讯系统-收发消息分析|学习笔记
下一篇
无影云桌面