无服务器架构中重试机制的最佳实践解析

本文探讨了在无服务器架构中实施重试机制的技术考量,分析了与传统服务器架构的差异,并讨论了AWS Lambda、DynamoDB等服务的弹性扩展特性及潜在的系统瓶颈风险。

重试仍是无服务器架构的最佳实践

我观看了Marc Brooker在re:Invent 2024上的演讲《再试一次:弹性系统背后的工具与技术(ARC403)》。他在演讲中谈到了亚稳态问题,以及重试如何可能将瞬时故障转化为系统性故障。

他的例子是请求激增导致服务器过载。在没有重试的情况下,客户端会收到错误,但过一段时间后系统会恢复正常。缺点是客户端会看到错误,而不仅仅是有些延迟。

让我们通过添加一些重试来解决这个问题!

这听起来很合理,但现在出现了一个更大的问题:服务器将永远无法恢复。这是因为已经过载的服务器会收到更多流量。根据Marc的说法,这是"行业历史上一些大规模系统最大规模故障背后的效应"。

演讲的其余部分同样有趣(使用擦除编码来降低尾部延迟?哇!),但我一直在思考这个问题。

我主要使用无服务器架构,我认为它们从根本上就不同,因此重试不会像基于服务器的架构那样对它们造成危害。

无服务器架构的优势在于其在可扩展性方面没有实际的上限。也许DynamoDB或Lambda需要一些时间来扩展,但最终它会扩展,然后增加的流量就能得到妥善处理。系统不会陷入无休止的过载状态。

不过这里有一个巨大的警告。Lambda、S3、DynamoDB、AppSync、API Gateway和类似的服务可以无限扩展,但其他部分可能不行。如果应用程序在该关键路径中使用任何有上限的服务(无论是第一方还是第三方),那么所有这些优秀的可扩展性特性就突然失效了。

最糟糕的部分是什么?直到崩溃发生,你甚至都不会知道。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计