【问题标题】:CQRS, EventStore and event sourcing: concurrency exceptions in SaveEvents use RPC?CQRS、EventStore 和事件溯源:SaveEvents 中的并发异常使用 RPC?
【发布时间】: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


【解决方案1】:

虽然您确实不从命令返回值,但仍然可能发生异常。并发异常就是一个例子。这意味着异常作为命令处理的一部分被抛出。当你考虑它时,这是有道理的。您永远不希望发布尚未提交到事件存储的事件。因此,并发冲突检查需要作为整个命令过程的一部分进行。

我有一个帖子可能会有所帮助。你可以找到它here

【讨论】:

  • 谢谢。要将异常返回给客户端,rabbitmq应该使用什么? RPC?
猜你喜欢
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 2012-07-01
  • 2018-11-15
  • 2019-09-22
  • 2018-04-13
  • 2021-12-18
  • 1970-01-01
相关资源
最近更新 更多