AWS最佳实践:复用SDK客户端
当我运行一个基于AWS的应用程序的测试套件时,我注意到我的家庭互联网中断了,测试无法完成。我每次都能重现这个问题,因此两者之间存在明确的因果关系。
但运行测试怎么会导致互联网中断呢?
有一个函数大致如下所示:
|
|
在测试运行期间,这个函数被调用了很多次,因此LambdaClient被实例化了多次。而每次SDK向Lambda服务发送命令时,都需要连接到一个端点。
当我运行测试时,我注意到有很多出站连接。然后我检查了其中一个Lambda端点的DNS记录(https://dnschecker.org/#A/lambda.us-west-1.amazonaws.com),它返回了许多不同的IP地址。
我的假设是:创建(和维护)过多的连接会使路由器过载,导致其重启。也许这与NAT端口映射有关。
解决方案很简单:只需实例化客户端一次,使其仅连接到一个端点:
|
|
这不是我第一次因为使用多个AWS SDK客户端实例而遇到问题。当使用SSO时,SDK会调用一个AWS API,该API返回用于签名请求的凭据。多次实例化服务将多次获取凭据,这会触及速率限制。
因此,最佳实践是保存SDK客户端并在任何函数调用之外重用它们。