任何一套业务架构都可能存在一定的历史问题,这是业务在不同阶段做技术选型必然出现的状况,如何用新的、合适的架构思想做恰到好处地改造,则是架构师们的必备能力。

今天的主角是供应链系统,又被称为进销存系统。这个系统主要是针对采购(进)—>入库(存)—>销售(销)动态链条的管理系统,核心能力是管理仓库货物库存,在电商体系中起到承上启下的作用,下图中的 Skynet 系统和 ERP 系统分别扮演着供应链系统的核心角色,负责订单发货、售后退货、采购补货、仓间调拨以及特殊出入库等核心流程。

Skynet 系统和 ERP 系统作为元老级系统,自 Keep 开启电商赛道时开始建设,经过多年需求快速迭代,期间系统包袱越来越重,运营过程中的问题也越来越多。供应链系统相对于 Keep 电商业务发展明显滞后,甚至有可能进一步阻碍 Keep 电商业务发展,而当时的供应链系统因缺乏系统性规划、代码缺少规范,导致这个元老级系统积重难返。当时面临的主要问题如下:

  • 系统边界不清晰

  • 架构混乱,系统内部分层不清晰

    • 越来越模糊 usecase,导致代码边界和事务不清晰;

    • 层后各层职责和接口职责不清晰,导致接口依赖混乱,甚至出现循环依赖。

  • 库存不准,库存变更上下文不清晰

    • 库存不准,超卖甚至少卖情况频繁

    • 库存变更日志不规范,上下文不清晰,出现库存问题时,查找原因困难重重

    • 库存与库存变更日志无法自证正确

业务新要求

  • 店铺库存分配自动化

  • 智能采购

  • 库存准确率保障

  • 履约率保障

  • 提升运营效率

种种问题重压,在老系统上修改已无法根除系统问题,且无法满足未来业务发展需求,导致供应链系统正式提上日程。

重构思路主要包括三大类梳理,分别是:

  • 梳理库存业务场景

  • 梳理限界上下文

  • 梳理库存模型

占用库存:已售卖未出库库存数

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

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

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

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

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

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

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

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

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

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

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

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

  • 架构最终落地 -COLA

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

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

  • 方案选择

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

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

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

  • 订阅领域事件

注册订阅组

在订阅组中声明订阅事件

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

作者介绍

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

出处:https://blog.csdn.net/zhipengfang/article/details/120500445

END

架构技术交流群

 「架构君」建立了读者群,可以添加我微信拉你进群

添加时可以备注城市+职位+年限】

往期推荐

一款神仙接私活儿软件,吊到不行!

架构之道:分离业务逻辑和技术细节

一份完整的聚合支付中心设计方案!

唯品会亿级数据服务平台落地实践

从朋友那里搞了 20 个实战项目,速领!

系统架构设计:平滑发布和ABTesting

重要提醒!人脸识别一定要穿上衣服!

图解 Git,一目了然!

厉害了!单点登录系统用 8 张漫画就解释了。。。

基于 SpringBoot 的仿豆瓣平台【源码分享】

如有收获,点个在看,诚挚感谢

