作者回复: 1、这个主要是考虑业务数据,事件数据持久化和发送消息队列同时能够成功,避免出现数据不一致的情况。当然也可以只在业务数据和事件数据持久化增加事务,如果消息队列发送不成功,还可以从事件表中获取数据再次发送。
2、消息订阅方一般在应用层监听和接受事件数据。
作者回复: 😄,舍不得跟大家告别。
作者回复: 基于聚合根的查询不太适合进行复杂的查询。
对于复杂的查询你可以通过应用服务,在仓储实现中直接用SQL查询也是可以的。
作者回复: 这个领域服务的事务控制主要是保证写业务表和事件表以及发布到消息队列,这三步能够保持数据一致。聚合之间或微服务之间可以在应用服务采用事务机制。
作者回复: 如果按照领域建模的方式来设计微服务的话,我们可以很容易的对对象进行聚合以及实体归类,所以也很容易的实现数据之间的解耦,没有特殊考虑的话,建议一个微服务一个数据库。
作者回复: 😄
作者回复: 是的,逐层封装。
作者回复: 一般对于有查询和统计要求的值对象,不建议做成json串存储。其实如果这部分数据在处理后,加载到数据平台,也不影响查询使用。这类值对象的修改需要对应的前端操作,所以其它地方修改并不会修改值对象的值,这也是一种正常的需求,它记录业务发生那一刻的数据快照,不会因为外部数据修改而导致无法记录业务产生那一刻的真实数据。
作者回复: 是的。这种主要是处理微服务内部不同聚合之间的领域事件。主要是因为在处理新增和修改数据的时候,一个操作是对一个聚合整理的数据进行操作的。这样可以避免聚合之间的数据不一致的情况。
作者回复: 我建议你再设计两个聚合:渠道和人员(暂且叫人员吧,你可以根据你的业务场景来命名)聚合。人员聚合主要提供人员的新增和修改,而这个人员数据可以被订单或账单聚合以值对象的方式来引用,在值对象引用时你可以根据业务类型将人员设置为收款人或者付款人。这样人员信息可以在人员聚合集中维护,它可以同时被多个其它的聚合以值对象的形式整体引用。
作者回复: JPA可以自动创建的。
作者回复: 你这个想法挺好的。基础层的对象是可以为所有层提供服务的,把PO拿出来主要还是希望将DO和PO的转换统一放在工厂服务中。如果用leave的DO对象做完save的参数,在save仓储实现内,一样还是需要转换的。
作者回复: 复杂的查询可以不走领域层,你可以定义一个查询应用服务,按照传统三层架构分页查询方式就可以了。
作者回复: 过来人😀。
作者回复: 实体是DO的一种呀。