.net 实现 CQRS 的一个设想

[复制链接]
发表于 2025-6-11 16:39:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、先总结一下以前的经验
本人前公司项目开发根本算是CQRS的,但是有些繁琐
后台和数据接口用.net(后大部门转java),前台nodejs
数据统计用hive,hive每天凌晨同步数据
但是涉及列表含含糊搜索根本都是交给站内搜索团队,他们用Lucene,搜索每天抓取全量数据,定时(比如5分钟)抓取增量数据
遇到的题目主要有两个:
1. 数据库负载题目
很多系统需要雷同数据库的数据,导致死锁、io高负载
DBA弄很多从库,有时又出现数据同步延时和数据不一致题目
2. 数据不一致不及时题目
后台、接口、搜索、统计、中转接口的数据有时出现不一致
有些数据还是T+1或者T+2的统计数据
其中极少数是多从库数据不一致和多个“雷同功能”逻辑不一致
大部门还是多级缓存的题目
每个程序为了包管可用性,或多或少都本身做了缓存处理
打接口查题目,清缓存都是家常便饭
 
二、现在也有很多.net开源的DDD和CQRS框架
原理也很简单,把已经发生的事情包装为事件(一般用MQ),其他关联系统订阅事件
关联系统需要什么数据就要联系对方提供对应的事件,可能需要开发排期,需要更高层次的领导协调,有时也是苦不堪言
订阅事件写数据同步逻辑大部门都没有啥技能含量,程序员写起来很不爽,觉得数据同步的事情交给DBA就可以了
 
三、为此本人有个设想使用ShadowSql来简化这个过程
比如用mysql存储业务原始数据、es用来做前端展示、hive做数据挖掘
ShadowSql做添加、修改、删除都继承IExecuteSql接口
业务系统执行sql成功后把IExecuteSql对方发送到队列,相称于是mysql的binlog(ShadowSql支持多种数据库,这里只是拿mysql举例,其他数据库也是可以的)
由于ShadowSql支持多种数据库,也可以扩展来支持es和hive等
其他关联系统订阅队列,就可以直接执行sql了
当然这最好有个条件,主键、Id等最好不要用数据库的自增列,否则可能导致不一致
业务要用的字段最好也别用数据库默认值规则产生(比如添加、修改时间等)或触发器修改
当然也是有少部门逻辑不能通过简单数据同步来实现,特例只能程序员写代码了
我信赖通过IExecuteSql对象来同步数据库可以办理80%+的题目
 
以上只是设想,ShadowSql暂时还不支持es和hive,为了方便消息处理IExecuteSql对象ShadowSql逻辑可能还需要调整
 
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表