干货 | 降低复杂度提升效率,DDD在携程用车/租车订单系统重构中的实践

DDD 实践-消息系统.zip DDD 实践-消息系统 DDD(领域驱动设计)理论结合实践 立即下载

作者简介

小白龙,携程资深后端开发工程师,关注架构落地、研发效能领域。

随着历史业务不断迭代和业务场景越来越复杂,携程用车、租车(简称两车)面临历史技术债和系统复杂度越来越高带来的理解、维护、迭代困难等问题,我们开始寻求如何更有效的降低复杂度和提升效率的方法。

本文描述了两车如何利用DDD(Domain-driven Design,领域驱动设计)方法论降低系统复杂度以及在重构历史系统中的取舍和思考。对于复杂业务场景下的领域驱动设计具有借鉴意义。

一、案例介绍

携程用车订单相关业务包括接送机、包车、打车这些产线,订单相关的功能包括订单状态管理、支付状态管理、供应商订单状态管理、履约状态管理,其中履约状态中包含司机相关状态,完成订单需要将额外费用结清。

携程租车订单相关功能包括订单状态管理、支付状态管理、押金扣款记录、供应商订单状态管理、履约状态管理,其中履约状态主要是取车和还车相关状态。

订单和相关实体如下图所示:

6a0ed3605d6a799693b27097c6f7b148.png

二、问题分析

由于两车业务存在一些差异,为了读者更容易理解,因此将抽取共性问题来说明。

2.1 沟通困难

关于沟通困难,我们发现整个开发过程中,沟通实际上是一个非常消耗时间的事情,需求方需要和产品沟通,产品要和研发人员沟通,研发开发过程中发现一些忽略的细节需要产品确认,来回之间耗费了大量时间。如果是跨团队沟通,这样的问题会更加复杂,以下总结了一些常见的场景:

  • 产品不关心研发的实现,但是觉得需求很简单或者很复杂。

  • 研发开发过程中发现一些忽略的细节需要产品确认,产品要找需求方确认。

  • 历史逻辑没人知道,需求评审的时候无法发现问题,做到最后发现有问题。

  • 跨团队之间不了解对方的业务,需要反复沟通确认。

  • 遇到同一个名词不同的理解导致无效沟通。

  • 一个需求到底该哪个域来实现是我们在实践中经常反复探讨的问题。

  • ...

例如订单和供应商订单在不同的团队内都叫订单,在沟通中针对“订单”的讨论就会产生歧义。

2.2 业务边界不清晰

设计之初,订单被各调用方当作了对外输出的数据源头,数据需求方只要调订单详情即可获取全量数据,这为以后订单的迭代带来了相当大的隐患。订单在自己的业务模型中加入大量不涉及自身业务的冗余字段,在系统的演进过程中,由于无脑插入他方业务字段使得订单自己也要维护相关的逻辑(解释和修改),导致各方对订单的耦合日益加深,导致订单服务的发布变成高风险行为,甚至一个无关订单业务的相关字段修改也可能导致系统故障。

例如订单上关于供应商的相关数据,用户订单有一份,采购订单也有一份,当采购要修改供应商的相关逻辑时要用户订单也一起修改,而用户订单必须排查和推动相关使用到这个字段的业务方切换替代方案。

7b2c4d91c4b65567ed6bb66059ae8cb1.png

2.3 面对业务变化修改困难

随着历史业务迭代,订单中耦合了许多非订单关注的业务逻辑。例如历史上给用户发消息通知是根据用户订单状态变化触发的,由于和通知平台交互,因此订单要提供通知相关的所有参数,等于订单依赖通知相关的模版,明显存在核心依赖非核心的问题。而此时如果我们提出需求,要对于某些通知平台发送失败的消息进行重发,逻辑似乎也只能做到订单上,不论怎么看都很不优雅。

ee2f8c84aee8dbbd30e2fd1ac97b2acc.png

三、解决方案

3.1 回归业务本质——挖掘愿景

