VonaJS提供的读写分离,直观,优雅

news/2025/9/29 9:47:00/文章来源:https://www.cnblogs.com/zhennann/p/19118176

在VonaJS中实现读写分离,只需提供一组写数据源和一组读数据源。当用户访问后端 API 时,系统会按照规则自动选择写数据源读数据源,访问相应的数据库,从而分摊压力,提升系统性能

安装模块

读写分离作为独立的模块提供,因此需要在VonaJS项目中安装此模块:

$ pnpm add vona-module-a-datasharding -w

添加数据源

首先,需要添加一组数据源

1. 添加类型定义

为新数据源添加类型定义

src/backend/config/config/config.ts

declare module 'vona-module-a-orm' {export interface IDatabaseClientRecord {read1: never;read2: never;write1: never;write2: never;}
}

2. 增加数据源配置

src/backend/config/config/config.ts

// database
config.database = {clients: {read1: {client: 'pg',connection: {host: '127.0.0.1',port: 5432,user: 'postgres',password: '',database: 'xxxx-read1',},},read2: {...},write1: {...},write2: {...},},
};

配置读写数据源

然后配置模块的读写数据源

src/backend/config/config/config.ts

// modules
config.modules = {'a-datasharding': {client: {reads: ['read1', 'read2'],writes: ['write1', 'write2'],randomRead: undefined,randomWrite: undefined,},},
};    
名称 说明
reads 指定一组读数据源
writes 指定一组写数据源
randomRead 可指定自定义函数,从reads中提取一个读数据源。默认为undefined,由系统随机提取
randomWrite 可指定自定义函数,从writes中提取一个写数据源。默认为undefined,由系统随机提取

读写分离的运行机制

当配置好读写数据源之后,读写分离机制就自动生效了

现在,解释一下读写分离的运行机制:

模块提供了一个全局拦截器a-datasharding:datasharding。该拦截器判断当前 API Method,如果是POST/PATCH/DELETE/PUT,那么就使用写数据源,否则使用读数据源

数据一致性: 缓存写数据源

场景分析:同一个用户

由于数据库同步有延时,会出现数据不一致性的情况。比如,用户访问Write-API,将数据写入写数据库。接下来,用户访问Read-API,此时读数据库还没有同步,那么就会读到旧数据

为了解决以上问题,模块自动提供了一个机制:当用户访问Write-API时,会自动将写数据源存入二级缓存,并设置过期时间。在这个时间之内,用户访问Read-API时,也会继续使用同一个写数据源,从而确保在写入数据后总是可以读取到最新的数据

修改过期时间

二级缓存的名称是a-datasharding:datasourceWrite,可以在 App config 中修改过期时间:

src/backend/config/config/config.ts

