4

我的任务是创建一个事件流,我有一个自动轮询器(设置为 10 分钟间隔)来检索在过去 10 分钟内更改的所有实体。

现在,业务逻辑规定我们仅在实体中特定字段发生更改时创建新的更新事件。由于我们没有关于特定字段更改的粒度(我们所知道的是某些更改),因此我必须创建某种执行以下操作的微分器方法:

  1. 获取之前的实体状态
  2. 将之前的状态与最新的状态进行比较(即差异)
  3. 如果至少有一个字段被业务逻辑确定为重要,则创建更新事件
  4. 如果更新事件已创建,则将之前的实体状态替换为最新的

考虑到这个架构问题,是否有已知的模式或模式集,或指导如何构建这种类型的系统?

4

2 回答 2

3

这个问题的典型解决方案是相反的:系统应该首先产生变化事件,而不是在发生变化后检测变化。换句话说,API 不应该允许存储新的实体版本;相反,它应该只允许应用更改。从系统设计的角度来看,向后工作(在已经发生更改后检测更改)会创建一个更复杂的系统,因为它包含更多步骤。

这种方法最常见的实现是事件溯源,它也非常适合CQRS。两者通常放在一起。正确实施事件溯源可能是一项艰巨的任务,当然不应该在没有充分理由的情况下使用它(尽管您的用例听起来确实很像)。根据更改产生的位置,您可以考虑使用有助于更改跟踪的框架(例如UI 层中的Redux)。


我知道这种修改可能需要添加到已经围绕存储实体版本而设计的系统中。在这种情况下,一种可能的解决方案是在两个世界之间创建一个隔离级别:系统中的一个层,它将实体版本转换为更改流。例如,保留现有接口,但将其实现替换为基于事件的接口;尽早创建事件系统,而不是混合两种方法。

希望这是有道理的。

于 2019-11-16T09:47:08.380 回答
3

看看观察者模式迭代器模式,以及反应式编程的范式。

请注意,这些是处理状态更改(或事件)的相当通用的方法。实现取决于您使用的编程语言和操作环境。您真的应该寻找现有的框架和库,例如ReactiveX(跨平台)或Spring WebFlux (Java)。

这是关于概念之间关系的有趣讨论。

于 2019-11-13T13:03:06.757 回答