如何实现数据的正确拆分?

news2024/11/18 7:27:52

我们知道在传统的单块架构中,一个系统中只存在一个独立的服务和数据库实例。


上图中的系统架构实现起来比较简单,但是扩展性和伸缩性都比较差。因此,越来越多的系统开始采用了微服务架构。在微服务架构中,一个系统被拆分成多个服务,而每个服务都拥有属于自身的数据库。


从单块系统到微服务系统的转变过程需要根据领域对系统进行合理的拆分,同时也要求数据层面从集中式的管理转变为分散式的管理。这就引申出今天我们要讨论的主题,即数据拆分。

数据拆分场景和解决方案

设想我们现在拥有一个运行了一段时间的数据库实例,内部包含了多个数据库。那么我们可以想象通常都会存在跨表查询和跨库查询场景。同时,如何我们使用了存储过程等特定的数据库实现技术,那么想要实现对数据的拆分操作也会变得不那么容易。这些场景构成了我们实现数据拆分的主要场景。


接下来,我们将分别对上述场景进行分析,看看分别应该采用哪种解决方案。

跨表查询场景

在日常开发过程中,跨表查询是非常常见的一种实现技术。在同一个数据库中,开发人员可以通过主外键之间的关联关系完成多个表之间的连接操作。

下图展示了一种表连接的表现形式,图中的连接1所涉及到的表1和表2都属于同一个业务模块。对于这个连接,我们不需要进行数据去中心化,因为位于单个业务模块内部的数据连接查询不会影响到其他模块,符合微服务架构下服务拆分的基本原则。


我们再来看另一种连接情况。


可以看到连接2和连接1不同,该连接所涉及的表3和表4则位于两个不同的业务模块中。显然,当我们基于业务模块拆分微服务时,这种连接就不应该再存在。

针对跨多个业务模块的跨表查询应用场景,我们想要去掉表与表之间的连接也比较简单,因为表连接的本质就是把位于不同表中的数据进行组装,我们可以把这个组装过程放到内存中。也就是说,我们先分别从数据表中获取目标数据,然后通用代码在内存中完成数据的动态组装,然后在返回给客户端,整个过程如下图所示。


基于跨表查询场景下的分析,也可以得出一条在日常开发过程中的最佳实践,即我们应该尽量避免不同模块之间的数据产生数据表级别的关联,而是应该通过代码来管理和维护这层关系。

跨库查询场景

讨论完跨表查询,接下来我们讨论跨库查询场景。从系统设计角度而言,跨库查询是应该被明确禁止的,因此这种场景相对比较少。但如果一旦出现这种场景,那么所带来的问题也就更为严重。下图展示了跨库查询的具体场景。


一旦涉及到跨库查询,我们的基本思路就是对查询语句进行改造,通过接口查询的方式来替换跨库的查询连接。


现在,如果想要获取数据表1和表2中的数据,那么唯一的操作方法就是暴露API接口,应用程序通过接口获取数据之后再在内存中进行数据的组装,并开放给客户端进行访问。请注意,上图中所示的跨库查询和跨表查询方案的本质区别在于:位于不同数据库中的数据必须确保严格的边界,而通过接口的方式来获取数据可以做到这一点。这样,基于不同数据的不同接口可以面向各自的应用程序,这也为微服务的拆分奠定了基础。

关于跨库查询,还有一种特殊的应用场景。有时候,位于不同数据库中的数据虽然有一定的关联关系,但这种关联关系并不像连接查询那样需要实时失效,而是允许一定的时延性。这时候,通过接口的方法实时暴露数据就不是很有必要,我们可以采用数据定时同步的方式来完成跨库的数据同步。


可以看到,在这种应用场景下,数据库A和B中同时保存着表1和表2的数据,我们通过定时任务确保这两张表的数据是一致的。通过这种方式,原本需要跨库才能完成的查询,就转变成了单库内的数据查询,跨库查询就降级成了跨表查询。

技术耦合场景

当我们面对遗留系统时,一大挑战在于对一些数据库内置技术组件的改造,这些技术组件包括存储过程、触发器、函数等。由于技术体系的不断演进,我们已经不推荐把业务逻辑通过这些数据库内置技术组件进行实现,但在遗留系统改造过程中则非常常见。对于这些位于数据库内部的数据处理逻辑,开发人员唯一要做的就是把他们全部用业务代码的形式全部实现一遍即可。


数据拆分流程

理解了数据拆分的主要场景和对应的解决方案,我们接下来讨论如何实施这些解决方案。请注意,无论是实施对跨表查询、跨库查询还是遗留系统的改造,我们都需要确保线上业务的稳定性,而不是直接采用一刀切的方式进行直接替换。在今天的内容中,我们基于主流的微服务架构,以单个数据库拆分的场景为例来开展讨论。数据拆分前和拆分后的对比效果如下图所示。


