gem-universe / blog

0 stars 0 forks source link

[DDD]领域驱动设计 高级篇 #17

Open supergem3000 opened 8 months ago

supergem3000 commented 8 months ago

领域事件:解耦微服务的关键

领域中发生的事件。一个领域事件将导致进一步的业务操作。 领域事件用最终一致性,不是传统SOA的直接调用。 聚合的一个原则:一个事务中最多只能更改一个聚合实例。所以

微服务内的领域事件 不一定需要消息中间件,可以考虑事件总线。 微服务之间的领域事件 考虑事件发布和订阅、消息中间件、服务调用、分布式事务等。

领域事件总体架构

事件构建和发布 事件基本属性至少包括:唯一标识、发生时间、事件类型、事件源。 事件基本属性和业务属性一起构成事件实体。 事件发布之前需要先构建事件实体并持久化。

事件数据持久化 用于系统之间数据对账、发布方订阅方数据审计。如遇宕机等问题,可等解决后继续后续业务流转,保证数据一致性。 持久化有两种方案:

事件总线 微服务内聚合之间事件分发和接收。

消息中间件 跨微服务的领域事件发布和订阅。如Kafka、RabbitMQ。

事件接收和处理 监听,接收事件数据,完成事件数据持久化,开始进一步业务处理。

DDD分层架构

用户接口层、应用层、领域层和基础层 应用层应该很薄,主要面向用例和流程相关操作。应用层是微服务之间交互的通道,可以调用其他微服务。不要将本应放在领域层的逻辑放到应用层,时间长会又演化为传统的三层模型。 领域层实现核心业务逻辑,包含聚合根、实体、值对象、领域服务等领域对象。