论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
大数据
›
数据仓库与分析
›
范畴驱动计划 2
范畴驱动计划 2
数据人与超自然意识
金牌会员
|
2025-1-10 11:35:41
|
显示全部楼层
|
阅读模式
楼主
主题
907
|
帖子
907
|
积分
2721
1.幂等计划
1.1.界说
无论进行多少次类似的操作,结果都保持同等的计划。
1.2.写操作的幂等性
1.2.1.Insert
指定唯一标识写,是具有幂等性的。
不指定唯一标识写,不具备幂等性。
1.2.2.Update
如果更新操作依赖于与汗青状态,则不是幂等的,反之则幂等。
例:
//无论执行多少次 count的值都为1
Update test_table set count = 1 where id = 1;
//count的最终值,取决于执行次数,所以是非幂等的
Update test_table set count = count+1 where id = 1;
复制代码
1.2.3.Delete
删除操作自然幂等,因为删除之后数据就没了,再删一次,数据仍旧没了。
1.3.幂等性计划
1.3.1.唯一索引
通过给每一个操作一个requestId,并将其记录到操作记录表中,保证操作只会实验一次。如:某个操作的requestId为1,当其实验完了,则将其插入操作记录表中。当再次实验该操作时,其requestId在操作记录表中已经存在,则不应再实验该操作。流程如下:
1.3.2.有限状态机
有限状态机(简称状态机),表示有限个状态以及在这些状态之间的转移和动作等举动的模子。
2.范畴事件
范畴事件是聚合内已经发生的究竟,代表聚合内已经发生了业务操作或状态变化。范畴事件通常由聚合根产生,且因该是值对象或贫血对象。
范畴事件可解耦范畴对象之间的耦合度,通过发布事件通知其他对象自身发生了某个事件,取代直接调用。可实现夸聚合的数据同等性。
3.范畴事件发布
例子:
public class ApplicationSevice{
@AutoWired
DoMainService dms;
@AutoWired
DoMainEventPublisher publisher;
public void handleSomeThing(SomeCommand command){
//领域服务完成某项业务,并返回领域事件
List<DomainEvent> eventList = dms.doSomeThing(command);
//推送领域事件
publisher.publish(eventList);
}
}
复制代码
在上述例子中,范畴服务实验完事务后,如果推送范畴时间这一步实验失败,会导致完整的业务流程没有实验成功。
为了解决这个标题,可以将范畴事件长期化并可靠地发布事件。
3.1.范畴事件长期化
例:
public class DomainRepository{
@Resource
EventRepository eventRepository;
@Resource
DataRepository dataRepository;
@Transactional
public void save(Entity entity){
//获取领域事件
List<DomainEvent> events = entity.getEvents();
//将领域事件转换为持久化存储事件
List<Event> eventList = events.stream().map(s->{......}).collect(Collectors.toList());
//持久化领域事件
eventRepository.saveAll(eventList);
//将实体转换为是数据库对应的数据模型
DataModel d = toDataModel(entity);
//持久化数据模型
dataRepository.save(DataModel);
}
}
复制代码
3.2.可靠发布范畴事件
3.2.1.直接发布并赔偿机制
1)范畴服务在实现详细的业务时,应长期化保存范畴事件,并将范畴事件的状态设置为未完成发布。
2)当应用层调用范畴服务完成业务逻辑处理惩罚之后,将范畴服务返回的事件直接发布。
3)事件发布成功后,将数据库中事件状态更新为发布成功。
4)定时使命定时扫描近来一段时间范围内的状态为未发布成功的范畴事件,并将这些事件进行发布,发布成功之后,修改其状态为发布成功。
3.2.2.事物日志拖尾
频仍地轮训数据库可能会对数据库造成压力。此时可以思量接纳事务日志拖尾的方案。事务日志拖尾,指监听数据库的事务日志,以获取增量的新数据,可通过CDC中间件来实现。常见的CDC中间件包括Debezium、Canal、Flink CDC等。
1)范畴服务实验完业务逻辑之后,长期化存储范畴事件。
2)CDC中间件通过监听事务日志,读取到增量的新数据。CDC中间件从数据中剖析失事件,发布到消息队列中。
4.范畴事件订阅
范畴事件订阅需要思量幂等性计划。事件的发布和订阅可通过消息中间件kafka实现。
5.CQRS的概念
CQRS(Command Query Responsibility Segregation)命令查询职责分离架构模式。通过不同的模子实现Command(数据修改)与Query(数据查询)分离。
6.为什么要引入CQRS?
聚合根事是务同等性的边界。开辟者在处理惩罚业务时为了保证业务的准确性,需要完整的加载整个聚合根。而Query操作不一定需要完整的聚合根,可能只需要聚合根的一部门状态,且不会对状态进行修改,此时将完整的聚合根加载到内存中,可能因为读取的数据过多影响性能。所以需要将Query操作与Command操作分脱离来。
在范畴驱动计划的架构中,可以直接在应用层调用底子设施层服务进行查询并返回查询条件,而不用调用范畴模子进行查询。
7.CQRS实现方式
7.1.方法级
一个方法要么实验Command,要么实验Query,不应在Command方法中返回View对象。
7.2.类似数据源CQRS
Command操作处于DDD应用中,Query操作处于三层贫血应用中。
7.3.异构数据源CQRS
数据的Command操作和Query操作可能使用不同的数据源。此时Command的应用仍接纳DDD模子,Query操作可接纳三层贫血模子。但两个数据源之间应存在同步机制,保证数据的同等性。可通过事件发布+赔偿机制或者事务日志拖尾的形式实现。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
数据人与超自然意识
金牌会员
这个人很懒什么都没写!
楼主热帖
4. 事务和锁
kubernetes使用学习(k8s)
【记录】Python爬虫|爬取空间PC版日志 ...
OSPF多区域
渗透测试02
2023团队天梯模拟赛 L2-3 智能护理中心 ...
Java Long类的bitCount()方法具有什么 ...
循序渐进介绍基于CommunityToolkit.Mvv ...
那些年你用过最好的键盘
【 安信可海思Hi-12F模组】AT指令入门 ...
标签云
存储
挺好的
服务器
快速回复
返回顶部
返回列表