- 最新
- 投票最多
- 评论最多
【以下的回答经过翻译处理】 你的代码客户端在哪里运行的(使用Java SDK的应用)?可能正在发生的是你正在遇到TCP Keepalive超时。在SDK等待Lambda回复时,TCP连接没有任何流量传送。可能你途经使用的网络设备在一段时间后关闭空闲连接。例如,如果你的应用程序在VPC环境中运行,并使用NAT网关或VPC终端节点用于对Lambda的出站连接,则空闲连接将在350秒后被关闭。在这种情况下,行为将与你所观察到的一致 - Lambda一侧将继续运行,而客户端一侧最终会超时。
如果上述描述符合你的情况,你可以尝试通过以下两个步骤来解决问题 - (1)减少操作系统级别的TCP Keepalive时间 (2)启用Java SDK中的TCP Keepalive。以下我将详细介绍这两个步骤。
注意:这些步骤使用高级技术,改变了操作系统级别TCP keepalive设置和应用级别HTTP客户端配置的默认行为。请仅将以下描述用作参考,并确保如果您决定将其应用于实际环境中,确保您知道自己在做什么。这是一篇很好的文章,解释了TCP Keepalive。
1.默认情况下,Linux环境通常配置为具有7200秒(2小时)的TCP Keepalive间隔,在你的场景中显然过高。你可以通过运行以下命令查看配置:
cat /proc/sys/net/ipv4/tcp_keepalive_time
cat /proc/sys/net/ipv4/tcp_keepalive_intvl
您可以通过将以下属性添加到/etc/sysctl.conf
并重新启动系统来更新这些设置。您可能希望使用不同的值。如果您的路径上有NAT网关或VPC端点,请确保您的保持连接时间低于350秒。其他网络设备可能具有不同的超时时间。下面的配置意味着在开始发送保持连接探测之前等待120秒,然后以30秒的间隔发送它们。
net.ipv4.tcp_keepalive_time=120
net.ipv4.tcp_keepalive_intvl=30
重新启动后,运行相同的cat命令以确保应用了新的设置。 2.构建一个自定义的ApacheHttpClient,启用TCP Keepalive,并在构建Lambda客户端时使用它。请参阅下面的参考资料。
ApacheHttpClient.Builder apacheHttpClientBuilder = ApacheHttpClient.builder();
apacheHttpClientBuilder.connectionMaxIdleTime(Duration.ofSeconds(900));
apacheHttpClientBuilder.connectionTimeToLive(Duration.ofSeconds(900));
apacheHttpClientBuilder.socketTimeout(Duration.ofSeconds(900));
apacheHttpClientBuilder.tcpKeepAlive(true);
SdkHttpClient sdkHttpClient = apacheHttpClientBuilder.build();
RetryPolicy retryPolicy = RetryPolicy.builder().numRetries(0).build();
ClientOverrideConfiguration clientOverrideConfiguration = ClientOverrideConfiguration.builder()
.apiCallAttemptTimeout(Duration.ofSeconds(900))
.apiCallTimeout(Duration.ofSeconds(900))
.retryPolicy(retryPolicy)
.build();
LambdaClientBuilder lambdaClientBuilder = LambdaClient.builder();
lambdaClientBuilder.overrideConfiguration(clientOverrideConfiguration);
lambdaClientBuilder.httpClient(sdkHttpClient);
LambdaClient lambdaClient = lambdaClientBuilder.build();
InvokeRequest invokeRequest = InvokeRequest.builder().functionName(FUNCTION_NAME).build();
InvokeResponse invokeResponse = lambdaClient.invoke(invokeRequest);
ApacheHttpClient class 来源于 https://mvnrepository.com/artifact/software.amazon.awssdk/apache-client
相关内容
- AWS 官方已更新 4 年前
- AWS 官方已更新 2 个月前
- AWS 官方已更新 3 年前