可以看到,我们需要根据业务边界把单块系统拆分成多个微服务,然后基于服务边界进一步对数据库中的表进行拆分。最后,原本属于表之间的关联关系就变成了服务之间的接口对接关系。

在今天的内容中,我们把数据拆分的过程分成三个主要的步骤。

边界分离

要想拆分数据,首先需要拆分业务。根据业务模块的不同职责和内容,我们可以把单块系统中的代码拆分成不同的服务。


可以看到,我们从物理上拆分了服务A和服务B这两个微服务。其中服务A和服务B分别独享了表1和表2,但对于表3而言,服务A和服务B都需要访问。

数据冗余

为了对表3进行拆分,我们这时候就需要采用一定的数据冗余策略。


可以看到,我们需要把针对表3的数据操作抽象成“写”和“读”两方面。通常,这部分工作并不会很复杂,因为针对某个业务数据写入的源头通常只有一个,只要明确这个数据源即可。万一我们发现写的操作有多个源头,那么把这些源头的代码都放在微服务A中就可以了。至于读操作,我们确保采用一定的数据同步机制确保服务B中的表3数据实时更新即可。

接口改造

最后,我们明确了表3的“读写”边界,就可以通过接口的方式去除数据同步机制。这也是数据拆分的最后一个环节。


数据拆分是我们开展微服务架构设计和实现过程中的一种常见场景。应对这一场景的基本思路是分析服务与数据之间的关联关系,然后针对传统规范化数据模型存在的问题,梳理数据拆分的典型场景和解决方案。今天的内容,我们对这一话题进行了深入的探讨,并结合典型场景给出数据拆分的案例分析。

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

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

相关文章

Node性能如何进行监控以及优化?

一、 是什么 Node作为一门服务端语言,性能方面尤为重要,其衡量指标一般有如下: CPU内存I/O网络 CPU 主要分成了两部分: CPU负载:在某个时间段内,占用以及等待CPU的进程总数CPU使用率:CPU时…

memblock_free_all释放page到buddy,前后nr_free的情况

https://www.cnblogs.com/tolimit/p/5287801.html 在zone_sizes_init 之后,各个node,zone的page总数已知。但是此时的每个order的空闲链表是空的,也就是无法通过alloc_page这种接口来分配。此时page还在memblock管控,需要memblock…

HDTune和CrystalDiskInfo硬盘检测S.M.A.R.T.参数当前值最差值阈值

高亮颜色说明:突出重点 个人觉得,:待核准个人观点是否有误 高亮颜色超链接 文章目录 S.M.A.R.T.监控技术磁盘健康状态监测,硬盘检测硬盘检测工具 HD Tune硬盘检测工具 CrystalDiskInfo 当前值最差值阈值原始值的含义二级标题待补充待补充 开头…

IPV4地址介绍

4.1IP地址简介 目前的全球因特网所采用的协议族是TCP/IP协议族。IP是TCP/IP协议族中网络层的协议,是TCP/IP协议族的核心协议。IP协议定义了一种地址编码,称为IP地址,它是网络中网络段、网络设备接口、主机的编码,它并不是一种物理…

Pag格式在vue3中的简单使用方法

目前前端使用pag格式的方法比较少&#xff0c; 在这里我来简单实现一下pag格式在vue3中的使用方式。 第一步 先下载啦 npm i libpag 来对pag文件安装依赖 其次我们在自己想要引入的vue页面进行引入 <script setup> import { ref, computed, watchEffect, nextTick …

应用案例|精密制造中使用复合机器人得到显著提升

精密制造行业对设备的精度、稳定性和效率要求极高&#xff0c;而复合机器人凭借其多功能性、高度灵活性和精准控制能力&#xff0c;正逐渐成为该领域的新宠。以下是一个富唯智能复合机器人在精密制造中的应用案例。 案例背景 某知名汽车零部件制造企业&#xff0c;专注于生产…

光纤现网与接入网概念对应

OLT 一般在机房 一级分光可能在机房也可能在光交交接箱 路边的光交交接箱功能有分光或者光纤汇聚转换一下 二级分光在分光光纤箱里&#xff0c;楼道里面挂着的那种 ONU是家里的光猫

go语言的使用方法

