news 2026/2/3 12:06:57

VonaJS提供的读写分离,直观,优雅[特殊字符]

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VonaJS提供的读写分离,直观,优雅[特殊字符]

在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秒

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/3 16:02:28

基于大数据的人脸识别系统设计与实现开题报告

选题意义随着科技的发展,人脸识别技术被广泛应用在门禁、支付、身份验证等领域,极大地提高了效率并增强了安全性。它能减少传统密码式的繁琐,让人们的生活更便捷。这是数字化转型的一部分,有助于构建智慧城市和物联网环境下的智能…

作者头像 李华
网站建设 2026/2/3 14:48:19

车载 Android 系统稳定性问题全解析:从性能到黑屏的排查指南

引言 在车载 Android 系统开发中,稳定性问题是最让人头疼的挑战之一。与手机不同,车载系统对稳定性的要求近乎苛刻——想象一下,用户正在高速公路上行驶,导航突然黑屏,或者中控卡死无响应,这不仅仅是用户体验问题,更关乎行车安全。 经过多年的车载系统开发实践,我们将…

作者头像 李华
网站建设 2026/1/29 10:46:36

气象在线监测系统助力智慧环境管理,金叶仪器专业气象监测解决方案

在当今社会,气象环境数据对于生产生活、科学研究与可持续发展具有日益重要的意义。准确、连续的气象监测不仅能够帮助人们更好地理解自然环境变化,也为农业、交通、能源、环保等多个领域提供了关键的数据支撑。随着物联网、云计算等技术的成熟&#xff0…

作者头像 李华
网站建设 2026/2/3 17:47:34

【TVM 教程】交叉编译与 RPC

TVM 现已更新到 0.21.0 版本,TVM 中文文档已经和新版本对齐。 Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →Apache TVM 作者:Ziheng Jiang、Lianmin Zheng 本教程介绍了…

作者头像 李华
网站建设 2026/1/26 16:37:24

腾讯云国际站代理商的QAPM服务能提供哪些专属服务?

腾讯云国际站代理商提供的 QAPM(客户端性能分析)服务,在腾讯云 QAPM 产品本身功能基础上,叠加了适配出海业务的专属增值服务,涵盖成本优惠、技术定制、运维保障等多个维度,具体如下:成本优化专属…

作者头像 李华