DDD领域驱动设计,落实设想中遇到的并发更新问题?

想要构建一个分布式的微服务应用集群

服务假设

Aggregate Root——Activity
存在一些基本属性。id,name,properties……
存在一个List类型的ValueObject participantList。Activity参与人列表。

有业务

// 修改基本信息
modifyBasicInfomation(BasicInfoCommand cmd);
// 更新参与人。包括成员参与,管理员更新。
// 类似银行余额,不允许第二类更新丢失。
updateParticipants(ParticipantsCommand cmd);

并发更新

在repository的实现为了避免更新丢失,有几种方法

Activity全局加乐观锁,以version属性作版本号

示例代码

val activity = repository.findByid("id123456");
activity.doBusinessService("params");
repository.save(activity);

代价是锁粒度大,冲突多。而且完全不相关的业务一样会因为锁而失败。

respository增加单独更新方法,业务穿层。

示例代码

val activity = repository.findByid("id
123456");
activity.doBusinessService("params");
respository.casXX(activity);

respository注入领域对象。

示例代码

val activity = repository.findByid("id
123456"); // inject repository
activity.doBusinessService("params");

分离领域对象?

或许我没完全了解到领域驱动设计。在学习理论觉得该设计非常优秀,然而看完在思考一些案例时候,似乎找不到一个正确的落地模式。

阅读 2.3k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题