【发布时间】:2015-04-23 04:44:58
【问题描述】:
我目前正致力于实现一个基于消息传递的系统(也酌情使用混合 DDD、CQRS、事件溯源等)。使用的一般模式是使用重复数据删除消费者/幂等接收者的至少一次消息传递。
一个症结是乱序消息。 Vaughn Vernon 在他的书Implementing Domain Driven Design(第 13 章,大致从 p475 开始)中提倡的一种方法是使用 MemberChangeTracker,它检查消息的日期并采取相应的行为(给出的示例是禁用消息到达 after 一条启用消息,尽管是首先生成的。更改跟踪器检查发生的日期,如果发生的日期在最后收到的事件之后,则仅应用第二条进入的消息(禁用消息)。
这很混乱。补偿行为很困难,组合可能会很快爆发。 Vaughn 的回答很“简单”:不要对外部系统中的数据负责,这是有道理的。但是,如果您确实需要这样做,是否有更好的方法?
我的问题是:每个消费者是否可以从给定的聚合订阅每个事件,跟踪消息顺序(所以每个事件都会有一个消息顺序号:Creation = 1;UpdateToAggregate = 2;Cancel = 3 ) 并只过滤它感兴趣的那些?这样做会让消费者看到它收到的 Enable 消息有问题,并等到它收到“丢失”消息(在这种情况下,Disable,或者它可能只是它甚至不感兴趣的消息)?这将允许消费者按顺序应用消息并显着简化其处理程序逻辑。
这是一种有效的方法吗?这里有什么权衡(例如延迟消息处理等待按顺序消息到达)?这似乎是合乎逻辑的——尽管有点不舒服,因为每个消费者都必须订阅 每条 消息,而不是好的——方法。这实用吗?
【问题讨论】:
-
你的问题让我很困惑。什么是“消费者”以及他们订阅的事件是什么?领域事件,如果它们在您的聚合之外?或者聚合通过您的事件存储来的更改事件?无论如何,一个事件处理程序只处理一种类型的事件,为什么会有问题?版本在聚合级别上强制执行,这几乎是强制性的。
标签: .net domain-driven-design messaging cqrs event-sourcing