通过手动轮询从 Rest 更改的实体来建模事件流 API

Modelling an event stream by manually polling entities that changed from a Rest API

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

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

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

鉴于此体系结构问题,是否存在关于如何构建此类系统的已知模式或模式集或指南?

看看observer pattern and the iterator pattern, and also at the paradigm of reactive programming

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

Here is关于概念之间关系的有趣讨论。

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

这种方法最常见的实现是 Event Sourcing, which also fits well with CQRS. The two are typically put in place together. Properly implementing Event Sourcing may be a difficult task and it certainly should not be used without a good reason (your use case certainly sounds like one though). Depending on where the changes are produced you may consider using frameworks that facilitate the change tracking (e.g. Redux 在 UI 层)。


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

希望这是有道理的。