数据一致性分发

为什么要数据分发

微服务中,每个服务都有独立的数据源,这使得数据同步成为难题。

拉模式or推模式?

拉模式存在的问题

  1. 由于网络延迟,拉取的数据不一定是最新的

  2. 如果频繁向另一服务拉取数据,会给服务造成压力,如果拉取频率过低,数据就会同步不及时。

推模式存在的问题

如何保证数据的一致性?或者说如何保证数据分发的事务性?

数据一致性分发

事务消息盒子(事务性发件箱)

本质是利用本地事务的事务性,保证了消息分发的最终一致性。

  1. 在数据库中新开一张发件表(OUTBOX table),用于存放要分发的数据相关信息。

  2. 在往本地表和发件表一起写数据的时候,开启本地事务,如果成功则一起提交,出错则一起回滚。

  3. 实现消息中继器(MessageRelay),定期拉取OUTBOX table中的数据,并发送到对应服务。

  4. 如果成功,则数据分发成功,否则记录重试次数(实现至少发送一次的功能,接收数据的服务可能需要做幂等处理),若重试次数达到阈值,分发失败,需人工干预。

Killbill Common Queue

是对事务性发件箱的开源实现。

上图中灰色框框起来的部分,就是组件对事务性发件箱的核心实现:

  • 事件分发线程(DispatcherThread)会从数据队列(DBQueue)中拿一个事件(Event),并将这个事件写入到事件表中,后续这个事件扔给事件总线(EventBus)处理。

  • 同一节点的事件总线(EventBus)拿到事件分发线程分发的事件,EventBus再将事件分发到对应的Handler,由Handler处理事件。

  • 如果事件处理成功,则标记成功,失败则记录失败次数,累计到阈值标记失败,由人工干预处理

  • 每一个节点事件分发线程都只负责自己节点分发的事件

reaper机制

事件分发线程有多个,假如在运行过程中有事件分发线程挂了,那这个线程中的事件怎么处理呢?

Killbill Common Queue引入了reaper机制:reaper会监控是否有已经写入数据库表但长时间未处理的事件,如果发现了,就讲这个事件收割,后续这个事件将由自己处理。

收割机机制,保证了killbill common queue的高可用性,相当于保证了事务性发件箱中的Message Relay的高可用性。

EventBus(PersistentBus)

EventBus实现了事件性发件箱的MessageRelay功能。

此外,EventBus的机制为事件机制,一开始会在EventBus中注册handler,handler绑定需要处理的事件,当EventBus中收到event时,就会发送给绑定该事件的handler处理。

async-event

是公司的一个组件,使用了hyperf的事件机制,实现了事务性发件箱的功能。

以下为核心功能dispatch实现:

在45-48行中,方法遍历了所有监听器(listener),把监听器名、事件名、事件中的数据存到发件表中。

在try中,调用listener去处理事件,如果处理成功则将发件表中的事件状态标记为完成。

在catch中,如果处理事件出错,就会记录重试次数。

async-event中存在一个定时任务,每十分钟拉取未处理成功的待处理的事件,然后丢给retry方法重试:

retry方法就是将事件进行重试,先反序列化事件,在将事件丢给对应的监听器处理,如果处理完成就标记完成,否则记录重试次数,如果重试次数达到阈值,则标记失败。

CDC-变更数据捕获( Change Data Capture, CDC )

每个数据库在变更数据是都有事务日志或提交日志。启动可以一个服务(Transaction log miner),用来订阅这个日志,当捕获到数据变更时,就将数据变更内容发送给mq(如果异常会重发至成功)。

变更数据捕获常用作于:

  • 数据迁移:常用于数据库备份、容灾等;

  • 数据分发:将一个数据源分发给多个下游,常用于业务解耦、微服务;

  • 数据采集:将分散异构的数据源集成到数据仓库中,消除数据孤岛,便于后续的分析。

相应开源项目:

  • 阿里 Canal:GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件

  • Redhat Debezium:GitHub - debezium/debezium: Change data capture for a variety of databases. Please log issues at https://issues.redhat.com/browse/DBZ.

  • Zendesk Maxwell:GitHub - zendesk/maxwell: Maxwell's daemon, a mysql-to-json kafka producer

  • Airnb SpinalTap:GitHub - airbnb/SpinalTap: Change Data Capture (CDC) service

  • FIink -CDC

内部组件实现:https://git.kkgroup.cn/brd/data-transfer-service

