我观看了 Marc Brooker 在 re:Invent 2024 上的演讲《再试一次:弹性系统背后的工具与技术 (ARC403)》。其中,他谈到了亚稳态问题,以及重试如何可能将瞬时故障演变为系统性故障。
他的例子是请求激增导致服务器过载。如果没有重试,客户端会收到错误,但过一段时间后一切会恢复正常。缺点在于,客户端看到的将是错误,而不仅仅是些许延迟。
那就让我们通过添加一些重试机制来解决这个问题吧!
听起来很合理,但现在却产生了更大的问题:服务器可能永远无法恢复。这是因为一个已经过载的服务器正在接收更多的流量。根据 Marc 的说法,这是“业界历史上一些大规模系统最大规模宕机背后的效应”。
演讲的其余部分同样有趣(例如使用纠删码来减少尾部延迟?令人惊叹!),但我一直在思考这个问题。
我的工作主要涉及无服务器架构,我认为它们与传统服务器架构有根本性的不同,因此重试对它们不会像对基于服务器的架构那样有害。
无服务器架构的优势在于其可扩展性几乎没有实际上限。也许 DynamoDB 或 Lambda 需要一些时间来扩展,但最终它们会完成扩展,并能够很好地处理增加的流量。系统不会陷入无限过载的状态。
然而,这里有一个巨大的警告。Lambda、S3、DynamoDB、AppSync、API Gateway 以及类似的服务可以无限扩展,但其他部分可能不行。如果应用程序在关键路径中使用了任何服务(无论是第一方还是第三方),并且该服务存在上限,那么所有这些美好的可扩展性特性都将瞬间失效。
最糟糕的部分是什么?直到崩溃发生,你甚至都不会意识到这个问题。