【发布时间】:2016-02-14 03:09:37
【问题描述】:
我正在实现一个事件存储。我已经定义了一个 SaveEventsConsumer 来处理事件存储中的事件存储。如果我理解正确,CQRS 命令应该没有响应。然而,将事件保存到事件存储时可能会出现并发问题。我使用 RabbitMQ。例如,是否应该通知客户端以便通知用户?应该如何实施?使用 RPC 和错误格式?
我的第一种方法是:
客户端使用类似 RPC 的样式。 SaveEventsConsumer 通知客户端(成功或失败)。如果发生故障(例如并发),则将异常返回给客户端。
此解决方案是否符合 CQRS 模式?是一个好方法吗?还有其他方法吗?有什么改善吗?我应该使用任何 AMQP 标头或属性来指示错误(模仿 HTTP 错误代码)吗?
例如,在一个集群中:
同一个应用程序的两个实例修改同一个聚合。这些实例应该协调(在事件存储外部)还是必须检测并通知响应的事件存储?
【问题讨论】:
-
您期待什么并发问题?例如,来自不同用户的 2 个命令尝试取消相同的订单 - 在这种情况下,由于最终结果相同,因此引发并发错误是没有意义的。
-
例如,同一个应用程序的两个实例修改同一个聚合。这些实例应该协调(在事件存储外部)还是事件存储必须检测并通知响应?
-
基于此 Greg 的 EventStore 如果给出了错误的版本,则给出错误的版本异常
-
但我个人仍然认为你应该知道哪些命令被拒绝 - 例如,无论版本如何,都应该允许 rename-item 命令成功,即修复错字
标签: rabbitmq rpc cqrs event-sourcing