为微服务时代的长期运行的交易进行现代化改造
这个开源平台通过用工作流取代Sagas,解决了现代微服务环境中的长运行过程问题。
虽然有些软件事务很简单,但有些事务需要更多的维护。尤其是长期运行的事务,已经成为微服务时代的祸根,因为它们需要仔细管理以确保成功完成。几十年来,开发者通过编写额外的代码来管理要求更高的事务,来处理这个问题。现在,在微服务的分布式世界里,他们必须再次解决这个问题。因此,探索这个话题--以及现代执行平台如何提供帮助--提供了许多引人注目的见解。
我们如何定义 "长期运行的交易"?
最简单的事务是可预测的,涉及直接的请求和响应互动。然而,更复杂的交易跨越多个步骤,可能需要不同长度的时间来完成,特别是当涉及手动输入时。
这方面的一个例子是预订多段飞机航班。一个人可能需要预订多个航班作为单一交易的一部分,但可能需要花费时间来手动检查和预订每段旅程的选项。因此,当用户从开始到结束的预订过程中,系统必须跟踪已经预订的内容和可用的内容。
在一个由多个微服务组成的分布式应用中,谨慎的设计是至关重要的,因为预订交易可能只持续几分钟,也可能需要几天,这取决于用户需要多长时间来完成他们的预订。另一个例子是订阅管理交易,这个过程往往跨越数年。像Netflix这样的流媒体服务可能每个月都向用户收费。系统在30天后唤醒,处理信用卡付款,并更新客户的账户,这是一系列常规的小步骤。
这两个例子,机票预订和订阅服务,都表明根据执行的时间来定义一个长期的交易是不合适的。一个可能持续几分钟,而另一个则跨越了几年。所以最终,不确定的执行时间意味着长期运行的交易不能也不应该有任何时间限制。出于这个原因,在Temporal,我们把长期运行的操作称为任意长度的操作。
强大的执行保证的重要性
长时间运行的事务必须有一个强大的执行保证,将失败的风险降到最低。这意味着,它必须是有状态的。如果任何底层步骤由于技术或人工中断而失败,它应该回忆起它所处的步骤,并从该点恢复操作。
航空公司预订应用程序需要完全成功,所有的航班都被预订,或者完全不成功,没有航班被预订,以保持用户旅行的完整性。
订阅管理事务也必须保持状态。它必须记住用户支付了6月份的订阅费,这样它才能在7月份向他们收费。如果它失败了,它就不能简单地从头开始,为账户创建以来的每个月都进行充值。
另一方面,短期运行的事务只提供弱的执行保证。它们不能确保可靠性,因为它们不能在发生故障时保持自己的状态。相反,它们依靠调用它的进程来监控它的状态,检测并缓解其运行中的任何问题。
传说和微服务的历史
当我们回顾历史时,早在1987年,普林斯顿大学发表的一篇论文将长周期和短周期事务结合在一起,形成了一种被称为传奇的软件开发模式。Saga将一个长期运行的事务的步骤分解成一系列的短事务。
Saga管理每一个短事务,为那些失败的事务发布补偿性事务。它使用数据库存储的持久性来维护所有短交易的状态。必要时,Saga会根据消息队列和计时器重试短事务。
现在的开发者使用Sagas来支持微服务中的长运行事务,但这是很痛苦的。Sagas是模式,不是解决方案,开发者必须 自己实现Sagas。他们必须编写代码来解决流程失败,存储状态,并管理时间限制。这既是一种负担,也是一种脆性。
微服务使Sagas更难支持,因为这些服务可以互相调用。一个进行短期交易的微服务可能会调用另一个微服务来完成。开发者必须管理这些关系以支持整个传奇。
工作流来拯救
Temporal是一个经麻省理工学院许可的开源平台,它通过用工作流取代传奇,解决了现代微服务环境中的长期运行过程问题。这些是专门为分布式系统设计的多步骤流程,可以持续不确定的时间。
工作流独立于请求-响应流而存在,同时仍然提供强大的执行保证。这意味着开发人员可以在他们的应用程序中支持长期运行的事务,而不需要编写临时的状态管理代码。应用程序不需要意识到失败。Temporal在引擎盖下管理应用程序的状态,无论该进程运行多长时间。
Temporal的环境包括冗余的组件和跨越多个可用区的地理独立性,以确保一致性。即使在灾难性的系统状态下,该平台也会保留工作流程的状态,直到底层基础设施恢复。
工作流不仅保存自己的状态,而且还支持微服务相互调用时创建的短事务链。如果短事务链中的任何一个微服务出现故障,平台可以自动重新启动它们,以帮助短事务链完成。
工作流实现了与Sagas相同的目标,但开发人员几乎不需要做任何工作,只需编写几行代码来设置工作流。就像数据库在处理原子事务时向开发者隐藏了时间限制和故障一样,工作流在微服务环境中向开发者隐藏了它们。
通过将应用状态作为一个核心抽象来管理,Temporal为微服务时代实现了Saga解决方案的现代化。它可以让开发人员创建跨越多个步骤和数百个微服务的长期运行的事务,执行时间不可预测。这使得程序员可以自由地编码他们的业务逻辑,因为他们知道这些工作流程将保持一致。
无论你的系统是预订机票还是管理查询多个系统的订阅--或任何其他例子--你都可以在短短几行代码中创建一个工作流程。