【问题标题】:CQRS/EventStore: How are failures to deliver events handled?CQRS/EventStore:如何处理事件传递失败?
【发布时间】:2012-03-20 10:10:45
【问题描述】:

进入 CQRS,我知道您有命令(应用层)和事件(来自域)。

在事件要更新读取模型的简单情况下,读取模型更新会失败吗?如果没有“错误”,那么我看不到它们失败,并且当我使用 EventStore 时,我知道有一个提交标志会重试失败。

所以我的问题是,除了 EventStore 之外,我还需要做任何事情来处理故障吗?

来自一个您在一次交易中完成所有事情而现在事情分开完成的世界让我担心。

【问题讨论】:

    标签: cqrs event-sourcing


    【解决方案1】:

    当然,在读取模型中发布的事件可能会失败。

    您必须确保可以检测到并解决它。

    好处是您可以一次又一次地重播所有事件,这样您不仅有机会修复错误。如果需要,您还可以通过重播每个事件来测试修复。

    我使用 NServiceBus 作为我的发布机制,它允许我使用错误队列。使用我的其他日志记录工具和错误队列,我可以轻松确定发生了什么,因为我有错误日志和导致错误的实际消息。

    【讨论】:

    • 我的读取模型和我的事件存储在同一台机器上。使用 NServiceBus 是不是有点过头了,还是我现在应该计划一下?此外,除非应用程序中存在某种错误,否则会导致读取模型中的事件失败的原因是什么?你能告诉我更多关于你的错误队列以及实现它所涉及的工作吗(考虑到我在 NServiceBus 方面的经验为零)。
    • 当使用 NServiceBus(和 MSMQ 作为传输)是消息被持久化。这意味着,如果由于某种原因出现异常,您可以查看实际发送的消息。另外,您可以再次将其放入输入队列并重新运行它。此外,NServiceBus 提供了一种非常简单的方法来设置消息的发送和发布。开始也不是那么棘手。查看示例并尝试一下。
    • @Mikael Östberg,+1。我认为 Nservicebus/事件队列用于微服务/端点之间的通信。您是否在微服务/端点中使用它们?
    • 您可以在机器或进程之间使用它,也可以在同一进程内使用。它带来的是一种排队机制,可为您提供持久性和节流的手段。我最近构建了一些分布式事务是不可能的东西,在这种情况下,我使用总线在进程内发送命令。执行一项任务(在隐式原子事务中)并将命令发送到下一步。该模式可能不是最漂亮或最简单的,但它会提供持久性,因为您允许每个步骤失败并有可能从失败状态中恢复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多