云卷云舒:基于业务逻辑关联度实现数据预加载

云卷云舒:算力网络+云原生(下):云数据库发展的新篇章-CSDN博客

一、现有技术的技术方案

        在实现一个具有复杂业务逻辑的应用系统时,大多数情况下,编码过程中必定会包含着较多的数据访问方法(java中称之为方法)或函数(c中称之为方法),同样也就意味着多次的数据库连接。一方面复杂的逻辑会将程序的响应时间拖延过长,另一方面多次的数据库连接势必会给数据库带来过多的访问压力。

        那么在架构时有效的解决上述问题就十分必要,综合了目前业界众多主流方案,最终可以归纳为以下几种:

1、并发方案

该方案的思想,即将所有涉及读取数据库的方法予以分类,将相互之间没有依赖关系(即A方法的执行不依赖于B方结果的情况)的一类方法通过并发的方案执行,这样N个方法的执行时间理论上就等于响应时间最大的那个方法的响应时间,避免了其他N-1个方法的响应时间,整体上提高了程序的执行效率;同时辅助以线程池来进行线程管理和预防线程泛滥。

该解决方案架构难度较低,通过编写并发逻辑实现响应时间优化,为目前比较常用的一种软件架构方案。

2、分布式缓存方案

该方案的思想,即将经常需要读取的数据缓存起来,而且是通过分布式的缓存模块来承载数据,数据读取时可以快速的从缓存内读取内容。避免了大量的数据库连接,提高访问效率的同时,也降低了数据库服务的访问压力。该方案是目前应用最广泛的架构方式,而且优化效果也比较明显。

二、技术分析

        针对前面提到的二种主流解决方案进行详细分析后,可以得出其各自场景下的应用弊端:

1、并发方案

该方案中,通过将没有依赖关系的方法归为一类进行并发执行,但是:

(1)并发模型需要编写专门的并发方法,一般的并发方法都要通过比较复杂的代码逻辑实现,如“线程池维护”、“多类异常处理”、“线程安全控制”对于编码者来说都是比较复杂且容易出错的环节,依赖于编码者编程水平,如若控制不当很容易出现内存溢出、线程泛滥的后果。

(2)并发方案并没有减少针对数据库的访问次数,数据库同样面对着较大的压力。

所以该方案并没有很好的针对复杂业务逻辑带来的一系列问题进行优化和解决。

2、分布式缓存方案

该方案中,将经常需要读取的数据通过分布式的缓存模块来存储加速,但是:

(1)与方案1-并发方案一样,编码者同样需要编写复杂的缓存逻辑,来有效的控制缓存的过期策略、更新策略、删除策略等,同样在编码层次上对编码者要求较高,如若处置不当也容易引起同样的风险。

(2)实现缓存模型的通用办法均通过为某一类需要缓存的数据建立一个Key-Value的内存临时库,当数据第一次被访问时将其读入内存内,如果在设定的缓存有效周期内,该数据再没有被读取则删除,如果在一个有效周期内被频繁读取,则定期更新数据(更新时间均小于有效周期)。那么很有可能很多的数据都是在读取一次过后即被读入缓存,就再也未被使用过,但是在一个缓存有效期内仍然会占据内存空间,所以该缓存模型仍存在着巨大的优化空间。

(3)单独与应用程序部署的分布式缓存组件,在应用程序进行读取时势必带来了额外的网络IO开销,而且如果分布式缓存组件服务异常,应用程序很有可能会受到影响

      本文内设计了一种架构,从业务逻辑的关联度出发,在应用程序代码段和数据库连接的建立之间增加了一个数据访问代理环节,实现在一次数据库访问的同时为下一次可能的读取做预加载操作,提高数据的访问效率。

 

三、基于业务关联度的数据预加载方法

        本方案的出发点是考虑到应用程序运行的时候,代码逻辑都是固定的,那么对于数据库来说完成一次完整业务处理的过程中,数据库的读取顺序都是固定的,即一段完整的业务逻辑内各方法之间的关联度是十分有挖掘价值的。即程序执行过A 数据库请求(DB_REQ)后必定(或一定概率)会执行B DB_REQ,那么在程序执行A DB_REQ的时候,就为其准备好B DB_REQ的信息,再下一次的B DB_REQ到来的时候,就可以直接的反馈结果,极大地提高了访问效率,也降低了实际的数据库的访问效率。

        下面描述预加载模型。

        首先针对业务逻辑内的方法定义模型如下图:

