首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >7Fresh系统快速构建之路——DDD领域驱动设计实践

7Fresh系统快速构建之路——DDD领域驱动设计实践

作者头像
京东技术
发布于 2018-06-20 09:42:03
发布于 2018-06-20 09:42:03
1.5K0
举报
文章被收录于专栏:京东技术京东技术

7Fresh是京东第一个线上线下融合落地的零售创新业务模式,店内有大量设备的集成,设备供应商达50多家,针对线下业务的特点,团队独立规划和设计POS收银系统、店内生产系统、加工系统、货架陈列系统、魔镜系统、餐饮系统、自助收银系统等共60多个系统,对接电子价签、电子秤、包装机、无人购物车、门店客流检测等几十种设备。

第一期上线40多个系统,后续又高效上线了其他新增20个系统,短时间内完成了别人口中不可能完成的神话。

【京东技术沙龙】是由企业信息化部/京东大学技术学院联合京东集团各技术体系共同举办,针对京东研发内部,每月1期,分享前沿技术成果及热点话题。建立“技术交流平台”、促进“技术资源共享”、解决“工作痛点”。

经过小编的整理和7Fresh架构师团队的修订后,为大家呈现,带您一同回顾7Fresh系统从0到1的快速构建之路!

01

系统构建历程

7Fresh与京东商城一样拥有一整套的交易系统、一键结算系统,但和线上不一样的是,我们还有很多线下系统,店内的生产、加工、库存管理、餐饮等等。

整个项目从产品调研、架构设计,到第一期上线经过了2个半月的开发。第一期就有40多个系统同时上线,基本能把所有的业务系统运行跑通,之后又增加了很多餐饮类,地推类和线下有关的新需求,现在也依然在落地新的需求中。

02

快速开发的主要原因

1、用DDD进行战略设计

  • 分治
  • 界限上下文内的技术无关的通用语言
  • 薄薄的技术集成层隔离业务变化

2、虚拟组织保障设计落地

  • 早期组成虚拟的架构师组织,后期产品也加入
  • 不断摸索方法论和原则

3、其他因素

  • 多团队协同包括成都、武汉、技术拓展等部门
  • 框架和组件积累,之前积累的pop-spring-boot和popdesign及脚手架
  • 业务团队的大量参与,与业务开展同步进行

03

我们对DDD的理解

1、首先是战略部分,这也是我们认为实施比较好的部分:

(1)划分和集成界限上下文。

这个虽然不是技术上的问题,但是最关键的还是对业务的理解,跟部门业务专家一起工作很重要,另外是参考了京东现有的情报,做了很多的改进。怎么把系统进行解耦,这个领域边界界定以后,首先上下文最重要的是界定通用语言,就是在一个上下文里边有一套完整明确的概念:

一个店就相当于一个仓,WMS开始设计的时候概念方式是管理统一SKU。而我们线下店有做蛋糕、做餐饮这些场景,加工的原材料也应该在系统里,WMS如果强绑定销售商品的SKu的话,那我们线下店就没法管理了。

所以,经验就是不能把一个概念应用超出上下文界定的领域,这样做的好处就是,通过这种方式隔离一些变化,适应更多的场景,实现解耦。

(2)面向服务集成而不要面向数据集成

如果这样的话就能解耦了吗?

随着一些新需求的推进,还是发现里边有些耦合存在。总结的经验就是:下游的系统应该对需求做抽象,提出自己的标准,这样才能实现解耦。做DDD领域设计的时候,不应该受到具体架构风格、模式的影响,不管是微服务的还是单体加模块化的风格,最终的效果应该都是一样的,界限分明。

(3)技术无关地考虑领域模型,比如使用类图,定义和功能场景甚至状态图和对象快照。

2、使用DDD进行战略设计相对容易落地,收益明显。在使用DDD进行战术设计却遇到了重重困难。

战术部分在落实到代码层面遇到了困难。看过业内关于DDD的分享,发现其实大家能把战术层面把DDD落地的,其实都做的不理想。以下是我们对战术层面上的理解:

(1)代码即设计

代码即设计,在代码中尽量表现出想要的设计意图和领域意图,但是像性能这类的属性很难表现出来,能够实现但却不能表现意图。而领域设计是比较能在代码层面表现出来的。

难点一:聚合根识别困难

难点二:贫血模式。基本我们的框架和思路,很机械式的编码和设计,很难实现上述的目标;

