阿里盒马领域驱动设计实践
极客时间编辑部
讲述:丁婵大小:931.49K时长:03:58
设计是把双刃剑,没有最好的,也没有更好的,同时不设计和过度设计都是有问题的,恰到好处的设计才是我们追求的极致。
早在 2017 年,当时身为阿里盒马架构总监的张群辉分享过阿里盒马的领域驱动设计实践。如今再回头来看,别有一番价值。张群辉认为 DDD(Domain-Driven Design)即领域驱动设计只是一个流派,谈不上压倒性优势,更不是完美无缺。 而不管什么流派的设计,重要的是关注设计本身。
当时,阿里集团内部的多数代码都不属于 DDD 类型,有设计的也不多,这导致了日复一日的技术负债。盒马跟阿里集团的大多数业务不同,盒马的业务更面向 B 端,从供应到配送链条,整体性很强,关系复杂,所以设计很重要。在张群辉负责的模块中,他们应用了 DDD 的方式去完成整个系统的建设,并产生了很多新的思考和总结。
在领域模型设计时,经常从两种维度入手,数据建模和对象建模。在数据建模的维度上,模型便是数据字典,领域模型设计就是数据库设计,数据库设计是根本,一切开发围绕着这本数据字典展开。而对象建模是脱离数据库的,有了封装、继承和多态,对领域模型的表达要生动得多,对 SOLID 原则的遵守也会严谨很多。
根据领域模型的丰满程度,将领域模型划分为失血、贫血、充血三个模型。基于数据库的领域设计方式其实就是典型的失血模型。贫血模型在失血模型的基础上更丰富一些,做到父类子类之间相互引用。充血模型是在贫血模型中埋藏了数据库操作,这对测试是不友好的,但是在对象属性数量较多时有其自身的存在价值。
关于依赖注入在领域模型中的应用,推荐构造器依赖注入,这种情况下测试友好,对象构造完整性好,显式地告诉你必须 mock 或 stub 哪个对象。
现实中领域模型往往比较复杂,因此可测试性便是需要重点考虑的方向。失血模型比较简单,其可测试性也比较友好;贫血模型也是天然测试友好的,因为它是纯内存对象;在充血模型下,对象具有持久化特性,这就对数据库有了依赖,mock 或 stub 掉这些依赖是高效单元化测试的基本要求。
按照对象建模的思路,领域模型存在于内存对象里,这些对象最终都要落到数据库,由于摆脱了领域模型的束缚,数据库设计是灵活多变的。盒马团队设计了 Tunnel 这个独特的接口,通过这个接口可以实现对 domain 对象在不同类型数据库的存取。Repository 并没有直接进行持久化工作,而是将 domain 对象转换成 POJO 交给 Tunnel 去做持久化工作,Tunnel 具体可以在任何包实现。这样,领域建模和持久化完全的分开,domain 包成为了单纯的内存对象集。
至于领域模型的部署,当领域具备一定的整体性时,原则上可以采用一个大而全的领域模型,也可以运用 boundedContext 方式拆分子域,并在交接处处理好数据传送。
DDD 在盒马已经迈出了坚实的第一步,并且在业务扩展性和系统稳定性上经受了实战的考验,希望盒马的经验能够给你带来一些启发。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(4)
- 最新
- 精选
- 加菲猫领域驱动设计,领域模型+对象模型,领域模型设计是数据库设计也就是数据字典的设计,对象模型设计是把实体抽象成对象利用面向对象原则封装、继承、多态,通过技术+业务的方式把现实世界抽象化,实现现实世界的需求3
- 约翰码农领域模型设计就是数据库设计… 瞎讲…我认为辉子木有说过这句话12
- 多多米理解不尽准确1
- 杜秀清这是随便讲讲的吗,怎么一些概念准确性有异议?归属地:上海
收起评论