运行 生产事件处理程序如何完成?

How can running event handlers on production be done?

在生产环境中,事件数量会大量增加,在紧急情况下,您如何重新 运行 所有处理程序,如果处理程序太多可能需要几天时间?

取决于您描述的是哪种紧急情况

如果您的紧急情况的性质是您的事件处理程序严重落后于编写者(例如:您的消息消费者被阻止,并且您现在有 48 小时的积压等待您)- 不多。如果您的消费者是可并行的,您可以通过使用像 LMAX Disruptor 这样的数据结构来支持并行恢复来加快速度。

(模拟:你决定引入一个新的读取模型,它需要处理大量积压的数据以达到正确的状态。没有任何"answer",除了咀嚼它们。在一些在某些情况下,您可以根据一些可管理的事件数量创建一个近似值,同时等待真正的答案完成,但没有处理所有事件的捷径。

另一方面,在历史记录很大但积压是可管理的情况下(即 - 写入模型未产生新事件),您通常可以避免需要完全重播。

在写模型中:大多数事件源解决方案利用支持多个事件流的事件存储 - 写模型中的每个聚合都有一个专用流。大量事件数通常意味着大量可管理的流。如果确实如此,您可以单独保留写入模型——按需加载整个历史记录。

如果该假设不成立——写入模型的一部分具有非常大的流,或者读取模型的一部分组成多个流的事件,通常的答案是快照。

也就是说,在健康的系统中,处理程序会按一定的时间表保留它们的状态,并在元数据中包含一个标识符,该标识符跟踪快照在历史记录中的位置。

要恢复,您需要重新加载快照和标识符。然后您从该点开始重播(假设您有一个事件存储,允许您从历史中的任意点开始重播)。

因此,管理恢复时间只是调整快照间隔的问题,这样您就永远不会落后于恢复 SLA "latest"。快照的创建可以在一个完全独立的过程中进行。 (事实上​​,您的持久快照存储看起来很像持久读取模型)。