一个电商供应链系统的DDD实战

  • 可用库存:仓库实物库存 - 占用库存

  • 实物库存:仓库中的实际库存数

  • 在途库存:已采购未入库库存数

  • 冻结库存:因秒杀等促销活动或仓间调拨等预占的库存数

梳理清楚之后,关于 DDD 架构选型也是要重点考虑的内容:

  • 梳理领域模型与非领域模型之间关系 - 六边形架构

c40c9331f984e6eb304742d809b7e212.png

  • 保证核心领域模型的稳定性

  • 分层设计采用依赖倒置原则,保证核心领域模型的稳定性,领域层不依赖任何其他层,底层服务可以依赖高层服务所提供的接口。

829ff46e84a7ba8dfb70e22228d0a35c.png

  • 防止定制化查询腐化领域模型

我们通过引入 CQRS 模式,隔离命令与查询领域模型。

b15e2095c836ba23b7e9531e8f24e38e.png

    • 防止与其他限界上下文交互导致领域模型腐化

如下图所示采购上下文通过防腐层 (ACL) 将仓储库存核心上下文中的仓库信息映射为自身上下文中的仓库值对象,防止仓库信息依赖腐化。

7c481b4b13e42849624ed2646019ab2e.png

  • 架构最终落地 -COLA

646e6b2ae582f01d1b103588dd66292e.png

  • 库存变更场景相关单据状态一致性保障

从库存变更场景中,可以看到围绕库存变更在不同的业务层存在不同的业务单据,上层业务层单据状态变更依赖底层仓储核心单据状态变更,如采购入库单入库状态变更为入库完成则采购单状态也会变更为已完成,如销售出库单状态变更为出库完成则销售发货单状态会变更为已发货。

另外,如果您正在学习Spring Cloud,推荐一个连载多年还在继续更新的免费教程:https://blog.didispace.com/spring-cloud-learning/

    • 方案选择

e3681700500193ea00254d73d4bd1380.png

最终我们采用 EventStore 方案,使用 EventStore 数据流程如下:

7fa712933d583f26c05b0fed4fe6b7c5.png

上图中黄色部分为领域事件异常处理。

  • 发布领域事件代码如下:

a60d355f851127bddc8da3a57b180700.png

bfb40bc4ce0ed436b7cd8e6a80d302d1.png

1f8741d7fee429343a8d465f98c9e253.png

  • 订阅领域事件

  • 注册订阅组

745488f3ce83e09df19e0d14d9ccb736.png

    • 在订阅组中声明订阅事件

c8c731c2bc732c44457a1db265ee4915.png

  • 在持续集成开发过程中如何同时保障效率和质量 - 单元测试保驾护航

  • 核心领域模型添加单元测试,对应 Domain 测试

  • 核心业务接口场景添加单元测试,对应 CmdExe 测试

  • 引入 Mockito 库,mock 相关接口和数据,验证流程环节是否正确

  • 在单测代码中造单测相关数据,保证单测数据可靠性

  • 单测采用 H2 数据库,避免测试过后留痕,影响后续单测,同时提升单测执行效率

  • 减少或不依赖其他中间件,如 Dubbo、Kafka 等,如依赖可考虑直接 Mock

  • git push 后 CI 开启自动单元测试

最终,回顾这次改造工作,我认为收益可以分为五点:

  • 实际库存准确,彻底解决仓库库存不准问题,同时为校准销售库存提供基准参考;

  • 功能扩展方便,如后续快速对接财务系统;

  • 快速定位问题(代码结构清晰,库存变更有据可查且上下文清晰);

  • 沉淀出较通用的事件组件 EventStore,后续在 Keep 电商内部快速推广复用;

  • 沉淀出一套比较成熟的 DDD 最佳实践,后续快速推广至 Keep 电商库存系统重构、售后重构。

可以看出,收益还是非常喜人的。大部分同学关注 DDD 是因为微服务,没错,DDD 可以说是与微服务天生互补的,DDD 领域面向划分业务模型边界,微服务面向将单体架构拆分为多个微服务,至于如何拆微服务,DDD 领域拆分则是一个非常好的微服务拆分方式。

欢迎关于 DDD,如果你想进一步交流探讨,也可以在本文下留言,期待大家的分享能够带来更多的启发。

作者介绍

武清明,从业 12 年,近 8 年一直在互联网电商行业一线从事系统研发,之前在京东和万达电商负责过仓储系统、订单系统、促销系统等研发工作。目前在 Keep 负责商业化业务中台研发和规划工作。擅长电商业务系统架构设计,采用 DDD 合理简单化设计复杂电商系统,提升系统功能模块的复用性和扩展性。

往期推荐

JWT 应该保存在哪里?

一个月薪 12000 的北京程序员的真实生活

一文带你入门 JMeter 性能测试!

程序员的“鱿鱼游戏”,你能活到第几关?

大名鼎鼎的 OceanBase 居然在买Star !?


084dd1b804aa91fe01eb6d1871c1c46b.png技术交流群f84d65ed293f7d63ebecc805c4bcdfe6.png
最近有很多人问,有没有读者交流群,想知道怎么加入。加入方式很简单,有兴趣的同学,只需要点击下方卡片,回复“加群“,即可免费加入我们的高质量技术交流群!
点击阅读原文,送你免费Spring Boot教程!

如何快速更新自己的技术积累?

  • 在现有的项目里,深挖技术,比如用到netty可以把相关底层代码和要点都看起来。
  • 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。
  • 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
  • 学习以后不知道有没有学成,则可以通过面试去检验。

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

八年CRUD,疫情备战三个月,三面头条、四面阿里拿offer面经分享

力方向,就看自己的领导或公司里技术强的人在学什么。

  • 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。
  • 学习以后不知道有没有学成,则可以通过面试去检验。

我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!

以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目

[外链图片转存中…(img-QoMiAPsR-1721166338552)]

[外链图片转存中…(img-iCC5Kjro-1721166338553)]

  • 30
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值