下面是cannal的工作原理

MySQL主备复制原理
  • MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)

  • MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)

  • MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据

canal 工作原理
  • canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议

  • MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )

  • canal 解析 binary log 对象(原始为 byte 流)

CQRS-命令查询职责分离

一种设计模式,看了很多资料感觉有点高深了,简单来说就是:

  • 命令:CUD,会改变数据的操作

  • 查询:R,不会改变数据

CQRS将命令和查询划分为两个不同的对象,CQRS使用分离的接口将数据查询操作(Queries)和数据修改操作(Commands)分离开来,这也意味着在查询和更新过程中使用的数据模型也是不一样的。这样读和写逻辑就隔离开来了。

mysql的读写分离是在数据库层进行的,而CQRS也可以理解成一种读写分离,但是读写分离操作是在应用层进行的。

内部实现(es同步组件): https://git.kkgroup.cn/brd/elasticsearch-service

在写数据库时,将数据聚合并同步到es中,在查询聚合数据时到es查询。

要思考的问题

  1. 分发过程中要确保一定发送,如果发送失败就会重试。但由于网络抖动等原因,无法判断是否发送成功,会导致消息可能会发送多次。

  2. 由于会存在消息发送多次的情况,消费端就要做好消息去重或幂等机制

  3. 需要考虑是否有顺序性问题。比如两条消息的消费需要具备顺序性,或使用其他方式规避竟态并发带来的困扰。(没遇到过具体情况)

  4. 业务使用时需要理解最终一致性的最终俩个字,设计上需要容忍获取到中间态的数据。(没遇到过具体情况)

参考资料

简书:KillBill框架介绍

CSDN:如何解决微服务的数据一致性分发问题?

博客园:命令查询职责分离模式CQRS 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/103327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python报“IndentationError: unexpected indent”问题解决

问题: IndentationError: unexpected indent 原因: 缩进错误:意外缩进 Python是一种对缩进非常敏感的语言,没有分号和大括号作为语句分割和层级标识,只能对代码格式进行严格规范,最常见的情况是tab和空格…

保护敏感数据的艺术:数据安全指南

多年来,工程和技术迅速转型,生成和处理了大量需要保护的数据,因为网络攻击和违规的风险很高。为了保护企业数据,组织必须采取主动的数据安全方法,了解保护数据的最佳实践,并使用必要的工具和平台来实现数据…

大模型时代的开发者:从飞桨PPDE到文心布道师

飞桨开发者技术专家(PPDE)谢杰航研究方向为AI城市规划、景观设计、生态环境及农业等领域的应用落地。他在此前Wave Summit 2023深度学习开发者大会上为大家带来了主题为《大模型时代的开发者:从飞桨PPDE到文心布道师》的演讲。本次演讲共分为…

解决MySQL错误-this is incompatible with sql_mode=only_full_group_by

报错 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘数据库名.表名.字段名’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by 原因 MySQL错误-t…

Java架构师缓存性能优化

目录 1 缓存的负载策略2 缓存的序列化问题3 缓存命中率低4 缓存对数据库高并发访问5 缓存数据刷新的策略5.1. 实时策略5.2. 异步策略5.3. 定时策略6 何时写缓存7 批量数据来更新缓存8 缓存数据过期的策略9 缓存数据如何恢复10 缓存数据如何迁移11 缓存冷启动和缓存预热1 缓存的…

全新整合热搜榜单热门榜单内容系统聚合源码/带教程安装

源码简介: 在移动互联网时代,我们每天都会接收到大量的信息,但是想要知道哪些是最热门的话题和内容,往往需要花费很多精力去搜索和筛选。因为有这个需要,一个全新整合热搜榜单热门榜单内容系统聚合源码就应运而生了&a…

ORACLE逻辑存储结构

存储结构 1数据文件 数据库存储逻辑结构是表空间-段-区段-块,数据库文件包括控制文件,联机重做日志,数据文件等。我们主要讲数据文件 1.1表空间 我们在搭建环境的第6节,创建了表空间apps_data_tablespace,创建语法中包含了数据库文件APPS_DATA_TABLESPACE.dbf,所有在…

PMP证书有什么用?考试条件是什么?

PMP证书摆在明面上的一个用处就是在招聘项目经理岗或者PMO岗的岗位要求中都会有一条:持有PMP证书优先。面试的时候,如果两个候选人的经历、经验、期望薪资都差不多,那么HR就会更倾向于有PMP/ACP等证书的候选人。 PMP是什么? PMP是…

