假设我想要一个系统,其中服务B
的状态应根据服务状态A
的变化进行更新。当A
的状态更改时,它可以发布
例如,假设A
的时间点状态像
t0 | [ ]
------------------
t1 | [X, Y]
------------------
t2 | [X', Y]
------------------
t3 | [X', Y, Z]
------------------
t4 | [X', Z]
它可以发布其当前状态的所有快照(右列),也可以仅发布类似的更改
-----------------------
delta(t0, t1)| +X, +Y
-----------------------
delta(t1, t2)| X->X'
-----------------------
delta(t2, t3)| +Z
-----------------------
delta(t3, t4)| -Y
理论上可以创建优化。但是我认为必须保证的几件事是
如果整个状态都已发布,则
我可以想到一些使增量方法更加健壮的解决方案,这会增加很多复杂性:
两个人都觉得很奇怪。我感兴趣的是,是否存在一个可靠的解决方案来通知“添加,删除和修改”,同时确保系统的最终一致性。
答案 0 :(得分:1)
这是一个非常好的问题。如果您想进一步阅读,则发布增量的语义实质上就是事件驱动的体系结构。
事件(定义中的增量)为您提供的主要优势是透明性。事件很小且受限制,因为它们定义了发生在您系统中的事件并且可追溯。如果您需要捕获其他行为,则可以添加事件类型。当状态发生变化时,它缺乏所发生事件的透明性。您可能必须追溯到所有不同的状态并弄清楚发生了什么,如果它们出故障了,可能就很难推理了。
还有以下几点,
增量算法中没有错误
我认为这很难假设。该实现非常容易,因为您将检查事件类型并对其进行操作,因此分支中的处理应该相当小。
如果已发布的事件无法使用,则发布第3条事件会纠正所有问题
如果服务负责状态更改的bug有错误并将记录更新为无效状态怎么办?发布相同的第三状态将反映依赖状态更改的下游系统中的一致错误。在这里使用事件将这两个语义(本质上是状态和发生的事情)分离开。
答案 1 :(得分:1)
第三个选项是,已发布的事件不包含状态信息,并且事件使用者负责从生产者那里获取状态。该事件可能包含对生产者的回调和/或已更改数据的ID。
当然,最复杂,效率最低的解决方案是让消费者按计划盲目从生产者那里提取数据。