CQRS 与解耦消息传递 - 第一部分






4.56/5 (8投票s)
本系列文章的第一篇,展示了 CQRS 架构的实际应用,重点在于将消息传递作为基础设施组件进行解耦。
引言
DDD 和 CQRS 有很陡峭的学习曲线。 有许多文章和代码示例以简化的方式解释了 CQRS 架构的基础知识。 但是,当将 CQRS 应用于实际应用程序时(例如:使用 Azure Servicebus、RabbitMQ 或 MSMQ 等企业服务总线),许多实现将这些消息传递问题与核心域耦合在一起。 这使得将 CQRS 应用于实际应用程序变得困难。
本系列文章展示了“如何”实现具有解耦基础设施关注点的架构,以便最终解决方案易于遵循和维护。
必备组件
- DDD 知识
- 对 CQRS 架构的基本理解
- Greg Young 关于 CQRS 的视频(大约 6 小时)
- 或者 Greg Young 的完整官方系列
- Azure Web 和 Worker Roles
- Azure 服务总线
背景
DDD 强调需要保持领域模型免受基础设施和应用程序层关注的影响。 如下图所示
如上所示,依赖关系指向域层内部。 没有层依赖于基础设施的具体实现。 Main 可以用于引导依赖关系,这些依赖关系将被表示层调用。
在 DDD 中,跨聚合的通信是通过消息传递完成的。 在 CQRS 中,消息传递是发送命令和发布事件所必需的。 因此,消息传递成为实现这种架构时的关键基础设施组件。
但是,消息传递仍然是一个基础设施组件,因此应该从域中抽象出来。 我们将为此创建一个接口 IServicebus
,并了解像 Masstransit、nServicebus(具有不同的传输,如 msmq、Azure 服务总线)等不同的 Servicebus 框架如何用作基础设施层中相同的具体实现。
public interface IServiceBus : IDisposable
{
void Publish(IEvent eventMessage);
void Send(ICommand commandMessage);
}
因此,所有层(除了基础设施)都将使用 IServiceBus
接口,并且不会在基础设施消息传递组件中直接依赖于具体实现的代码。 这使得用其他实现轻松交换第三方库,并且在实现业务逻辑时也不会妨碍我们。
本系列将涵盖哪些内容?
这是本系列文章的简要介绍。
- 引言
- 当前文章解释了所遵循的原则。
- 企业服务总线框架的需求以及带有示例的解耦消息传递
- 我们将查看
MassTransit
和nServicebus
文档中的示例,并将发布订阅从这些示例中解耦。
- 我们将查看
- 库存管理器
- 将介绍库存管理器应用程序。 它是 Greg Young 的 Simple CQRS Example 的实现,但使其可用于实际应用。 目前,库存管理器应用程序仅实现创建库存项的第一个用例。
- 这篇文章将重点介绍在库存管理器
- 库存管理器
- 解释库存管理器应用程序中聚合和事件溯源的工作原理
- 重点关注如何在保存聚合时确保发布事件(没有分布式事务)
- 库存管理器
- 库存管理器中的薄读取层以及实现它时需要注意的点