.net 实现 CQRS 的的一个设想

一、先总结一下以前的经验

本人前公司项目开发基本算是CQRS的,但是有些繁琐

后台和数据接口用.net(后大部分转java),前台nodejs

数据统计用hive,hive每天凌晨同步数据

但是涉及列表含模糊搜索基本都是交给站内搜索团队,他们用Lucene,搜索每天抓取全量数据,定时(比如5分钟)抓取增量数据

碰到的问题主要有两个:

  1. 数据库负载问题

很多系统需要相同数据库的数据,导致死锁、io高负载

DBA弄很多从库,有时又出现数据同步延时和数据不一致问题

  1. 数据不一致不及时问题

后台、接口、搜索、统计、中转接口的数据有时出现不一致

有些数据还是T+1或者T+2的统计数据

其中极少数是多从库数据不一致和多个"相同功能"逻辑不一致

大部分还是多级缓存的问题

每个程序为了保证可用性,或多或少都自己做了缓存处理

打接口查问题,清缓存都是家常便饭

二、现在也有很多.net开源的DDD和CQRS框架

原理也很简单,把已经发生的事情包装为事件(一般用MQ),其他关联系统订阅事件再写逻辑处理

关联系统需要什么数据就要联系对方提供对应的事件,可能需要开发排期,需要更高层次的领导协调,有时也是苦不堪言

三、为此本人有个设想使用ShadowSql来简化这个过程

比如用mysql存储业务原始数据、es用来做前端展示、hive做数据挖掘

ShadowSql做添加、修改、删除都继承IExecuteSql接口

业务系统执行sql成功后把IExecuteSql对方发送到队列,相当于是mysql的binlog

由于ShadowSql支持多种数据库,也可以扩展来支持es和hive等

其他关联系统订阅队列,就可以直接执行sql了

当然这最好有个前提,主键、Id等最好不要用数据库的自增列,否则可能导致不一致

业务要用的字段最好也别用数据库默认值规则产生(比如添加、修改时间等)或触发器修改

当然也是有少部分逻辑不能通过数据同步来简单实现

我相信通过IExecuteSql对象来同步数据库可以解决80%+的问题

以上只是设想,ShadowSql暂时还不支持es和hive,为了方便消息处理IExecuteSql对象ShadowSql逻辑可能还需要调整

相关推荐
rising start5 天前
InsightEdu - 轻量智能学习平台
javascript·axios·css3·html5·fastapi·orm·dify
码农刚子7 天前
.NET 8 Web开发入门(四):注入燃料——Entity Framework Core 与 Code First 实战
数据库·orm·sql server
CSharp精选营8 天前
.NET 8 Web开发入门(四):注入燃料——Entity Framework Core 与 Code First 实战
orm·sql server·数据库迁移·ef core·entity framework core·crud操作·code first
阿kun要赚马内9 天前
后端数据操作组合:Pydantic与ORM
后端·python·orm·sqlalchemy
jump_jump11 天前
Drizzle 凭什么贴着 Go 跑——从设计哲学到热路径源码
数据库·性能优化·orm
L-影13 天前
常见的 ORM 工具
开发语言·数据库·fastapi·orm
李温候13 天前
互联网大厂Java求职者面试全攻略
java·数据库·面试·orm·构建工具·web框架·互联网大厂
L-影13 天前
fastapi中的ORM
数据库·fastapi·orm
在屏幕前出油1 个月前
08. ORM——快速开始
数据库·后端·python·sql·pycharm·orm
曲幽1 个月前
FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了
python·fastapi·web·orm·async·sqlalchemy·sqlmodel·tortoise