电商供应链系统的DDD架构设计实战相关推荐

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

    欢迎关注方志朋的博客,回复"666"获面试宝典 作者 | 武清明 编辑 | 王一鹏 任何一套业务架构都可能存在一定的历史问题,这是业务在不同阶段做技术选型必然出现的状况,如何用新的 ...

  2. Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析

    Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...

  3. 跨境电商供应链系统:轻松统筹管理进出口跨境电商系统

    做好跨境电商供应链系统平台需要拥有全局系统性思维,即是由上到下的项目管理.业务流程管理.商业模式管理.人员配置管理等,其中重要在于跨境电商网站的供应链采购管理模式上.跨境供应链电商采购包括战略规划,需 ...

  4. Java生鲜电商平台-商品中心的架构设计与源码解析(小程序/APP)

    Java生鲜电商平台-商品中心的架构设计与源码解析(小程序/APP) 说明:Java生鲜电商平台中,由于商品的架构很大程度决定了电商的扩展性与伸缩性.对此根据自己多年的生鲜电商经验,整理了以下的商品中 ...

  5. 化妆品电商供应链系统解决方案:美妆化妆品品牌供应链质量管理、产品定位

    美妆化妆品作为快消品行业的主要支柱之一,即便是在疫情期间短期受开工延迟影响,生产端反应迟缓,中期化妆品供求可能出现断层增速放缓,但整个化妆品电商市场很快在复苏中恢复.保持稳定的增长趋势.伴随化妆品市场 ...

  6. B2C电商供应链系统:疫情过后电商企业的增长生命线!

    疫情战役尚未结束,传统电商.线下餐饮.百货.汽车.旅游.休闲娱乐等行业严重受疫情影响,"现金流"承受了最大的伤害.而这次疫情也推动了互联网行业的进一步发展.传统企业要在这次灾难中& ...

  7. Java生鲜电商平台-商品基础业务架构设计-商品设计

    Java生鲜电商平台-商品基础业务架构设计-商品设计 在生鲜电商的商品中心,在电子商务公司一般是后台管理商品的地方.在前端而言,是商家为了展示商品信息给用户的地方,它是承担了商品的数据,订单,营销活动 ...

  8. 跨境进出口电商供应链系统模式以及痛点

    一般的电子商务网站供应链涉及供应商.厂家.分销行业.零售行业.以及物流行业,而当中电商供应链就包括了物流.商流.信息流.资金流这四个,跨境电商供应链系统主要涵盖物流.资金流方面,包括了供应商.物流以及 ...

  9. Java生鲜电商平台-用户管理的架构与实战

    Java生鲜电商平台-用户管理的架构与实战 在电商后台中,用户管理是运营人员管理用户的模块.这里的用户区别于运营人员,会在权限的角色管理中分别阐述.这里的用户包含平台的一般用户,会员用户等.本文将分享 ...

  10. 可用性高达5个9!支付系统高可用架构设计实战

    可用性高达5个9!支付系统高可用架构设计实战 一.背景 对于互联网应用和企业大型应用而言,多数都尽可能地要求做到7*24小时不间断运行,而要做到完全不间断运行可以说"难于上青天". ...

最新文章

  1. r语言 bsda包_使用R语言creditmodel包进行Vintage分析或留存率分析
  2. 一天之内用SDN能做出什么
  3. poj2739(尺取法+质数筛)
  4. SSH配置优化和慢的解决方法
  5. android listview 横向滚动,Android支持水平滚动的ListView控件
  6. totolink 异地组网
  7. Jaeger插件开发及背后的思考
  8. java小写金额转大写工具类
  9. 损失 18 万,获刑 7 年,又又又是程序员删库!
  10. 计算机安全中心无法启动,电脑无法启动windows安全中心服务怎么办?
  11. mysql 创建同义词_Oracle synonym 同义词创建与删除
  12. 同一个服务器装oracle,windows下同一台服务器上装有两个ORACLE数据库实例,通过命令启停数据库...
  13. html 防网页假死,htmlweb开发:防止浏览器假死的方法.doc
  14. 网上流行的护眼背景对照码,十六进制,RGB值
  15. ElasticSearch 之 Linux 安装 ElasticSearch-7.15.2(ELK、IK)
  16. 超声成像_人工智能如何帮助转变医学超声成像
  17. vue之vue的生命周期、swiper、自定义组件的封装、自定义指令、过滤器、单文件组件及vue-cli
  18. 基于普中A2实验板,ds18b20温度传感器与ds1302时钟芯片的冲突现象的探讨
  19. 极客大挑战2019php,[极客大挑战 2019]PHP
  20. Java中文编程开发,让Java编写更加容易

热门文章

  1. Acwing 1402.星空之夜
  2. 案例|工业物联网解决方案·智慧钢厂高性能安全数采
  3. 阿里P7级别面试经验总结,最全Android知识总结
  4. 球面绘制六边形——二维平面坐标转成三维球面坐标
  5. 大地测量球面坐标BLH三个字母的由来含义
  6. 正常图片转灰色图片——灰度图
  7. ACL——拒绝源地址
  8. flutter大小单位:dp
  9. salt 安装kubernetes集群3节点
  10. Synchronized实现原理