// onions
config.onions = {summerCache: {'a-datasharding:datasourceWrite': {mem: {ttl: 5 * 1000, // 5s},redis: {ttl: 5 * 1000, // 5s},},},
};
名称 说明
mem.ttl Mem缓存的过期时间,默认为3
redis.ttl Redis缓存的过期时间,默认为3

数据一致性: 缓存双删

场景分析:不同用户

Vona ORM 提供了开箱即用的缓存机制,参见:缓存

由于数据库同步有延时,会出现缓存不一致性的情况。比如,用户 A 访问Write-API,将数据写入写数据库,并自动删除缓存。接下来,用户 B 访问Read-API,此时读数据库还没有同步,那么就会读到旧数据,并存入缓存

为了解决以上问题,模块a-orm提供了缓存双删机制:当用户 A 访问Write-API时,将数据写入写数据库,并自动删除缓存。然后在指定时间之后再次删除缓存,从而确保缓存总是最新数据

启用缓存双删

src/backend/config/config/config.ts

// modules
config.modules = {'a-orm': {sharding: {cache: {doubleDelete: true,},},},
};

修改缓存双删延迟时间

系统采用队列任务执行缓存双删,队列名称是a-orm:doubleDelete,可以在 App config 中修改缓存双删延迟时间:

src/backend/config/config/config.ts

// onions
config.onions = {queue: {'a-orm:doubleDelete': {options: {job: {delay: 5 * 1000, // 5s},},},},
};
名称 说明
job.delay 指定延迟多长时间执行缓存双删任务,默认为3

Vona ORM已开源:https://github.com/vonajs/vona

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

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

相关文章

网站图标目录视频网站怎么做

很多朋友在用IIS6架网站的时候遇到不少问题,而这些问题有些在过去的IIS5里面就遇到过,有些是新出来的,俺忙活了一下午,做了很多次试验,结合以前的排错经验,做出了这个总结,希望能给大家帮上忙。…

免费开源的百度文库平替!支持多格式文档预览与存储!

DocHub 使用 Go 语言的 Beego 框架开发实现的类百度文库解决方案,支持 Office、Pdf、Txt、Mobi、EPub 等多种文档格式的在线阅读浏览。大家好,我是 Java陈序员。 想必大家都用过百度文库,常常因为没有会员而不能复制…

个人行业选择

尖端技术:AI,网络安全,底层开发 自由:独立开发设计,技术顾问

写假数据

我看不懂这种写法,教我,原始形态是什么样的api: (params) => getListApi({ ...params }),这是api接口函数(export表示导出,这样就不会忘了写导出了,比如在接口文件最后写export { getUserList, createUser, up…

个人网站搭建详细流程有了空间怎么做网站

原标题:那些牛逼的酒吧都用什么管理系统?关于酒吧你是熟悉还是陌生?对酒吧的管理系统?你接触的都有哪些?今天分享一个超大型酒吧的系统解决方案。宁波最大酒吧S86正式营业,视易娱加管理系统助力场所运营&am…

C语言的指针与cpp的引用

指针 vs 引用 的相似之处 共同特点:都是间接访问:都提供了对另一个对象/变量的间接访问 都避免拷贝:传递大型对象时都可以避免昂贵的拷贝操作 都能修改原对象:通过指针或引用都可以修改所指向的对象具体代码对比 #…

day24——Java高级技术深度解析:单元测试、反射、注解与动态代理 - 指南

day24——Java高级技术深度解析:单元测试、反射、注解与动态代理 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

进程互斥的硬件实现方式(比较难懂的一节课,但是我搞懂了)

中断屏蔽方法 利用开关中断指令实现 关中断后,不允许当前进程被中断,也就不会发生进程切换 优点:简单高效 缺点:不适用于多处理机,只适用于操作系统内核进程,不适合于用户进程(因为开关中断指令只运行于内核态)…

详细介绍:Spring MVC 请求执行流程详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

GreenPlum - commit

GreenPlum - commit在Python代码中执行完insert, delete, update后要执行conn.commit()才能生效,truncate语句之后也要执行conn.commit(),否则truncate不生效。

【征文计划】基于Rokid眼镜平台的AR历史情景课堂创意应用 - 指南

【征文计划】基于Rokid眼镜平台的AR历史情景课堂创意应用 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

忍了一年,我的SAAS CRM终于到期了!

导读:当标准化模板遇上个性化需求,这场“将就”的婚姻终于走到尽头。本文揭秘为何90%的企业最终会放弃通用型SaaS CRM,转向私有部署+深度定制的解决方案。🌈 初见倾心:被颜值欺骗的开始 去年这时,我像捡到宝一样…

最好旅游网站建设深圳南山做网站公司

https://blog.csdn.net/wochunyang/article/details/84776813

Aduro电涌保护器特惠:6口插座与2USB端口52%折扣

本文介绍Aduro电涌保护器特惠活动,详细解析其6个AC插座和2个USB端口的技术规格,包括15安培/120伏特承载能力、2.4安培USB总输出及保护状态指示灯功能,同时讨论USB充电功率限制和使用注意事项。特惠信息 今日特惠为A…

centos 网卡IPv6配置

编辑网卡vi /etc/sysconfig/network-scripts/ifcfg-ens192IPV6INIT=yesIPV6ADDR=2001:db8::2/64IPV6_DEFAULTGW=2001:db8::1IPV6_DEFROUTE=yes # 关键!确保启用默认路由编辑后wq保存退出,重启网

华清远见携STM32全矩阵产品及创新机器狗亮相2025 STM32研讨会,共启嵌入式工艺探索新程

华清远见携STM32全矩阵产品及创新机器狗亮相2025 STM32研讨会,共启嵌入式工艺探索新程2025-09-29 09:26 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; …

免费发布网站html

腾讯云edgeone免费发布网站链接 https://console.cloud.tencent.com/edgeone/pages 在页面点击创建项目有三个选项1.导入 Git 仓库2.从模板开始3.直接上传(如果看不懂选第三个)把你的html文件传上去就好了如不懂可以扫…

IPD和PLM谁先谁后

IPD和PLM谁先谁后在IPD项目前期交流阶段、实施过程中、或者实施后,客户常常提出这些问题:如何提高IPD体系的运行效率? 信息系统如何支撑IPD? IPD如何与PLM结合? 这两个体系的建设应当如何进行? 两个系统的建设是…

卖房网站排名网站建设可行性实施报告

目录 前言 1、字符指针 2、指针数组 3、数组指针 3.1数组指针 3.2&数组名VS数组名 3.3数组指针的使用 4、数组参数、指针参数 4.1一维数组传参 4.2二维数组传参 4.3一级指针传参 4.4二级指针传参 4.5总结 5、函数指针 5.1思考 总结 前言 我们在之前知道指针…

母线操作术语

1、操作术语:(1)倒母线:是指双母线接线方式的变电站(开关站)将一组母线上的部分或全部开关倒换到另一组母线上运行或热备用的操作。(2)倒负荷:是指将线路或变压器负荷转移至其他线路或变压器供电的操作。 2、母…