随着 Serverless 架构的普及,越来越多的应用程序将自己的业务逻辑部署到了云端,而 Serverless 框架则成为了最受欢迎的云服务提供商之一。然而,Serverless 框架在执行函数时有自动重试机制,以确保应用程序的稳定和可靠性。但这种机制经常被误解为只是重复执行代码的简单方式,从而导致代码的性能和可读性下降。因此,在本文中,我们将讨论如何高效应对 Serverless 框架中的函数自动重试,以提高代码的效率和可扩展性。
Function Retry
当用户运行服务器应用程序时,每个执行函数都可能要遭受各种风险。这些风险通常包括网络连接问题,代码错误或即使在云端也可能发生的硬件故障。遇到这些问题时,函数执行可能失败,从而导致应用程序崩溃并返回错误消息。为了解决这些可能性,Serverless 框架通常会在函数执行时进行自动重试。
自动重试机制可以被定义为一种机制,在此机制中,框架将自动为每个故障的功能执行多次尝试(通常是两到三次),直到函数成功或达到最大尝试次数。每个尝试被认为是斐波那契后退策略,并且会在尝试之间等待一定的时间以防止基础结构问题。
这种重试机制看起来很可行,因为它确保函数在失败后可以透明地重新执行。但是,未完全理解这种机制往往会导致出现一些问题。
重试的问题
重试机制并不是在尝试任意出现错误时的必要手段。事实上,对于某些错误类型,连接问题和一些应用错误并不能解决,这些错误会一直重复,导致代码性能下降和可读性低。此外,不同的应用程序有不同的重试需求,因此,重试机制的配置和使用方式应该根据不同的应用程序和业务需要进行调整。
因此,实际上,我们需要更加系统化的方法来高效地应对这些问题,从而改进重试机制。
解决方案
在使用 Serverless 框架时,需要为每个函数进行配置。例如,在 AWS Lambda 中,你可以在包括遗留代码框架的 YAML 配置文件中配置函数重试机制。
---------- ----------- -------- ---------------- -------- -
在这里,我们定义了 MyFunction 函数的最大重试次数,以及在尝试之间等待的延迟时间。
如果应用程序中的某个功能不需要任何随机性,我们可以选择将最大重试次数设置为零,从而禁用重试机制。
我们也可以使用 Handlerrors 函数来帮助我们解决这个问题。此函数允许我们根据返回的异常和错误类型来决定哪些异常值应该用于 Serverless 框架的自动重试机制中。例如,Serverless 不会重试超时错误,但可以重试连接错误、网络错误或访问错误。
在这里是使用 HandlerErrors 函数的一个例子:
---------------------- - ----- ------- -------- -- - --- - -- -- --------- ---- - ----- ----- - ------------------------------ ----- ----- ---- - --
在这里,我们使用了 Context 对象来捕捉各种异常。通过使用 context.error() 方法,我们可以向 Handlererrors 值传递错误类型,而 throw err 则将错误加入函数执行栈中。
结论
重试机制是 Serverless 架构中保障应用程序可靠性和稳定性的一个重要组成部分。但是,此机制可能会误导许多开发者,让他们认为 Serverless 可以通过重复执行函数来解决所有故障。因此,当我们在 Serverless 中使用自动重试机制时,一定要仔细选择故障类型和最大尝试次数。除此以外,使用 Handlererrors 函数可以更好地确定 Serverless 何时才进行重试。只有当我们能高效地使用所有这些自动重试的工具时,才能使我们开发的应用程序能够更加健壮,稳定,可扩展,以及更加平稳地运行。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6735d1810bc820c58250a457