作者回复: 谢谢你的建议。等好了告诉你哈。
作者回复: 江湖再见!
作者回复: 就DDD来说,它是没有幂等的方案的,需要我们通过设计来实现。原本想在第20节加一个幂等的议题的。
你可以在不同阶段进行幂等性处理,如使用Token(UUID)、分布式锁、去重表等方式。
可通过Token或全局唯一ID确定请求的唯一性:根据业务生成一个全局唯一ID,在调用接口时会传入该ID,接口提供方会从相应的存储系统比如Redis中去检索这个全局ID是否存在,如果存在则说明该操作已经执行过了,将拒绝本次服务请求;否则将相应该服务请求并将全局ID存入存储系统中,之后包含相同业务ID参数的请求将被拒绝。
可使用Redis分布式锁解决资源并发竞争的情况,获取唯一请求;
可使用去重表保证数据库数据唯一:适用于在业务中有唯一标识的插入场景。比如在支付场景中,一个订单只会支付一次,可以建立一张去重表,将订单ID作为唯一索引。把支付并且写入支付单据到去重表放入一个事务中,这样当出现重复支付时,数据库就会抛出唯一约束异常,操作就会回滚。这样保证了订单只会被支付一次。
作者回复: 谢谢你的耐心陪伴。
作者回复: 正在准备中,等整理好了发出来。
作者回复: 最近比较忙哈,还需要一点时间。等好了告诉你。
作者回复: 谢谢建议。后续考虑考虑。
作者回复: 谢谢,建议来回多看几遍。
作者回复: 马上就有代码详解上新了。
作者回复: 已回复。因为不知道你的聚合是如何得来的,不知是否回答清楚?
作者回复: 战术设计来完成映射。战略主要是领域建模。
作者回复: 这两个聚合实体之间业务行为差异大不?不大的话,我建议你将这两个聚合合并,变成一个领域模型。如果差异实在太大,还是分成两个聚合比较好。如果是三个聚合,三个聚合的实体对象如何聚合在一起?是把公共的实体独立出来吗?
作者回复: 如果用户和订单在一个微服务内,就需要应用服务来协调和校验。如果是微服务之间,可以通过BFF微服务或者各自的应用服务来编排和校验。
作者回复: 再见,有问题咱们还可以探讨。
作者回复: 仓储是专门与数据库打交道的,用于持久化数据。而工厂是用于复杂聚合的实体数据初始化,简单的聚合可以通过聚合根直接在构造函数中完成初始化,而复杂聚合则交给工厂来完成聚合实体数据的初始化,工厂不参与业务逻辑处理。两者差不多是一前一后的关系。
作者回复: 多看几遍,仔细体会和思考,确实是感受到DDD的思想的。
作者回复: 感谢陪伴