第5周
2020年02月10日 - 2020年02月16日

编辑|子鱼

#问答与讨论

1.求教如果划分了商品上下文和价格上下文,但是需要查询符合某个价格条件的商品时如何实现?如果商品上下文中冗余了价格信息,那修改了价格后数据如何同步?如果价格上下文中冗余了商品ID,那查询到一批商品后如何获取商品名,批量查询商品上下文吗?

[Harvey]

DDD少林派

➤ 问题解答
Sport22:23你这个上下文划分的有点太技术了。
Sport22:23根据业务场景来进行上下文划分。
Sport22:23价格算不上上下文,顶多算个值对象。
忘却录音22:23如果你发现你的两个上下文关联太多,请把他们合成一个上线文
Sport22:24商品顶多算个实体类。
忘却录音22:24价格应该可以当成值对象
忘却录音22:24除非你的价格业务逻辑真的很复杂
Sport22:25不要为了技术而技术,最后邯郸学步了都
Sport22:25搞来搞去咋写程序都不会了
Harvey22:43image.png我是看到教程里这段描述才想到的这个问题
Harvey22:45这只是一个特例其实划分限界上下文时一个很大的问题就是原来关联查询的数据怎么拆分因为我们都不是直接做一个新系统都是老系统重构
Harvey22:48如果想做到零共享又想做到进程隔离有没有遇到过具体比较复杂的场景又是怎么解决的
张逸22:49本身要按照场景来做判断,确定为什么要分为两个BC。如果分开了,好处在哪里,问题在哪里?例如针对你的问题,就可以引入CQRS,为包含价格的商品提供查询视图
叶锦铭23:00查询用api组合的方式多还是cqrs多?
叶锦铭23:16咨询下大家,跨微服务的查询,用组合api方式多还是CQRS的多?
奋斗09:30我感觉普遍组合比较多
刘杰10:15cqrs和组合api两个不冲突啊,用了cqrs可能也会要组合
叶锦铭10:20不是说冲突,看怎么选择
林杰11:09应该是UI展示需要,可以做一层BFF,如果数据库在一起的话,用SQL直接查,如果不在一起,用BFF做组合,我是这么理解的。
冯锐祥11:16cqrs不是一种思想吗?跟api不同层面的东西
叶锦铭11:17讨论的是跨微服务的查询,两种实现方式,组合api或者cqrs,看大家平时怎么选择
叶锦铭11:18BFF你们怎么实现的?什么团队维护啊?
林杰11:23如果涉及到UI层面的聚合,要么前端多查几次,要么加一层BFF,好像没有其他好的解决方案。
叶锦铭11:25bff层你们是前端团队维护吗?
林杰11:25我自己维护的。
叶锦铭11:26后端维护咯?
林杰11:27目前是,要找到好的可以维护BFF的前端比较少。
林杰11:29不知还有没其他好的方案,我目前刚开始,数据库是存一起的,还比较简单,但是涉及到多个微服务之间的数据聚合,也挺头痛。
炙炙炙炙炙炙云深11:30我们现在在app层分了command和query两个包目录。一些纯查询有qry不通过domain层和repository,直接去dao拿数据转换成前段结构
炙炙炙炙炙炙云深11:32po对象转实体,实体转前段vo两次转换,但是po转vo只需要一次。。这时候ddd其实并没有明显优势。[捂脸]
叶锦铭11:38我觉得还是权衡选择,组合api和cqrs配合起来用,毕竟大部分查询应该跨领域的比较少吧
炙炙炙炙炙炙云深11:49各有权衡和选择吧。。我们这次重构引入DDD过程中做了很多妥协[表情]。。
阿斌哥12:33[呲牙]哪些妥协,说来听听?@炙炙炙炙炙炙云深
刘杰12:37我们ddd结合cqrs和你们比较一致@炙炙炙炙炙炙云深 
炙炙炙炙炙炙云深13:43@阿斌哥很多的,选一个说吧。。。前置添加是做了一个依赖倒置,让基础设施层依赖了domain层,然后老项目重构的时候,我们吧订单和退款拆成了两个domain放进了一个项目里。各个domain内写repository接口,然后实现在基础设施,以上是前提。实际开发中退款域需要查订单域的很多数据,最初退款域直接引入了订单domain,以使用相关entity与repository,后续发现这个问题,但是让退款域再写一套repository去查询时间上来不及,所以又抽离了一个model层专门存放repository和entity,并放在底层。
炙炙炙炙炙炙云深13:45依赖倒置后domain层要使用工具类只能放入domain内写,一个项目有多个domain包不能通用只能分别实现也比较伤,也考虑过专门打jar包分别依赖,但是jar包项目的维护又成了问题,基础架构组又说他们提供需要找业务架构,业务架构人手不够没法支持。。所以后续也是写进了这个model层。
阿斌哥18:09读了三遍,还是没看太明白你所说的为了DDD而妥协这个点[尴尬]
炙炙炙炙炙炙云深18:14是ddd对外妥协吧
阿斌哥18:17退款域要查订单域的数据,DDD的方式应该是通过应用服务进行集成的吧?如果是跨进程的话,则由订单域通过开放主机服务暴露接口,供退款域调用,退款域这边可以考虑增加一层防腐层。这里所说的域大致理解为是限界上下文。你说的这个我理解的就是一个限界上下文的集成。
炙炙炙炙炙炙云深19:00是想这么做。但实际上由于上下文转换成本太高没做到[捂脸]
炙炙炙炙炙炙云深19:04接受程度不一样,开发时间又不够(停止接业务重构),很多东西最后写的都比较糟心。。光是domain层与基础设施层的依赖导致,我前前后后和几个team的人聊了三天[捂脸]

2.有人做过,基于聚合做数据变化追踪的吗?AuditLog在这种情况是基于数据表来做,还是基于聚合来做会比较合适?

[Zpl]

DDD少林派

➤ 问题解答**龙文-GARY14:17事件溯源做log。比较合适吧