我正在构建一个单页 Web 应用程序,并计划利用服务器端事件流来让客户端及时了解更改。
在考虑这一点时,我想到了一个并发场景,我不确定我计划实施的解决方案是否是最好的:
- UI 订阅事件流并接收从时间 X 开始的所有新事件。
- UI 在 time 加载来自各个端点的数据
X
。例如活跃用户总数。 - 用户有时会被停用,
X
并且 UserDeactivated 事件会添加到流中。 - UI 在 time 收到一个 UserDeactivated 事件
X+1
。
此时,UI 不能盲目地将活动用户总数减少 1,因为它已经加载的总数可能已经反映了停用。
我计划用于此问题的方法是跟踪加载每一位数据的日期和时间,并订阅事件流application_loaded_time - some_offset
以确保我不会错过任何事件。
然后,当接收到事件时,每个订阅者都会检查他们负责维护的数据的获取日期和时间,如果事件发生在之后,他们将应用该事件,如果data_fetching_datetime
事件发生在之前,则忽略它data_fetching_datetime
。
这会是一个好的同步策略吗?这种方法有什么我遗漏的吗?有没有更好的办法?
我必须确保的一件事是客户端时间与服务器不同步。我可能必须添加一个自定义 HTTP 标头,指定何时开始处理请求。
对于单个聚合,我可以只依赖我加载的 AR 版本和事件版本,但对于计数等聚合查询,没有这样的版本可以利用。
注意:我没有进行事件溯源,也没有 CQRS,也没有预测。有了投影,我可以为每个视图都有一个序列号(最后处理的事件),我可以返回结果,但这里不是这种情况。我想我可以通过计算查询时特定类型的事件数来计算每个查询的版本号,但我不确定它是否会表现良好。