为了解决业务归属问题和明确系统发展方向,避免将资源投入那些非核心的功能,我们需要明确当前项目它是什么,目标是什么。因此我们需要为系统准备一份愿景,它将指导我们在未来的迭代中不迷失方向。这个愿景相当于我们的产品定位,是我们的系统和其它系统不同之处,也是当前系统的边界。

fed6b973bcea42d8437663a85eb6cd70.jpeg

愿景就像手电筒中发出的光,在光暗之间是我们系统的边界,系统的未来也在光的方向中。

输出一个愿景说明有很多方式,为了简化落地的门槛,我们采取麦肯锡“电梯演讲”的方式,围绕机会、挑战、优势、劣势给出一组结果,由领域专家和开发团队一起进行头脑风暴,实际上这也是DDD统一语言的开始,我们必须从愿景开始就达成一致。

7f63549bbacf9da6b44f756ef8e781d7.png

友情提醒

Eric Even在他的书中曾提到过一种模式:领域愿景描述(Domain Vision Statement)

“由于一开始项目的模型通常不存在,但是需求是早已定下的重点,为了我们在后续阶段清楚了解系统的价值,以价值作为我们的导向。”

我们在研究领域愿景描述时发现要写出一份合格的文档并不容易,因为它缺乏明确的规范和套路,Eric也只是给了我们几个案例体会,不得不说虽然写出来容易,但是要做到合格还是有门槛的。因此我们退一步,回到Eric说的愿景说明来:“很多项目团队都会编写‘愿景说明’以便管理。最好的愿景说明会展示出应用程序为组织带来的具体价值。”

3.2 高效沟通——利用事件风暴统一语言

dda8c0aab06d85150057b39ab42c5824.png

说到统一语言,最经典的例子应该是传话游戏,一句话从最初的人口中说出,经历中间多人转述,最后可能完全变成另一种意思。

为了快速实现统一语言,我们在订单重构中花了比较多的时间进行事件风暴。事件风暴有以下几点优势:

  • 事件风暴围绕业务流程进行讨论,使在场的每一个人都通过多条流程深入了解业务实体的变化。

  • 事件风暴聚集了“领域专家”,产品、开发、测试等,本质也是一场集合集体智慧的头脑风暴,所有人在事件风暴中达成业务共识。

  • 事件风暴集合了所有人的领域知识,同样是一场领域知识的分享会。

    48f1d326e071ea11bc8be788ab150fe8.png

原本事件风暴是以工作坊的方式在线下组织,这样大家的参与感更强烈。但是由于成本和线上办公的兴起,我们在在线工作坊的实践会更多一些。这里推荐两个工具,一个是行知蜂(BeeArt),另一个是可画(canva),都支持多人在线协作。

事件风暴其实非常简单,就是业务流程+业务用例,将业务流程横向展开,通过用例将业务中的名词状态变化一一列举。其中色块的大小和颜色可以参考www.eventstorming.com,但是我认为只要能够统一大家的认知,颜色是次要的。

经过我们的尝试,先列举业务中单据的状态变化,后补全触发状态变化的动作和角色效率会更高一些。关键是将大家认知中的不同事物相同名词、不同名词相同事物识别出来,利于后续建模。

通过事件风暴,我们主要关注以下几种情况:

  • 沟通中那些脱离当前领域就难以理解的词汇;

  • 相同名词,含义不同的;

  • 名词不同,含义相同的。

将以上三种情况涉及的名词动词总结成统一语言表,特别是第三种情况恰恰是我们划分限界上下文的关键依据。例如我们在聊支付单时发现存在两种支付单,一个是包含我们业务的支付单,它需要记录当前支付的场景并包含一定的业务规则;另一个是支付平台的支付单,每次支付都会生成一个支付单,它可以认为是和更抽象的订单相关(例如会员订单、优惠券订单)。

于是我们提取了费项记录这个概念,表达一笔订单可以有多个费项记录,用于区分我们的支付

单和支付中台的支付单之间的差别。

3.3 自上而下细化边界——子域划分

传统面向过程的开发方法面对复杂系统通常会采用DFD数据流图的方式进行拆分,在DDD中则是提出了子域的概念。我们总是会听到领域(Domain)和子域(Sub Domain),不论是Eric的DDD还是IDDD中都大量使用这些概念,但是我们会发现他们并未向我们解释清楚子域是如何划分而来的。

