当前位置: 首页 > news >正文

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

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

http://www.rkmt.cn/news/13830.html

相关文章:

  • GreenPlum - commit
  • 忍了一年,我的SAAS CRM终于到期了!
  • 免费发布网站html
  • PySimpleGUI有哪些功能元素和函数缩写形式
  • 建材龙头东鹏控股:以CRM打造数字化增长新引擎
  • 万象EXCEL制作(四)格式解读theme1.xml ——东方仙盟练气期
  • 2025 年热转印花膜厂家最新推荐排行榜:覆盖硅胶,五金,塑胶,ABS,水杯等领域,权威推荐优质品牌解决采购难题
  • 核相的基本知识
  • 2025 年废气处理制造商最新推荐排行榜:权威盘点综合实力与服务能力,甄选行业优质品牌
  • 详细介绍:FreeRTOS---任务级和中断级临界区管理使用的理解与源码分析
  • 2025 年国内电容品牌最新推荐排行榜:固态电容,高压电容,安规电容,CBB电容,超级电容等多品类优质厂商权威盘点,助力企业精准选型
  • 【光照】[PBR][法线分布]GGX实现方法对比
  • PS中如何让文字中两行文字实现左对齐且中间部分文字对齐
  • 前端获取接口材料流程
  • APEX实战第5篇:利用APEX程序直观体验向量近似检索能力
  • 告别复制粘贴!Chat2File-DeepSeek 让 DeepSeek 对话成果直接变“成品” - 指南
  • 构建易受攻击的AWS DevOps环境:CloudGoat场景实践
  • MX 练石 2025 NOIP #10
  • 修复lazarus/fpc在windows不支持中文及空格目录(三)总结
  • 价值共生的语法革命:从“悬荡悟空”到“元人文构境”
  • 2025年中国超声波清洗机源头厂家最新权威推荐排行榜:聚焦核心优势精选超声波清洗机品牌助力企业选购
  • 无刷电机关键参数的测量方法详解
  • 课上及课下问题汇总
  • 4 个支持在线编辑的PPT模板网站,不用下载软件!
  • res := model.UserConsume{}与res := model.UserConsume{}区别
  • PS与可画基础介绍
  • OneNote 安装 OneNote Gem 的第三方插件
  • 第2周
  • PWN手的成长之路-03-bjdctf_2020_babystack
  • WordPress文章设置固定链接或永久链接 - 教程