标签:
- 遗留系统、DDD、Bounded Context、ACL、Eric Evans
目标受众:
- 目标受众:系统架构师
关注问题:
- 如何在遗留系统的长尾效应下,保持在之上建立新的功能和能力时,可以不受遗留系统的限制与拖累,仍然可以采用全新的架构甚至全新的工程方法,并保持相对独立的快速演进?
解决方案:
- 通过将新的功能和能力封装到新的独立的上下文中,并拥有独立并完全自主控制的数据存储,采用同步的机制保证与其他上下文的数据一致性,形成完整独立的Autonomous bubble,用同步复杂性换取上下文完整性。
解读:
之前在介绍Architectural fitness function时,我们谈到无论一个系统初建时多么的新潮且纯粹,都会随着时间的洗礼,慢慢成熟,慢慢衰老,就像我在技术的一生中描述的场景一样。
碰到这种情况,很多情况下我们首先想到的就是推倒重建,希望可以重回初生时般的美好。但往往斥重金重建系统后,在短暂的享受重获新生的喜悦之后,依然逃离不开时间和需求的侵浊,再一次走向衰老,成为另一个崭新的遗留系统。
有没有两全其美的方法,既能保持对于遗留系统足够敬畏,不用花费大量成本冒风险重建;又能应用新的技术和架构甚至工程方法为系统构建新的功能和能力,在老树上开出“新花”?
我们发现DDD(Domain-Driven Design)的作者Eric Evans早在2012年就提出的一种叫做Autonomous bubble pattern(自治气泡模式)的模式,对于解决这样的问题越来越有其用武之地。
这种模式乍一看,并无新奇之处,无非就是为新的功能或是应用创建一个新的限界上下文(Bounded Context),在新的上下文里采用全新的设计,并通过Anticorruption Layer(ACL:防腐层)匹配旧的遗留系统而已,常见的应用场景就像Eric Evans在视频中展示的一样:
但Eric Evans提出的Autonomous bubble pattern,并不止于此。
精妙之处在于,他提出了另一种看似更复杂的解决方式,即为新的上下文提供完整的数据存储能力。并通过同步(Synchronizing)的方式保持新的上下文与遗留系统中的数据一致性,如下图。
Eric Evans在视频中也坦言,这种方式相比与第一个方案会更加的”昂贵“,需要一些额外的工作来处理开发者们最为头疼的”同步“问题。
但我们认为由此带来的”上下文自主性“和”对于开发摩擦力(development friction)的减少“,是迈向现代化甚至未来架构的第一步,也是重要且勇敢的一步。
Blip来源:
::Techniques (TRIAL[ 2017.11 | 2018.05 ])::