对于一个已有的系统而言,我们可以根据康威定律得出:团队边界=系统边界,因此可以认为每个团队负责的部分就是天然的子域。由于目前订单团队本就分为用户订单组和采购派发组,因此我们可以初步得出一个领域划分:

a105f4b329e71696fd774415eb5841d1.png

此时我们根据愿景,可以明确两个子域各自的职责:用户订单子域负责提供用户订单流程的查看和管理,并且负责在需要的环节主动通知用户;采购订单子域则负责真正定后履约流程的流转,包括供应商和行前行中行后的状态更新。

最后支付使用的是携程金融的能力,由于支付平台的能力在携程内部是统一的,因此我们认为支付平台属于通用域。

3.4 自下而上抽象概念——限界上下文

领域的概念相对而言还是模糊的,因此Eric提出了DDD中最重要的概念:限界上下文。而限界上下文并非凭空而来,而是需要对我们在事件风暴中得到的名词进行归纳而来。

e88784ddce7c85b098c3ff29b9f10cd1.png

首先我们列举了用户订单域的各种用例,包括下用户单、支付订单、修改订单、取消订单等。

通过建模法归纳模型,例如在订单流程中我们存在多场景的支付,同时又依赖支付平台的支付单,因此我们得到了维护支付单状态的支付费项记录,它既维护了支付单相关的信息,也维护了当前订单系统内关于支付的业务逻辑。

最后我们根据业务相关性对得出的实体进行归纳,结合我们的愿景得出三个上下文,分别是:

  • 用户订单状态上下文:负责管理用户订单状态管理;

  • 支付费项上下文:负责订单支付相关状态管理;

  • 用户通知上下文:负责对用户进行多种方式的通知。

40ab941404563472974a7d1d250c5b0d.png

3.5 挖掘业务变化的瓶颈——上下文依赖关系

实际上限界上下文可以拆到很细的粒度,但是我们应该遵循“奥康姆剃刀”的规则,尽量设置合理的数量,拆分的要有理有据。我们可以先看看原来的系统上下文依赖关系:

020d539a70af61674bb8ddca024458e5.png

根据Eric对上下文关系的总结,我们可以得出消息中心作为携程的消息中台,不会为了某个业务线做特殊逻辑,因此是很明显的遵奉者(Conformist)。此时消息相关的处理耦合在订单内部,如果发送消息没有业务逻辑那么采取防腐层(ACL)的方式是比较常见的。

由于我们已经识别到用户通知存在业务逻辑,因此订单直接和消息中心交互显得奇怪,而且订单作为核心域,本来就应该尽量不依赖其它域,对此我们进行了如下设计:

5090498e9ddf90935e19e70117ec02a8.png

这样用户订单上下文更加内聚,而用户通知也更加易于迭代。

四、收益总结

4.1 业务逻辑耦合降低

通过上下文拆分和职责的明确,由各领域维护自己的数据和领域知识,使得订单不再维护这些字段,而由数据写入的业务方去维护,后续有和订单无关的业务逻辑变更时订单无需改动。

4.2 团队效率提高

随着上下文拆分和康威定律的应用,各团队职责和各自的领域形成映射,过去由于团队职责划分不清,经常为某功能谁做来争论不休的问题也得到了解决。

4.3 性能和稳定性提高

通过上下文拆分后,订单实体从之前的780多个字段简化到200多个字段,大大降低了订单的维护成本,存储数据量减少,原来的业务逻辑也由每个写入方自己进行维护,接口性能p95 写由68ms优化到12ms ,读从63ms降低到5ms。

4.4 数据一致性

由于过去业务方写入数据到订单可能由于网络抖动等原因写入失败或业务方写错数据导致修复数据需要两边一起改,现在业务方将数据存放在自己的领域内,不再存入订单,避免了数据不一致和字段写错等问题的产生。

4.5 人力成本大幅下降

产研沟通涉及的相关方大量减少,链路缩短。刨去原本因为业务逻辑耦合导致订单跟着修改的人力成本,整体人力成本小项目下降70%,大项目更是下降80%。