请求

方法

参数

SQL示例

R1

Method 1

P1,P2

Select * from table where k1=p1 and k2=p2

R2

Method 2

P1,P2,P3

Select * from table where k1=p1 and k2 in (P2,P3)

R3

Method 1

P1,P3

Select * from table where k1=p1 and k2=p3

….

n

Method N

P1,P2,..,PN

Select * from table where k1<p1 and k2 in (P2,P3,…,PN)

图表 1 业务逻辑方法定义模型

        上图中,方法一列代表着整个应用程序内所有涉及数据库读取的方法或函数,命名为Method1,2,…,N,同一个方案可能存在不同个数的参数,相同参数个数的方法也存在着参数取值的区别,所以“方法”和“参数”两个字段可以唯一的标识一次请求,即可以代表一次SQL查询操作。

        预加载模型如下图:

        上图中,预加载模型包括代理模块、关联度量模块和内存池三部分。整个模型的工作流程描述如下:

  1. 应用程序内发送DB请求R1到达预加载模型的代理模块,除了携带本方法所需的请求参数外,还携带下一次请求的预告知目标信息(如R2,代表在相同的一个线程内,下一次就会发起目标R2请求),和距离下一次请求的最大延时T1(告知代理模块R2请求最晚会在T1时间后发出)。
  2. 代理模块收到R1后,为R1请求DB,获取结果集,同时为R2请求DB获取结果集,暂存于本地缓存内。同时等待R2的真实请求到达代理模块,如果R2未在T1时间内到达代理模块,则忽略之前为R2的代理请求结果集(从本地缓存内删除R2代理请求结果集);如果R2在T1时间内被接收到,那么认为R1所携带的预告知信息可信,则在代理模块内置的关联度量表中查找是否存在CR列为R1且NR为R2的记录行,如果存在则将HN和TN列加一,且计算出CV列值,如果不存在则初始化一条记录。(注:CR、NR、HN、TN、CV等值在附录中描述。)

     3.通过不断的迭代运算,代理模块内置的关联度量表中会不断丰富,且条数不断增长,但是数据再表中的保存时间不会无条件延长,本方案中设计了一个失效模型。如下:

模型默认所有记录行的有效期为InitValidCycle=10min,那么无效数据的认定规则为:每间隔1min对该表记录进行扫描:

  1. 如果CV值小于黄金分割值GSV(Golden section value) = 0.618,即认为该预测记录的置信度较低,可以清洗表内的记录,并删除对应的本地缓存的数据,释放内存空间。
  2. 如果一条记录的CV值一直大于等于黄金分割值GSV,但是在表内已经超过InitValidCycle=10min,则同样认为该行记录不可信,可以清洗表内的记录,并删除对应的本地缓存的数据,释放内存空间。

        4.实际请求到达时,代理模块首先去内存池读取预加载的数据,如果没有读取到,则会实际的发起一次真实的DB,获取结果为程序段返回。

经过不断的迭代运算,数据预加载的准确度将越来越高,使得即使复杂的业务逻辑下应用程序也可以比较高效的读取服务端数据,同时内存中缓存的数据都是经过不断清洗淘汰后剩余的数据,均为价值较大的数据,极大地提高了内存资源的利用率。

本方案使用方式如下:

  1. 代理模块以SDK包的方式引入程序工程内,在实际编写业务代码的时候,需要在请求进入的位置添加SDK包内的方法,使得代理程序生效;如果不引入SDK包,则在程序内无法直接使用SDK包内的方法。
  2. 代码编写方式举例如下:

如未经过本方案优化时,代码段举例为:

Obj o1 = db.getDataFromDB(id1); (R1请求)Obj o2 = db.getDataFromDB(id2); (R2请求)Obj o3 = db.getDataFromDB(id3); (R3请求)

经过本方案优化后,代码段举例为:

Obj[] o = Proxy.getDataFromProxy(id1,id2,id3);

//定义代理方法

