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

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


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


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

数据拆分场景和解决方案

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


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

跨表查询场景

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

下图展示了一种表连接的表现形式,图中的连接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的“读写”边界,就可以通过接口的方式去除数据同步机制。这也是数据拆分的最后一个环节。


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据大屏方案 : 实现数据可视化的关键一环_光点科技

在数字时代的浪潮中,数据已经成为企业决策和操作的重要基础。因此,“数据大屏方案”逐渐成为业界关注的焦点。这类方案通过将复杂的数据集合以直观的形式展现出来,帮助决策者快速把握信息,做出更加明智的决策。 数据大屏的定义及作…

基于异构图的大规模微服务系统性能问题诊断

简介:本文介绍由南开大学、清华大学、腾讯、国家超级计算天津中心共同合作的论文:基于异构图的大规模微服务系统性能问题诊断。该论文已被IEEE Transactions on Services Computing期刊录用 论文标题:Diagnosing Performance Issues for Lar…

有限元之抛物型方程初边值问题解法

目录 一、原方程的变分形式 二、有限元法进行空间半离散 三、差分法进行时间全离散 四、相关量的数值计算 五、编程时的说明 六、算例实现 6.1 C代码 6.2 计算结果 本节我们将采用有限元法联合差分法来数值求解抛物型方程的初边值问题: 其中常数。 一、原方…

达梦数据库安装手册

首先了解达梦数据库相关内容: 达梦在线服务平台 下载windows版本开发版,将下载的文件解压。进行安装 2、安装流程,默认选择下一步。 3、安装引导,默认下一步,安装实例可以进行修改 4、最后一步记录一下创建的摘要 …

六西格玛项目课题决策权归属:谁来做主更明智?

在实施六西格玛的过程中,一个关键的问题摆在了我们面前:应该由谁决定六西格玛的项目课题?这个问题不仅关系到项目能否顺利实施,更直接影响到企业整体绩效的提升。深圳天行健企业管理咨询公司解析如下: 首先&#xff0…

基于Java实现的图书管理系统

前言:该图书管理系统实现了查找、添加、删除、显示、借阅、归还等功能,分为两个用户群体:管理者和普通用户。使用了类与对象,封装继承多态,抽象类和接口等Java基础知识。 一.思路 面向对象三部曲:找对象&…

JavaDS-学习数据结构之如果从零开始手搓顺序表,顺带学习自定义异常怎么用!

前言 笔者开始学习数据结构了,虽然笔者已经会用了,不管是C 中的stl亦或是Java 中的集合,为了算法比赛多少都突击过,但只知其然而不知其所以然,还是会限制发展的,因此,笔者写下这篇博客.内容是手搓一个顺序表.顺带加一点异常的使用,大伙看个乐子就好了.有错误直接私信喷我就好了…

【AI赋能】香橙派OrangePi AIpro初体验

【AI赋能】香橙派OrangePi AIpro初体验 1、初识香橙派1.1、仪式感开箱1.2、OrangePi AIpro(8T)介绍 2、上电开机2.1、开机2.2、串口调试2.2.1 两种方式登录2.2.2 相关信息 2.3、启动系统2.4、网络配置 3、连接摄像头4、目标检测4.1、Jupyter Lab模式4.2、 目标检测测试4.2.1 视…

花钱学谢宁DOE培训,投入产出比到底如何?

在当今这个快速发展的时代,无论是职场人士还是创业者,都渴望通过不断学习来提升自我能力,以便在竞争激烈的市场中脱颖而出。其中,谢宁DOE培训因其独特的理念和方法,吸引了众多求学者的目光。然而,面对不菲的…

多条文本转二维码怎么做?一键批量建码的使用技巧

怎么快速的制作多条文本信息的二维码?随着二维码的广泛使用,现在很多内容都可以通过生成二维码扫码的方式来获取信息,其他文本二维码就是比较常用的一种类型。那么当需要将多条不同的文本内容每条单独生成二维码时,有什么方法可以…

如何借VR之手,让展厅互动更精彩?

VR虚拟现实技术以其卓越的沉浸式体验为特点,引领用户踏入一个全新的虚拟世界,正因如此,它开始被广泛应用于展厅、商业等多个领域。那么,今天,让我们就来了解一下这种技术是如何为展厅带来精彩互动体验的吧!…

Hudi之数据读写探究

Hudi之数据读写深入探究 1. Hudi数据写入 1-1. 写操作 Hudi数据湖中的数据更新、插入和删除操作,是一个基于Apache Hadoop的库,为数据湖提供了一种有效的方法来处理更新和增量数据,并支持基于时间的快照和增量数据处理。Hudi支持三种主要的…

可道云网盘的URL链接能干什么?小白必看的teamOS使用技巧

在繁复的工作日常里,我们每天都在与各种文件和资料打交道。由于文件夹太多,常常会陷入那种死活找不到想要的文件的困境中。 比如询问同事,合同模板在哪,直接发微信当然是很快的,但是事后想归档总是格外麻烦。比如&…

英飞凌24GHz毫米波雷达-BGT24LTR11N16家用机器人应用

BGT24LTR11N16基础描述: 关于BGT24LTR11N16,它是一款用于信号生成和接收的硅锗雷达MMlC,工作频率为24.00GHz至24.25GHz ISM频段。它基于24GHz基本电压控制振荡器(VCO)。 这颗芯片是属于1T1R,也就是一发一收…

10年老运营人吐血整理,给新媒体运营人的20条建议!沈阳新媒体运营培训

对于企业,在新媒体平台开设官方账号应该是已经成为标配。不仅是对企业新媒体运营需求量提高,新媒体人的薪资也是水涨船高。 另外值得注意的是,企业对资深新媒体运营人才尤为重视,这表现在他们不惜重金招聘高薪新媒体运营人才&…

Android Studio中xml预览不显示问题解决办法

具体表现: Android Studio的XML中可以看到视图的相对位置结构,但是看不到具体的模样,全黑,等于半摸黑调UI(由于我已经修好了所以没有截图)。不是所有的项目都会这样,一部分项目是正常的。 或许…

OrangePi_Kunpeng_Pro开发板测验——性能巨人

文章目录 📑前言一、开箱初体验的愉悦二、产品规格概述三、前置工作四、性能测试4.1 CPU 性能测试4.1.1 单线程 CPU 测试4.1.2 多线程 CPU 测试 4.2 内存性能测试4.2.1 内存读写性能测试4.2.2 高负载内存测试 4.3 I/O 性能测试4.4 网络性能测试4.5 测试小结4.5.1 CP…

跨域的解决方案

1. 计算机更改跨域 1.C盘->Windows->System32->drivers->etc 2.修改hosts 文件2. Chrome浏览器的跨域设置 操作步骤:1.打开我的电脑——C盘 新建一个文件夹,命名为MyChromeDevUserData2.右键——Chrome——快捷方式——目标,在…

使用python绘制一个五颜六色的爱心

使用python绘制一个五颜六色的爱心 介绍效果代码 介绍 使用numpy与matplotlib绘制一个七彩爱心! 效果 代码 import numpy as np import matplotlib.pyplot as plt# Heart shape function def heart_shape(t):x 16 * np.sin(t)**3y 13 * np.cos(t) - 5 * np.cos…

高级软件工程师带你解决MySQL死锁问题Deadlock found when trying to get lock实战案例全网唯一

高级软件工程师带你解决MySQL死锁问题Deadlock found when trying to get lock实战 前言 笔者我实际工作中,经常遇到mysql数据库死锁问题!CSDN上面也有很多大神刨析解决方法! 我在实际工作中的MySQL数据库架构很复杂,又涉及到主…