五、遇到的问题和方案探索

落地DDD实际上是一个非常困难的过程,我们必须面对缺乏领域专家,业务需求多且急,团队对DDD理解不深等诸多问题。对此我们总结出以下几点经验:

5.1 领域专家难寻

领域专家是DDD中最重要的角色之一,没有领域专家我们就无法获取知识,就没有后续的建模等等。但是实际工作中要寻找一个严格意义上的领域专家是困难且成本高昂的,因此我们需要寻求一些其它方式曲线救国,例如该领域的资深研发,资深QA等,同时我们两车还采取互相借鉴的方式,虽然业务不完全相同,但是领域上也有互通之处。

5.2 业务需求多且急

实际工作中我们经常忙于各种业务项目,关键是还很急。这就很容易导致我们没办法专注于DDD改造,怎么办呢?我们的方案是在有时间的时候把方向定下来,提前进行设计,然后在做业务项目时将这些设计逐步进行实现。

5.3 团队对DDD理解不深

为了提高团队对DDD的理解,我们专门成立了DDD培训小组,将我们的一些落地经验整理成规范和最佳实践。同时在落地时由培训小组的同学进行把关,避免大家走弯路。

以上就是此次分享的全部内容,如果后续大家有什么疑问可以在下方留言,如果后续有机会我们会在疑惑较多的点进行再次分享。希望大家通过这篇文章得到一些想要的收获!

【推荐阅读】

7350d4ac252ca8b3145e52b09d73ebca.jpeg

 “携程技术”公众号

  分享,交流,成长

R语言笔记十:独立性检验函数 1.独立性检验函数        独立性检验是根据频数信息判断两类因子彼此相关或相互独立的假设检验。所谓独立性就是指变量之间是独立的,没有关系。 独立性检验算法:卡方检验、Fisher检验、Cochran-Mantel-Haenszel检验 2.假设检验 假设检验(Hypothesis Testing)是数理统计学中根据一定假设条件由样本推断总体的一种方法。 原假设——没有发生 备择假设——发生了 具体做法:根据问题的需要对所研究的总体作 阅读详情

相关推荐

linux 内核vxlan收发包流程

1.vxlan口收包处理流程 前面几章详细介绍了vxlan接口的使用,而且已经知道vxlan是 MAC IN UDP中的封装,因此,在解封装之前,一切按照原有流程走,在此复习一下内核收发包流程(驱动层的数据处理这次不再解析,直接从__netif_receive_skb_core开始) #物理网卡处理中断,触发softirq i40e_intr └─napi_schedule_irqoff #i40e softirq把包放到per cpu backlog,触发softirq i40e_napi_p

魏言华的博客 3826

DDD的创新思想:开发即设计思想

领域驱动设计(DDD)和微服务架构(MSA)近年来非常火热,尤其是在互联网公司的生产实践过程中。微服务架构为互联网公司自身业务的发展壮大提供了技术支撑,日渐显现出解决复杂业务需求的威力。...

qianshanding0708的博客 2684

Geneformer实战:如何用Hugging Face Transformers快速搭建单细胞转录组分类模型

本文详细介绍了如何使用Geneformer和Hugging Face Transformers快速搭建单细胞转录组分类模型。通过环境准备、数据预处理、模型加载与配置、训练Pipeline构建等步骤,帮助读者掌握基于Transformer架构的单细胞数据分析技术,提升分类准确率和效率。

rl6adventurer的博客 605

python爬虫携程用车总结

爬取携程用车信息,用的比较传统的模拟浏览器行为方式,主要用payload进行request请求,一步步获取最后的用车列表 1:缓存清理问题: 根据模拟浏览器行为方式,我们需要从这个页面来选择我们的【租车点】,【租车时间】,【还车时间】,浏览器才能跳转到下一页面,获取下一步的具体租车列表信息。 这里遇到的问题就是通过F12我要根据network中页面请求顺序,...

weixin_41870706的博客 1304

保姆级教程:用Protege 5.5.0从零构建你的第一个知识图谱(附实战案例文件)

