Open supergem3000 opened 8 months ago
领域中发生的事件。一个领域事件将导致进一步的业务操作。 领域事件用最终一致性,不是传统SOA的直接调用。 聚合的一个原则:一个事务中最多只能更改一个聚合实例。所以
感觉有些不太好理解。问了一下Copilot,大概意思就是中间短时间内运行数据不一致,但是最终会自动修复不一致状态。
微服务内的领域事件 不一定需要消息中间件,可以考虑事件总线。 微服务之间的领域事件 考虑事件发布和订阅、消息中间件、服务调用、分布式事务等。
事件构建和发布 事件基本属性至少包括:唯一标识、发生时间、事件类型、事件源。 事件基本属性和业务属性一起构成事件实体。 事件发布之前需要先构建事件实体并持久化。
事件数据持久化 用于系统之间数据对账、发布方订阅方数据审计。如遇宕机等问题,可等解决后继续后续业务流转,保证数据一致性。 持久化有两种方案:
事件总线 微服务内聚合之间事件分发和接收。
消息中间件 跨微服务的领域事件发布和订阅。如Kafka、RabbitMQ。
事件接收和处理 监听,接收事件数据,完成事件数据持久化,开始进一步业务处理。
用户接口层、应用层、领域层和基础层 应用层应该很薄,主要面向用例和流程相关操作。应用层是微服务之间交互的通道,可以调用其他微服务。不要将本应放在领域层的逻辑放到应用层,时间长会又演化为传统的三层模型。 领域层实现核心业务逻辑,包含聚合根、实体、值对象、领域服务等领域对象。
领域事件:解耦微服务的关键
领域中发生的事件。一个领域事件将导致进一步的业务操作。 领域事件用最终一致性,不是传统SOA的直接调用。 聚合的一个原则:一个事务中最多只能更改一个聚合实例。所以
微服务内的领域事件 不一定需要消息中间件,可以考虑事件总线。 微服务之间的领域事件 考虑事件发布和订阅、消息中间件、服务调用、分布式事务等。
领域事件总体架构
事件构建和发布 事件基本属性至少包括:唯一标识、发生时间、事件类型、事件源。 事件基本属性和业务属性一起构成事件实体。 事件发布之前需要先构建事件实体并持久化。
事件数据持久化 用于系统之间数据对账、发布方订阅方数据审计。如遇宕机等问题,可等解决后继续后续业务流转,保证数据一致性。 持久化有两种方案:
事件总线 微服务内聚合之间事件分发和接收。
消息中间件 跨微服务的领域事件发布和订阅。如Kafka、RabbitMQ。
事件接收和处理 监听,接收事件数据,完成事件数据持久化,开始进一步业务处理。
DDD分层架构
用户接口层、应用层、领域层和基础层 应用层应该很薄,主要面向用例和流程相关操作。应用层是微服务之间交互的通道,可以调用其他微服务。不要将本应放在领域层的逻辑放到应用层,时间长会又演化为传统的三层模型。 领域层实现核心业务逻辑,包含聚合根、实体、值对象、领域服务等领域对象。