技术支持 鼎维重庆网站建设专家,中文域名注册机构,怎么优化网站排名才能起来,松江网站开发培训学校在VonaJS中实现读写分离#xff0c;只需提供一组写数据源和一组读数据源。当用户访问后端 API 时#xff0c;系统会按照规则自动选择写数据源或读数据源#xff0c;访问相应的数据库#xff0c;从而分摊压力#xff0c;提升系统性能安装模块读写分离作为独立的模块提供只需提供一组写数据源和一组读数据源。当用户访问后端 API 时系统会按照规则自动选择写数据源或读数据源访问相应的数据库从而分摊压力提升系统性能安装模块读写分离作为独立的模块提供因此需要在VonaJS项目中安装此模块$ pnpm add vona-module-a-datasharding -w添加数据源首先需要添加一组数据源1. 添加类型定义为新数据源添加类型定义src/backend/config/config/config.tsdeclare module vona-module-a-orm {export interface IDatabaseClientRecord {read1: never;read2: never;write1: never;write2: never;}}2. 增加数据源配置src/backend/config/config/config.ts// databaseconfig.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// modulesconfig.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// onionsconfig.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// modulesconfig.modules {a-orm: {sharding: {cache: {doubleDelete: true,},},},};修改缓存双删延迟时间系统采用队列任务执行缓存双删队列名称是a-orm:doubleDelete可以在 App config 中修改缓存双删延迟时间src/backend/config/config/config.ts// onionsconfig.onions {queue: {a-orm:doubleDelete: {options: {job: {delay: 5 * 1000, // 5s},},},},};名称 说明job.delay 指定延迟多长时间执行缓存双删任务默认为3秒