本文提供了一份详细的Protege 5.5.0使用指南,从零开始构建知识图谱。通过'中国古代文人关系网'实战案例,涵盖软件安装、本体创建、属性定义、实例填充到高级功能应用的全流程,帮助初学者快速掌握知识建模的核心技能。

weixin_26808205的博客 234

Python量化投资入门教程:从零构建你的第一个交易策略

量化投资教程以数学模型和计算机程序实现超额收益,选用Python工具链完成数据获取、策略构建及回测。通过移动平均线交叉策略示例,展示数据预处理、信号生成、收益计算及可视化全流程,结合收益率、最大回撤和夏普比率评估策略,并建议参数优化与策略融合提升稳健性。

ylmx5201314的博客 2456

实战来了,如何基于DDD实现订单创建?

*** 库存预扣减* @param lockRequest 扣减对象*//*** 获取库存数据*/...这里需要说明的是,由于我们系统中通过自定义OpenFeign的解码器来实现包装对象的自动解码(参见优雅远程调用,微服务中ACL与OpenFeign的绝佳配合),这要求接口必须要有返回值,如果是void的则不会经过解码器处理,无法正确解析业务异常。

竹林幽深 1566

【拯救C盘】一文搞懂Windows修改Anaconda默认的虚拟环境存放路径及其原理

Anaconda创建的虚拟环境可能会默认保存在C盘,但C盘的存储空间很宝贵,由于每个虚拟环境的大小可能达到n个GB,稍不注意就会遇到C盘红色警告。因此有必要做点什么来拯救被虚拟环境占用的大部分空间!!!

Roach007的博客 3万+

DDD下的代码文档生成

一、背景 目前低代码生成领域非常火爆,而且市场价值在逐步上升,很多巨头都在重金投入。低代码的出现意味着程序员可以从大量重复低效的劳动中脱离出来,同时可以更好更快的支持业务解决实际问题,极大的提高了交付价值的效率。那么在DDD中实际上也有一些人尝试使用低代码的方式进行建模,意图将建模过程程序化,自动化,通过模板或者预设脚本得到建模结果。本章内容则重点讨论DDD下的代码文档生成的意义,以及这种思路将带给我们什么启示。 二、观点 2.1 观点1–手动构建 很多研究DDD的人都会遇到这个问题–是否使用低代码来降低建

程序男的专栏 973

AutoDL跑yolo

由于博主在AutoDL的JupyterLab的终端直接上传ZIp文件要么老是再上传中被中断,要么就是上传后使用unzip指令解压显示“找不到”,作为纯小白的我实在太难了!这个文件列出了一个 Python 项目所需的所有依赖包及其精确的版本号。这个文件是 Python 项目中常见的一种方式,用于确保项目在不同环境中都能以相同的依赖包配置运行。3.进入JupyterLab,在文件夹目录中找到上传的文件夹,右键点击“复制路径”。然后在终端中输入以下指令进行切换到该文件夹路径。9.安装成功后开始输入指令开跑!

m0_73804659的博客 1206

使用Simulink进行无刷电机霍尔传感器信号处理电路的仿真

位置检测:霍尔传感器可以检测转子的位置,这对于实现无刷电机的电子换向至关重要。提高效率:通过准确的位置信息,可以优化电机的工作状态,提高效率和性能。通过上述步骤,我们简要介绍了如何基于Simulink实现无刷电机霍尔传感器信号处理电路的仿真。

MHD0815的博客 432

日流量200亿,聊聊携程网关的架构设计

大家好,我是不才陈某~本文目录- 说在前面- 日流量200亿,携程网关的架构设计- 一、概述- 二、高性能网关核心设计- 2.1. 异步流程设计- 2.2. 流式转发&单线程- 2.3 其他优化- 三、网关业务形态- 四、网关治理- 4.1 多协议兼容- 4.2 路由模块- 4.3 模块编排- 五、总结- 说在最后:有问题可以找老架构取经- 部分历史案例日流量200亿,携程网关的架构设计方...

码猿技术专栏 1095

YOLOv8多传感器融合技术——毫米波雷达融合技术详解