难点三:按DDD的理论,聚合根之间不赞成使用数据库事务,成本很高。

(2)用包来体现实体概念

左图中间的部分就是领域模型,这也是现在比较通用的方式,领域模型包括领域对象、领域服务,领域对象总是要被存储的,这就需要依赖于仓库,仓库在领域下应该是个接口,我们认为领域应该依赖于技术实现,存储的实现应该在另外一个包下,通过依赖倒置的方式,把领域模型包含的东西和基础设施层分隔。

(3)订单状态变更的例子

现在有很多不同类型不同场景产生的订单,它们之间的状态变更是不同的,从未支付到已支付再到在拣货,当中有很多状态是不一样的。如下:

从设计层面可以划分不同的状态设计,但是最后状态无非是当前状态,编码实现上就目前来看,写在service层到处都是判断……,来一个新业务就要改一次新判断,但是我们现在从构思想,简单来说先把它放在order对象里,因为这只跟order的数据有关系。

从集成的角度来说,如果支付系统接收到支付完成的消息,我们把消息payevent变成一个事件,传给了orderservice-changestate,orderservice里边非常简单,把order从仓库里边加载出来,然后调动方法即可。

大部分业务里的规则还是在orderchangestate方法里。这么做的好处就是,它能够表达出我想要的设计意图,如果分散在其中的话,可能只与设计文档不一致。

第二个就是说,把领域规则识别出来放在对象中会带来额外的好处是,领域规则往往跟外部是没有关系的,很容易做纯粹的自动化的单元测试

(4)数据一致性和领域事件

一个微服务内部的多个聚合根,可以使用数据库事务保证数据一致性,虽然不完美,但还算实用。用领域事件去做最终一致性成本太高。

两个上下文之间用MQ做最终一致性

