仅在很少有写入的情况下才使用事件源吗?


9

我正在阅读事件源,不能停止问自己,这是否仅在非常罕见的情况下才有意义,在这种情况下,写操作很少或需要进行军事级审核。

具有非凡用途的非例外系统每天可能会产生成百上千的写入,相当于每年运行一百万或2次写入(因此发生事件)。与从传统存储中直接读取的内容相比,合并数百万个对象(事件)只是为了获得当前状态,这听起来很荒谬。但是,事件源位于某些性能最高的系统(例如LMAX)的背后。

那么,我想念什么?从事件流恢复状态是否通常已经完成?还是这种想法很少需要这样做,而是完全使用其他存储来进行常规操作(即使用CQRS的查询存储),并且仅在特殊情况下(例如复制,审核等)从事件中恢复?

Answers:


6

那么,我想念什么?

猜一猜。

您可能缺少的第一件事是,您只需要为正在重建的状态重新加载事件。如果可以清晰地对事务边界建模,则每个对象都可以写出带有其自己的ID的事件,然后仅读回这些事件。使用关系数据库进行事件存储,将有一个索引id列以加快查询速度。使用EventStore,每个对象都有自己的流。

您需要确保在模型中进行整洁的清理,因为您要确保只在每个事务中修改单个对象,因此您需要注意确保正确隔离了要尝试的每个不变量。执行。

如果速度不够快,您仍然可以创建状态快照(内存),并将其保存在“传统存储”中。每个快照都标记有用于构建快照的最后一个事件的序列号;重新加载时,存储库首先获取该快照,然后对其应用更新的事件。(这暗示了一种获取较新快照的合理方法-事件也被标上了序列号,或者您有某种有效的方法可以向后读取事件流,直到到达起点为止。)

与通常的方法相比,这里的优点仍然是,快照可以与写入并行构建,而不是与快照合并:只需将事件侦听器放在其他线程/进程中,然后愉快地将其写入以任何合理的时间表访问快照存储。毕竟,快照并不需要特别及时-只是足够频繁,以至于重新应用较新事件的工作不会破坏您的SLA。

(快照确实会使迁移复杂化;对模型的序列化所做的任何更改都将使快照缓存无效。当然,您可以使用新的序列化来重建快照,作为迁移的一部分,然后在更改生效后“追赶”。)

从事件流恢复状态是否通常已经完成?

是的。CQRS示例中通常显示的是应用程序层,在确保提交的命令格式正确之后,应用程序层将从存储库中加载域对象,该存储库中的加载是默认构造函数,然后是事件流的重播。 (或等效地,调用带有事件列表的工厂)。

另外两个矛盾的想法。

  1. 存储库界面后面可能有缓存
  2. 缓存失效是两个难题之一。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.