本文介绍了YOLOv8与毫米波雷达融合技术在自动驾驶系统中的应用。毫米波雷达具有全天候工作、测距测速精准等优势,但存在分辨率低等局限。通过融合YOLOv8的视觉检测能力,可显著提升系统在恶劣环境下的感知性能。文章详细阐述了融合实现方法,包括雷达数据处理、目标投影匹配、置信度融合等关键技术,并提供了评估指标和应用场景分析。这种多传感器融合方案能有效弥补单一传感器的不足,为自动驾驶提供更可靠的环境感知能力,是实现高级别自动驾驶的重要技术支撑。

u010117029的博客 175

干货 | 用DDD(领域驱动设计)和ADT(代数数据类型)提升代码质量

作者简介工业聚,携程高级前端开发专家,react-lite, react-imvc, farrow 等开源项目作者。很多开发者都有一个迷思,认为项目里的代码质量和可维护性的持续下降,主要...

携程技术 1229

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

DDD领域驱动设计内容分享(十五):从携程订单系统重构,看DDD的巨大价值

携程用车订单业务包括接送机、包车、打车等产线,涉及订单状态管理、支付状态管理、供应商订单状态管理、履约状态管理等功能。履约状态关乎司机相关状态,完成订单需结清额外费用。携程租车订单业务涵盖订单状态管理、支付状态管理、押金扣除记录、供应商订单状态管理、履约状态管理等功能。履约状态主要涉及取还车相关状态。通过划分上下文和明确职责,各个领域负责自己的数据和领域知识。这样一来,订单不再涉及这些字段,而是由数据写入的业务方负责维护。因此,在后续与订单无关的业务逻辑发生变化时,订单无需进行修改。

之乎者也·的博客 1136

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

领域驱动设计(DDD)四 订单管理系统实践步骤

以下是基于的订单管理系统实践步骤,系统功能主要包括订单的创建、更新、查询和状态管理,采用框架进行实现。

空 872

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

DDD战术设计实践

在笔者学习 DDD 的过程中,大部分文章通常都是在谈 DDD 的概念,理论,诚然这些很重要,但 DDD 的读者大多还是习惯与传统开发的方式,而 DDD 的思想与传统开发模式大为不同,当大量的理论铺面而来的时候,难免觉得无从着力,本系列文章希望通过一个实际系统的 DDD 案例,让读者对 DDD 的落地有一定的认识,认识的同时也会产生新的疑问,带着这些疑问在回头去学习 DDD 的系统理论,相信能够对读者起到帮助。 DDD概览 此章节希望读者对DDD有一些基本概念,在本章中不会深入到具体概念的细节,在《实现领域驱

dasdaxexw的博客 839

DDD(七)【领域事件应用篇(订单处理变得更清晰)】

上一讲主要说了领域事件和领域总线,这并不是一个很容易理解的文章,所以本讲实例篇主要是为了补充上一讲的理论知识,本讲实例关注的是实际中的订单处理模块,我们知道,订单处理是电子商务的核心,往往在这里面,会有很多逻辑,在开发时,给我们带来了不少的难度,如何更好的分离关注点,是本讲的主题;本讲主要是修改订单状态后,为用户发通知为例,来以此更好的说一下领域事件在实际中的作用。 前言 领域事件使用的设计模式是发布/订阅模式,或者叫观察者模式。 一 订单的几种状态,在订单进入到其中一些状态时,需要通知用户   publi

极客神殿 993

关于系统架构你不知道的那些事-架构设计流程:识别复杂度

关于系统架构你不知道的那些事-架构设计流程:识别复杂度前言架构设计第 1 步:识别复杂度识别复杂度实战这个消息队列是否需要高性能这个消息队列是否需要高可用性这个消息队列是否需要高可扩展性小结 前言 接下来将用四篇文章来介绍实践中如何进行架构设计。结合复杂度来源和架构设计原则,通过模拟的设计场景“前浪微博”讲解架构设计流程。这篇介绍架构设计流程的第一步:识别复杂度。 架构设计第 1 步:识别复杂度 前面介绍过,架构设计的本质目的是为了解决软件系统的复杂性,所以在我们设计架构时,首先就要分析系统的复杂性。只