京东技术 ∣关注技术的公众号

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 京东技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大家一直在谈的领域驱动设计(DDD),我们在互联网业务系统是这么实践的
前言 至少30年以前,一些软件设计人员就已经意识到领域建模和设计的重要性,并形成一种思潮,Eric Evans将其定义为领域驱动设计(Domain-Driven Design,简称DDD)。在互联网开发“小步快跑,迭代试错”的大环境下,DDD似乎是一种比较“古老而缓慢”的思想。 然而,由于互联网公司也逐渐深入实体经济,业务日益复杂,我们在开发中也越来越多地遇到传统行业软件开发中所面临的问题。本文就先来讲一下这些问题,然后再尝试在实践中用DDD的思想来解决这些问题。 问题 过度耦合 业务初期,我们的功能大都
美团技术团队
2018/03/13
2.6K0
大家一直在谈的领域驱动设计(DDD),我们在互联网业务系统是这么实践的
DDD 领域驱动设计落地实践:六步拆解 DDD
相信通过前面几篇文章的介绍,大家对于 DDD 的相关理论以及实践的套路有了一定的理解,但是理解 DDD 理论和实践手段是一回事,能不能把这些理论知识实际应用到我们实际工作中又是另外一回事,因此本文通过实际的业务分析把之前文章中涉及的理论和手段全部带着大家走一遍,我想通过这种方式,让大家实际的感受下 DDD 落地过程中会遇到哪些问题以及我们应该怎样去解决这些问题。
慕枫技术笔记
2023/03/20
1K0
DDD 领域驱动设计落地实践:六步拆解 DDD
领域驱动设计DDD在B端营销系统的实践
本文整理自美团技术沙龙第73期《基于领域驱动设计(DDD)的架构演进和实践》,系统复杂性根源于隐晦(难理解),耦合(难改动)和变化(难扩展),DDD正是应对系统复杂性的重要方法。本文针对B端营销系统设计中的复杂性,从战略设计,战术设计到代码架构,详细介绍了DDD在各个阶段的实践,期望为大家提供一些可供参考和借鉴的思路。
美团技术团队
2024/06/03
4150
领域驱动设计DDD在B端营销系统的实践
对DDD(领域驱动设计)分层架构的理解(适合新人)
目前团队大多数项目都是基于DDD分层架构开发的,而不是传统的MVC模式,这就让很多之前没有接触过DDD思想的同学在刚开始接触项目的时候有点懵。那么什么DDD?这种DDD项目结构和之前的有哪些不同,我该如何开发我的代码,开发不同职责的代码该放在哪里?下面就我的理解,说一说DDD的分层架构。
架构之家
2022/09/27
2.5K0
对DDD(领域驱动设计)分层架构的理解(适合新人)
DDD领域驱动设计落地实践系列:初识DDD
笔者在经历的很多项目中都使用了DDD领域驱动设计进行架构设计,尤其是在业务梳理、中台规划以及微服务划分等方面,DDD是重要的架构设计方法论,对平时的架构设计有非常好的指导作用。从本文开始笔者将通过一系列的文章阐述自己对于DDD的理解以及如何在项目实战中落地实践DDD。本文作为系列文章的开端,主要和大家聊聊DDD的一些基本概念以及使用背景。
慕枫技术笔记
2023/03/20
6840
DDD领域驱动设计落地实践系列:初识DDD
领域驱动设计(DDD)实践之路(一)
领域驱动设计(Domain Driven Design,DDD)其实并非新理论,大家可以看看 Eric Evans 编著的《领域驱动设计》原稿首版是2003年,距今已十余年时间。与现在的分布式、微服务相比,绝对是即将步入中年的“老家伙”了。
2020labs小助手
2020/02/24
1.5K0
DDD 领域驱动设计落地实践系列:战略设计和战术设计
通过前面的文章介绍,相信大家对于什么是 DDD 有了初步的了解,知道它是一种微服务的架构设计方法论,为我们解决如何建立领域模型,如何实现微服务划分等提供了方向和指导。但是对于如何具体落地使用 DDD,可能大家还是一脸懵 B 的状态,因此从本文开始以及后面的文章将对如何进行 DDD 落地进行详细的阐述。在这其中还是会涉及到 DDD 中的一些重要概念,原本想着在一篇文章中介绍所有的概念,但是我觉得,概念总是在它该出现的时候出现才会让大家印象深刻,否则这些概念只是死板的概念,我们不清楚他为什么出现以及可以解决什么问题。
慕枫技术笔记
2023/03/20
1.1K0
DDD 领域驱动设计落地实践系列:战略设计和战术设计
领域驱动设计
本文对《领域驱动设计-软件复杂性应对之道》一书进行高度凝练,梳理了领域驱动设计的架构图、基本要素和重要概念。从细节入手,以小见大,你想知道的定义,这里都有。
kaiwest
2025/01/16
2410
领域驱动设计门槛很高,没有深厚的面向对象编码能力很难实践成功
时间是人类最宝贵的资源。时间是有限的、不可再生的,你可以用钱买任何东西,却买不了时间。技术,就像时尚,在以光速在变化着。为了赶上它,我们需要跑的非常快。但是这个跑道上没有终点,所以没有赢家。
春哥大魔王
2020/11/09
1K0
领域驱动设计门槛很高,没有深厚的面向对象编码能力很难实践成功
浅谈我对DDD领域驱动设计的理解
从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决。 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品。所以,自然而然就想到要做一个普通电商系统,用于实现在线销售自己企业产品的目的。 再比如,我是一家互联网公司,公司有很多系统对外提供服务,面向很多客户端设备。但是最近由于各种原因,导致服务经常出故障。所以,我们希望通过各种措施提高服务的质量和稳定性。其中的一个措施就是希望能做一个灰度发布的平台,这个平台可以提供
逸鹏
2018/04/11
1.3K0
浅谈我对DDD领域驱动设计的理解
一文带你快速上手DDD 领域驱动设计
DDD 让人感觉晦涩难懂,主要是因为DDD诞生之初,是一个纯粹的理论体系,它包含了各种复杂且难以理解的概念,它那一堆名词与理论,让人看起来很费力。
架构精进之路
2024/11/23
5910
一文带你快速上手DDD 领域驱动设计
如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念
    DDD(领域驱动设计)的一些介绍网上资料很多,这里就不继续描述了。自己使用领域驱动设计摸滚打爬也有2年多的时间,出于对知识的总结和分享,也是对自我理解的一个公开检验,介于博客园这个平台也算是对DDD的推广尽了一份绵薄之力。一开始接触这个东西是在2014年,真的觉得像是发现了一片新大陆一般,对我整个程序开发视野有了新的理解,但是像[Vaughn Vernon]《实现领域驱动设计》里写的那样,景色虽好,可是自己很长一段时间内很混乱,理不清眼前的陌生世界,因为它与传统的观念完全不同。我相信大部分同学刚接触DDD的时候也会有一样的感觉。
