0

如何版本在分布式事件来源的系统

我的分布式事件来源的系统模拟房屋正在建造和购买过一段时间的逻辑。为了简单起见,我们将使用年份作为分布式时钟值(现在忘记向量时钟)。

房子服用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') 

这是怎么通常处理的系统中,所有的节点都不能接受?

回答

1

升级逻辑和分发升级的问题是不同的。如果您需要升级事件流(例如,您的“HouseBuilt事件是隐含的”),那么您应该这样做。您的阅读模型将不得不通过再次播放事件流来进行重建,而逻辑则可以进行升级。在升级程序时,这实际上与修补数据库概念没有什么不同。关于持久数据的事实现在需要根据新的表示重新考虑(默认值可能必须替换,忽略过时的事件等)

如何确定哪个节点运行哪个版本的代码是单独的题。如果您有无停机升级政策,您通常会做什么?有一些客户使用旧版本和一些新版本?同样的事情可能发生,建立新的读取模型,而旧的在线,为新的聚合和应用服务提供服务,同时部署新的模型等。