我的分布式事件来源的系统模拟房屋正在建造和购买过一段时间的逻辑。为了简单起见,我们将使用年份作为分布式时钟值(现在忘记向量时钟)。
房子服用1年就建立该系统的1.0版本,但只要两次参加第2版。这是逻辑而非结构的变化。
为了应对此更改,版本1中记录的事件在重建状态/快照时还必须由版本1重播。当达到版本2的日志时,应用程序切换到版本2的逻辑并继续重播残余事件。构建有效的快照。
问题
在我的分布式系统中的节点将在不同的时间更新为版本2,创建一个窗口,由此多个版本同时运行。我目前的理解是,这个窗口只能通过诸如功能切换等技术来减少,但不能完全删除(除非通过将整个系统降为升级来牺牲可用性)。
合并来自分布式节点的事件日志时会产生问题。事件版本互相渗透,无法在重放期间从版本1升级到2。例如:
Node Clock Event
... pre-merge ...
A 2000 HouseBuildStarted('Alpha')
A 2001 HousePurchased('Alpha') <- 'HouseBuilt' event is implicit (inferred through logic).
A 2002 NodeUpgradedTo('V2')
B 2002 HouseBuildStarted('Bravo')
B 2003 HousePurchased('Bravo')
B 2004 NodeUpgradedTo('V2')
... post-merge ...
A 2000 HouseBuildStarted('Alpha')
A 2001 HousePurchased('Alpha')
B 2002 HouseBuildStarted('Bravo')
A 2002 NodeUpgradedTo('V2')
B 2003 HousePurchased('Bravo') <- 'Bravo' does not exist yet (1 year early)
B 2004 NodeUpgradedTo('V2')
这是怎么通常处理的系统中,所有的节点都不能接受?