Zachary_ZF
2018/09/10
1.6K1
如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念
DDD领域驱动设计初探
我们怎么用一套系统化的方法,抽丝剥茧、一步一步地把需求落实到代码呢?咱们看看下面这张图,它表示了领域驱动设计中的主要流程。
燃192
2023/04/10
5370
DDD领域驱动设计初探
读完《实现领域驱动设计》的四点思考
基于纯粹属性的思考是以数据为中心的数据模型,以属性为中心,关注的是数据的存储,层次之间的传递方式。
needrunning
2022/11/18
3370
读完《实现领域驱动设计》的四点思考
领域驱动设计实践:支付系统建模
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/04/08
1.5K0
领域驱动设计实践:支付系统建模
领域驱动设计实践:支付系统建模
点击上方蓝色字体,选择“设为星标” 回复”学习资料“获取学习宝典 文章来源:https://www.jdon.com/59597 目录 简介 什么是DDD 如何在实践中应用DDD 问题空间 解决方案空间 从领域模型到微服务 结论 在Airwallex,领域驱动设计(DDD)方法被用来指导如何对复杂的业务问题和系统设计进行建模。 在这篇博客中,我们试图全面介绍用DDD模式对支付系统进行建模的做法。 | 简介 支付系统是一个相当复杂和多变的系统,从订单、欺诈、通知、与各种支付方式的整合到资金清算和结
猿天地
2022/04/22
1.1K0
领域驱动设计实践:支付系统建模
领域驱动设计(DDD)的几种典型架构
我们生活中都听说了DDD,也了解了DDD,那么怎么将一个新项目从头开始按照DDD的过程进行划分与架构设计呢?
肉眼品世界
2022/04/19
5720
领域驱动设计(DDD)的几种典型架构
领域驱动设计四论
作者:larkliu,腾讯 PCG 后开开发工程师 经过多年的研究与思考,实践与总结,本人逐渐对 DDD 有所领悟,本文以一个较短的篇幅,提纲挈领地梳理出 DDD 的核心脉络,希望与各位做一探讨。 1776 年亚当斯密发表《国富论》,标志着经济学的诞生。2004 年,一本名为《领域驱动设计·软件核心复杂性应对之道》的书问世,开辟了软件开发的一个新流派:领域驱动设计。看完这本书,十个人有九个人的感觉都是:似懂非懂,若有所得,掩卷长思,一无所得,我个人的感觉同样如此。出于兴趣,多年来仔细研读了几十本相关书籍,融
腾讯技术工程官方号
2022/11/09
1.1K0
领域驱动设计四论
领域驱动设计(DDD):DDD落地问题和一些解决方法
欢迎继续关注本系列文章,下面我们继续讲解下DDD在实战落地时候,会具体碰到哪些问题,以及解决的方式有哪些。
付威
2024/01/02
8510
领域驱动设计(DDD)理论启示
过去几年通天塔一直处于快速的业务能力建设和架构完善的阶段,以应对不断增长的业务需求和容量、高可用等技术需求,现在通天塔平台已经能满足集团主站的大部分活动、频道搭建和运营能力,主流程的新需求越来越少,个性化需求和非标准化流程的数据源和服务接入的需求越来越多,有些甚至是京东零售体系外的,同时通天塔技术和产品也在积极主动寻求变化和创新,这些因素结合在一起驱动通天塔孵化出了一个以技术为导向的项目:通天塔积木,旨在构建一个基于完全开放的前端SDK和后端数据源&服务、高度灵活和强大的积木画布、能够快速移植和部署到任何第三方IT环境的活动搭建解决方案,这套方案的初衷和设计理念也契合了京东国际化赋能和PaaS化的战略。目前通天塔积木已经取得阶段性成果,已开始赋能京东国内和国际站,但如何应对异常复杂的积木业务逻辑和不可预知的业务变化,构建业务和底层技术基础实施的完全解耦的系统,一直是我们面对的巨大挑战。也是时候从更高视角来看清问题和源头,思考一种能应对和控制业务复杂度、具备强扩展性和弹性的解决方案。纵观我们的目标,DDD这个词不知不觉映入了我的眼帘。
物流IT圈
2020/03/16
1.9K0
领域驱动设计(DDD)理论启示
推荐阅读
相关推荐
大家一直在谈的领域驱动设计(DDD),我们在互联网业务系统是这么实践的
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档