AWS最佳实践:复用SDK客户端以优化性能

本文分享了作者在测试AWS应用时遇到的网络中断问题,通过分析发现频繁实例化LambdaClient会导致路由器过载。文章详细解释了问题根源并提出了复用SDK客户端的解决方案,这对优化AWS服务性能具有重要参考价值。

AWS最佳实践:复用SDK客户端

当我运行一个基于AWS的应用程序的测试套件时,我注意到我的家庭互联网中断了,测试无法完成。我每次都能重现这个问题,因此两者之间存在明确的因果关系。

但运行测试怎么会导致互联网中断呢?

有一个函数大致如下所示:

1
2
3
const fn = async () => {
	await new LambdaClient().send(/*...*/);
}

在测试运行期间,这个函数被调用了很多次,因此LambdaClient被实例化了多次。而每次SDK向Lambda服务发送命令时,都需要连接到一个端点。

当我运行测试时,我注意到有很多出站连接。然后我检查了其中一个Lambda端点的DNS记录(https://dnschecker.org/#A/lambda.us-west-1.amazonaws.com),它返回了许多不同的IP地址。

我的假设是:创建(和维护)过多的连接会使路由器过载,导致其重启。也许这与NAT端口映射有关。

解决方案很简单:只需实例化客户端一次,使其仅连接到一个端点:

1
2
3
4
5
const lambdaClient = new LambdaClient();

const fn = async () => {
	await lambdaClient.send(/*...*/);
}

这不是我第一次因为使用多个AWS SDK客户端实例而遇到问题。当使用SSO时,SDK会调用一个AWS API,该API返回用于签名请求的凭据。多次实例化服务将多次获取凭据,这会触及速率限制。

因此,最佳实践是保存SDK客户端并在任何函数调用之外重用它们。

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