Proxy.getDataFromProxy(id1,id2,id3,T1){Obj o1 = db.getDataFromDB(id1); (R1请求)Obj o2 = db.getDataFromDB(id2); (R2请求)Obj o3 = db.getDataFromDB(id3); (R3请求)}
  1. 按照上图实例,代码不是像以前一样分别按顺序发出R1R2R3三个请求,而是向代理模块Proxy发出请求,利用代理Proxy. getDataFromProxy方法,把原本逻辑写在代理方法内,由代理方法getDataFromProxy管理三个请求R1R2R3,在请求getDataFromProxy方法的时候,传入了id1,id2,id3,和延时参数T1,那么在请求代理方法getDataFromProxy的时候,在完成R1请求的同时,会同时把R2R3两个请求都进行预加载(当然符合前面(1)(2)所述的T1延时相关要求)。
  2. 前面实例是将R1R2R3同时放到一个代理方法内,代表着请求R1的时候,同时带入了R2R3所需要的参数id2和id3以及延时参数T1,那么则完成了R2R3的预加载。
  3. 同理,如果代理方法只传入R1R2和T1,则代表着仅完成R2的预加载;如果只传入R2R3和T1,则代表着仅完成R3的预加载。

仅个人观点,供讨论。 

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

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

相关文章

MES是什么?有了MES还要上ERP或MES吗?

MES是什么 MES是Manufacturing Execution System&#xff08;制造执行系统&#xff09;的简称&#xff0c;是一套面向制造企业车间执行层的生产信息化管理系统&#xff0c;负责承接ERP系统下达的生产计划&#xff0c;与ERP关系密切。MES能通过信息传递&#xff0c;做到生产追溯…

亚马逊、速卖通等跨境平台如何利用自养号测评提升销量

一、自然排名&#xff1a;链接成功的关键 自然排名的重要性不言而喻。一个链接的成功与否&#xff0c;关键在于其自然排名是否能够打上来。无论是搜索流量还是关联流量的自然排名&#xff0c;亦或是BSR排行榜&#xff0c;都应时刻关注这些自然排名的变化。 二、自然排名的位置…

Unity 2022 版本 寻路 NavMesh

官方教程地址 https://docs.unity3d.com/Packages/com.unity.ai.navigation1.1/manual/index.html 首先装包 先给地图 和 阻挡 设置为静态 然后给地上行走的地方 添加组件 可以直接bake 然后会显示蓝色的可行走路径 player 添加插件 然后给角色添加脚本 using System.Co…

Keil调试STM32卡死在文件startup_stm32f10x_hd.s的B处

———————Keil调试卡死——————— &#x1f384;问题说明 在移植代码完成后调试时候程序卡死在startup_stm32f10x_hd.s文件的B处 &#x1f384;复现场景 &#x1f384;解决办法 经过查资料&#xff0c;发现是移植的时候&#xff0c;漏掉了终端函数&#xff0c;加上…

MySQL的安装网络配置

目录 一. MySQL5.7的安装 二. MySQL8.0的安装 三. 配置网络访问 思维导图 一. MySQL5.7的安装 1. 解压 2. 将my.ini文件放入到解压文件中 3. 编辑my.ini文件&#xff0c;将路径改为当前路径 4. 进到bin目录下&#xff0c;以管理员身份打开cmd命令窗口 5. 安装MySQL服务 my…

kbdnecat.DLL文件缺失,软件或游戏无法启动运营,快速修复方法

“kbdnecat.DLL文件是什么&#xff1f;为什么一起动游戏或软件&#xff0c;Windows就报错“kbdnecat.DLL文件缺失&#xff0c;软件无法启动””&#xff0c;应该怎么修复呢&#xff1f; 首先&#xff0c;先来了解“kbdnecat.DLL文件”是什么&#xff1f; kbdnecat.DLL是一个动…

Vue中全局事件总线的配置和原理

实现任意组件之间的通信 任意组件通信的原理&#xff1a; 1、实现任意组件之间的通信,需要一个傀儡。这个傀儡既能被vm访问到,也能被VueComponent访问。 2、VueComponent.prototype.proto Vue.prototype为图上1.0黄色的线路。是Vue让组件实例对象VueComponent可以访问到Vue原…

HCIA-Datacom题库(自己整理分类的)——其他网络协议【完】

&#xff08;一&#xff09;单选 下列属于链路状态协议的是? Direct static FTP OSPF 解析&#xff1a; FTP&#xff1a;文件传输协议 OSPF&#xff1a;链路状态路由协议 如下图所示的网络主机A通过Telnet登录到路由器A然后在远程的界面通过FTP获取路由器的配置文件&…

学习调整echarts中toolbox位置toolBox工具栏属性