LabVIEW将视觉生成器AI用作OPC服务器

LabVIEW将视觉生成器AI用作OPC服务器 介绍如何将视觉生成器AI配置为OPC服务器,并使用共享变量共享视觉生成器AI生成的结果。OPC是一系列标准规范,定义了来自不同制造商的控制设备之间的实时数据通信。OPC数据访问通信是基于客户端服务器的通信。 共享系…

whistle安卓手机抓包(图文详解)

1、安装node https://nodejs.org (官网下载对应的node,一般推荐长期稳定版本 LTS) 需要node的版本是大于 v0.10.0 查看自己本地node 版本号 node -v2、安装whistle npm i -g whistle3、开启whistle 补充说明: ● w2 stop:关闭…

XML是不是主要用做配置文件?

2023年10月11日,周三下午 这几天发现tomcat的配置文件主要是用XML文件来写的, 于是就有了这个问题。 是的,XML非常适合用来做配置文件。 XML作为配置文件的主要优点: 可读性强。XML使用标签结构组织数据,内容清晰易懂。跨语言和跨平台。XML作为纯文本…

Servlet的部署与安全

1 Servlet 部署 Servlet规范关于各个东西该放在哪里有许多严格的规则。 1.1 WAR war文件代表Web归档(Web Archive),war实际就是一个JAR,只不过扩展名是.war而不是.jar。 其采用了一种可移植的压缩形式,把整个Web应用结构(去掉…

相似与不同:数字孪生和元宇宙的对比

数字孪生和元宇宙是两个备受瞩目的概念,都在数字领域产生了巨大的影响。它们有一些相似之处,但也存在显著的不同。本文将介绍它们的相同点和不同点,以及它们在不同应用领域的前景。 1. 相同点 虚拟性质: 数字孪生和元宇宙都是虚…

PostgreSQL基操之角色、表空间、数据库与表

PostgreSQL基操之角色、表空间、数据库与表 角色创建与管理表空间创建与管理数据库创建与管理表创建与管理 角色创建与管理 PostgreSQL数据库里没有User的概念,只有Role的概念。有的Role可以用于登录数据库,这些Role与其他数据库中的用户等价。 --创建…

星戈瑞Annexin V-FITC细胞凋亡检测试剂盒

Annexin V-FITC 试剂盒提供检测凋亡细胞所需的所有试剂。Annexin V 是 Ca2 依赖性磷脂结合蛋白。该蛋白质可以与多种磷脂结合,但它对磷脂酰丝氨酸 (PS) 的亲和力最高。Annexin V-FITC 试剂盒能够以 Ca2 依赖性的方式结合至带负电荷的磷脂表面结合。它还可防止凝血酶…

你的工作中,chatGPT可以帮你做什么?

如何在工作中使用 ChatGPT 的 10 种实用方法 现在您已经知道如何开始使用 ChatGPT 并了解其基本功能(提示 -> 响应),让我们探讨如何使用它来大幅提高工作效率。 1. 总结报告、会议记录等 ChatGPT可以快速分析大文本并识别关键点。例如&a…

Linux引导故障排除:从问题到解决方案的详细指南

1 BIOS初始化 通电->对硬件检测->初始化硬件时钟 2 磁盘引导及其修复 2.1 磁盘引导故障 磁盘主引导记录(MBR)是在0磁道1扇区位置,446字节。 MBR作用:记录grub2引导文件的位置 2.2 修复 步骤:1、光盘进…

css 超出滑动使用 CSS 实现超出滑动

CSS 超出滑动是指当内容超出容器的范围时,可以使用滑动条来查看所有内容。下面是一个示例代码:上面的代码中,我们将容器的宽度和高度设置为 300px 和 200px,并将 设置为 auto,这样当内容超出容器的范围时,就…

uboot 来源与选择

一. uboot 简介 之前有文章对 uboot 进行了简单的说明。 Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段 bootloader 程序。这段 bootloader 程序会先初始化 DDR 等外设,然后将 Linux 内核从 flash(NAND , …

lvgl overview

https://docs.lvgl.io/master/get-started/quick-overview.html 图像元素 屏幕上的图像元素以单根对象树管理,默认情况下根对象就是显示器的活动显示器——act_scr,在显示器注册时创建,参见lv_disp_drv_register。 应用也可以自己创建screen的根对象&…