轻狂书生FS的博客 2180

关于架构的思考之三:系统复杂度的来源(可扩展性、低成本、安全和规模)

目录 可扩展性 定义: how: 预测变化的复杂性源头: 在准确预测变化的前提下,如何应对? 两个主要的复杂性相关的问题 1系统需要拆分出变化层和稳定层 2. 需要设计变化层和稳定层之间的接口 低成本 安全 1. 功能安全 2. 架构安全 规模 1. 功能越来越多,导致系统复杂度指数级上升 2. 数据越来越多,系统复杂度发生质变 可扩展性 定义: 可扩展性指系...

haponchang的博客 1907

结合电商支付业务一文搞懂 DDD

2004 年,软件大师 Eric Evans 的不朽著作《领域驱动设计:软件核心复杂性应对之道》面世,从书名可以看出,这是一本应对软件系统越来越复杂的方法论的图书。然而,在当时,中国的软件业才刚刚起步,软件系统还没有那么复杂,即使维护了几年,软件退化了,不好维护了,推倒重新开发就好了。因此,在过去的那么多年里,真正运用领域驱动设计开发(DDD)的团队并不多。一套优秀的方法论,因为现实阶.

骏马逸动,心随你动的博客 1417

DDD实战进阶第一波(十二):开发一般业务的大健康行业直销系统(订单上下文POCO模型)...

在本系列前面的文章中,我们主要讨论了产品上下文与经销商上下文相关的实现,大家对DDD的方法与架构已经有了初步的了解。 但是在这两个界限上下文中,业务逻辑很简单,也没有用到更多的值对象的内容。从这篇文章开始,我们来讲讲订单界限上下文实现的内容, 里面的业务逻辑相对复杂一些,而且有大量值对象的引入来进行逻辑的处理。 订单上下文的需求主要是生成相应的订单项,每个订单项中有相关的订单产品和购买数量并...

weixin_30678821的博客 336

领域驱动设计DDD实战进阶第一波(十):订单上下文领域逻辑、订单上下文应用服务用例与接口...

DDD实战进阶第一波(十):开发一般业务的大健康行业直销系统(订单上下文领域逻辑) 前一篇文章主要讲了订单上下文的POCO模型,其中订单与订单项中有大量的值对象。这篇文章主要讲讲这些值对象以及订单项、订单相关的领域逻辑。 1.ProductSKUs值对象领域逻辑: ProductSKUs...

chuhe0321的专栏 1314

DDD:订单管理 之 如何组织代码

背景 系统开发最难的是职责的合理分配,或者叫:“如何合理的组织代码”,今天说一个关于这方面问题的示例,希望大家多批评。 示例背景 参考数据字典 需求 OrderCode必须唯一。 Total = Sum(Subtotal)。 订单有三种状态:【未提交】、【待审核】和【已审核】,合理的状态迁移有:【未提交】----》【待审核】和【待审核】----》【已审核】,只有处于【未提交】...

weixin_33858485的博客 320

DDD 实战 (3):整体工作框架和全局需求分析

DDD 本质上是个“软件设计”方法论,它指导的是“怎么做软件设计”。故在正式开始“群买菜”的软件设计之前,我们先对 DDD 整体方法论做一个简单的、从我个人角度理解的介绍。

hangsun的博客 5417

RPA应用场景-租车公司订单系统管理

场景概述 租车公司订单系统管理 所涉系统名称 各个旅行预约网站 人工操作(时间/次) 8小时 所涉人工数量 1 操作频率 不定时 场景流程 1、在各个旅行预约网站上搜寻并接受订单 2、从管理页面逐一筛选、打印出订单信息 3、将订单内容输入到核心系统中 归属行业 物流 效率提升ROI 每日节省6小时 文章来源:http://rpazj.com 作者:RPA之家 ...

liutao261311的博客 375
上一篇: 干货 | 日均报错量降低95%,携程小程序生态之自动化错误预警方案
下一篇: 干货 | 携程小程序内嵌webview实践指南
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值