学习调整echarts中toolbox位置toolBox工具栏属性 toolbox工具栏属性介绍示例代码代码参数说明 toolbox工具栏属性介绍 参考网址&#xff1a;https://echarts.apache.org/zh/option.html#tooltip 属性类型说明toolbox.showbooleanboolean 默认值为true&#xff0c;是否显示工具…

studio3T mongodb 根据查询条件去更新集合

mongodb 等于、不等于$ne、不包含 $nin 以及批量更新数据的使用。 业务场景&#xff1a; 在集合中&#xff0c;根据查询条件&#xff0c;更新数据状态。 实现代码&#xff1a; 1. 部门名称为XXX、状态不等于“完好”的、并且不包含这些编码的数据先查询出来2. 再把状态更新成…

This is probably not a problem with npm.

项目场景&#xff1a; 新创建的vue3项目&#xff0c;根据elementplus官网安装步骤进行按需导入安装&#xff0c;运行项目报错 This is probably not a problem with npm.There is likely additional logging output above. 原因分析&#xff1a; 是elementplus安装版本和自动…

玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 编译构建及此过程中的踩坑填坑(1)

接前一篇文章&#xff1a;玩转贝启科技BQ3588C开源鸿蒙系统开发板 —— 代码下载&#xff08;2&#xff09; 本文主要参考&#xff1a; BQ3588C_代码下载 上一回完成了代码下载&#xff0c;本回开始进行编译构建。 1. 编译构建 &#xff08;1&#xff09;执行prebuilts 在源…

JavaScript可选链接

注&#xff1a;本节仍然使用之前的饭店的对象&#xff0c;可以看上几篇文章查看代码 ● 如果我们想要看看饭店周一的开门时间&#xff0c;我们会这么写 console.log(restaurant.openingHours.mon.open);原因是我们在开放时间中并没有定义周一的开放时间&#xff0c;所有会报错…

2024年工作计划与目标怎么写?如何用手机制作工作待办清单

2024年的钟声已经到来&#xff0c;对于上班族来说&#xff0c;制定一份切实可行的工作计划与目标是非常有必要的。但是&#xff0c;很多人不知道2024年工作计划与目标怎么写&#xff1f;其实&#xff0c;关键在于明确目标、细化计划、合理安排时间&#xff0c;以确保每一步都稳…

BIO和NIO编程(待完善)

目录 IO模型 BIO NIO 常见问题 IO模型 Java共支持3种网络编程IO模式&#xff1a;BIO&#xff0c;NIO&#xff0c;AIO BIO 同步阻塞模型&#xff0c;一个客户端连接对应一个处理线程 代码示例&#xff1a; Server端&#xff1a; public class BioServer {private static …

window下载安装Mongodb数据库

我们先要访问他的官网 https://www.mongodb.com/zh-cn 然后顶部导航栏 选择 (Products/产品) 下的 (Community Edition/社区版) 进入界面后 找到 MongoDB Community Server Download 点击下面的按钮 Select package 然后会弹到这个位置 第一个版本 用系统默认选择的就好 第二…

Redis - 挖矿病毒 db0 库 backup 反复出现解决方案

问题描述 腾讯云的服务器&#xff0c;使用 Docker 部署了 Redis 之后&#xff0c;发现 DB0 中总是出现 4 条 key&#xff0c;分别是 backup01backup02backup03backup04 而自己每次存入 db0 中的数据过一会就会被无缘无故删除掉。 原因分析 挖矿病毒 解决方案 在启动的时候…

PSoc62™开发板之串口通信

实验目的 1.使用串口和PC机通信&#xff1a;接收和发送信息 2.接收GNSS模块定位信息 实验准备 PSoc62™开发板CH340 USB转TTL模块ATGM332D GNSS模块公母头杜邦线x4 板载资源 板载有多少uart 创建工程例程&#xff0c;在libraries/HAL_Drivers/uart_config.h中查看BSP支持…

凯越推出复古150踏板欧洲先上?DAE150/150亮相

今天临下班发现凯越在欧洲的官网上更新了一台复古踏板&#xff0c;外观别说还有点精致的意思&#xff0c;一共分为125和150两个配置&#xff0c;都是采用的水冷单缸发动机。 配置和参数等数据简单过一下&#xff0c;这种车型更多的是看外观了&#xff0c;仪表采用的LCD的显示屏…