一.go语言的介绍 1.简介 2.应用领域 3.使用go语言的公司 4.go语言开发工具介绍 5.go语言开发环境搭建 【1】搭建Go开发环境-安装和配置SDK 基本介绍: 1).SDK的全称(Software Development Kit软件开发工具包&#xff09;2).SDK是提供给开发人员使用的&#xff0c;其中包含了…

STM32实验之USART串口发送+接受数据(二进制/HEX/文本)

涉及三个实验&#xff1a; 1.USART串口发送和接收数据 我们使用的是将串口封装成为一个Serial.c模块.其中包含了 void Serial_Init(void);//串口初始化 void Serial_SendByte(uint8_t Byte);//串口发送一个字节 void Serial_SendArray(uint8_t *Array,uint16_t Length);//…

第一讲:单片机STC89C52+RA8889驱动控制彩屏(源码公开)

51单片机驱动控制彩屏系列讲座 第一讲&#xff1a;单片机STC89C52RA8889驱动控制彩屏&#xff08;源码公开&#xff09; 单片机通过SPI与RA8889进行通信&#xff0c;由于单片机是5V&#xff0c;RA8889是3.3V,故需要进行电平转换&#xff0c;有现成的模组TXS0108E等可以采用。…

VRTK4教程 一:资源导入、Unity设置、连接头盔

文章目录 VRTK4的分包导入VRTK4的资源包unity设置连接头盔 VRTK4的分包 vrtk4的资源包和旧版不同&#xff0c;采用了分包导入的思想&#xff0c;我们要用什么功能&#xff0c;就导入什么包&#xff0c;可以有效减小程序体积 如下图&#xff0c;已经导入的vrtk包会显示在Packag…

CentOS下安装SVN客户端及使用方法

一、前言 Subversion&#xff08;SVN&#xff09;是一款开源的版本控制系统&#xff0c;它可以帮助开发者追踪和管理代码、文档或其他文件的更改历史。在Linux系统中&#xff0c;特别是在CentOS环境下&#xff0c;安装和使用SVN客户端是日常工作中常见的任务。本文将介绍如何在…

【错误记录】HarmonyOS 运行报错 ( Failure INSTALL_PARSE_FAILED_USESDK_ERROR )

文章目录 一、报错信息二、问题分析三、解决方案 一、报错信息 在 DevEco Studio 中 , 使用 远程设备 , 向 P40 Failure[INSTALL_PARSE_FAILED_USESDK_ERROR] compileSdkVersion and releaseType of the app do not match the apiVersion and releaseType on the device. 二、…

在outlook的邮件中插入HTML;HTML模板获取;页面组态手动生成HTML

本文介绍如何在outlook发送邮件时&#xff0c;在邮件中插入HTML&#xff0c;此HTML可以从获取模板自行进行修改。 文章目录 一、下载HTML模板&#xff08;或自己制作好HTML文件&#xff09;二、outlook新增宏三、新建邮件&#xff0c;插入HTML四、通过图像化页面组态手动生成HT…

[C#]使用C#部署yolov8-cls的图像分类的tensorrt模型

【测试通过环境】 win10 x64 vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super 版本和上述环境版本不一样的需要重新编译TensorRtExtern.dll&#xff0c;TensorRtExtern源码地址&#xff1a;TensorRT-CShar…

汇舟问卷:国外问卷调一天900

大家好&#xff0c;我是汇舟问卷&#xff0c;专注于国外问卷调查互联网项目。夏天已经来临&#xff0c;您是否在三伏天顶着大太阳上班&#xff0c;汗水浸湿了衣襟&#xff0c;却依然要面对繁琐的工作和无尽的压力&#xff1f; 在这个炎热的季节里&#xff0c;我们都渴望找到一…

失落的方舟 命运方舟台服账号怎么注册 游戏账号最全图文注册教程

探索奇幻大陆阿克拉西亚的奥秘&#xff0c;加入《失落的方舟》&#xff08;Lost Ark&#xff09;这场史诗般的冒险。这是一款由Smilegate精心雕琢的MMORPG巨作&#xff0c;它融合了激烈动作战斗与深邃故事叙述&#xff0c;引领玩家步入一个因恶魔侵袭而四分五裂的世界。作为勇敢…

教学基本功包括什么技能有哪些

教师的工作不仅仅是传授知识&#xff0c;更多是引导学生探索&#xff0c;激发他们的创造力。要做到这一点&#xff0c;需要具备一些基本技能。 扎实的专业知识。这是教师的根基&#xff0c;如果教师自己对所教的科目都不熟悉&#xff0c;那么教学就会失去方向。不断学习更新自己…

29-ESP32-S3-WIFI篇-00 STA模式扫描全部 AP

ESP32-S3 WIFI_Driver 引言 ESP32-S3是一款集成了Wi-Fi和蓝牙功能的芯片。关于WIFI的部分&#xff0c;其实内容比我想象的要多得多。所以通常来说&#xff0c;如果你想要编写自己的Wi-Fi应用程序&#xff0c;最快捷的方法就是先找一个类似的示例应用&#xff0c;然后将它的相…

SC8205LA 20VN沟道增强型MOS(Mos)场效应管

特点 ❥专有的先进平面技术 ❥高密度超低电阻设计 ❥大功率、大电流应用 ❥理想的锂电池应用 ❥封装形式:SOT23-6