微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AWS Lambda 抛出 ReadTimeout

如何解决AWS Lambda 抛出 ReadTimeout

我需要调用一次 lambda 函数(无需重试)。 执行该 lambda 最多需要 5/10 分钟。

我发现了多篇关于超时的帖子,每一篇都没有成功

try {
    InvokeRequest invokeRequest = new InvokeRequest()
        .withFunctionName("mylambdaname")
        .withPayload(objectMapper.writeValueAsstring(payload));

    //invokeRequest.setSdkRequestTimeout(0);
    //invokeRequest.setSdkClientExecutionTimeout(0);
    //invokeRequest.withSdkRequestTimeout(0);
    //invokeRequest.withSdkClientExecutionTimeout(0);

    AWSLambda awsLambda = AWSLambdaClientBuilder.standard()
        .withCredentials(new EC2ContainerCredentialsProviderWrapper())
        .withRegion(Regions.EU_WEST_1)
        .withClientConfiguration(new ClientConfiguration()
            //.withConnectionTimeout(0)
            //.withRequestTimeout(0)
            //.withClientExecutionTimeout(0)
            //.withSocketTimeout(0)
            .withMaxErrorRetry(0)
        ).build();

    awsLambda.invoke(invokeRequest);
} catch (ServiceException | JsonProcessingException e) {
    LOGGER.error(e.getMessage());
}

设置超时(如 15*60*1000)或无 (0) 仍会在恰好一分钟后触发 ReadTimeout。 我还尝试从 AWS 安装 SDK v2,但出现了同样的问题。

尝试过的例子:

PS:如果长任务被缩短,lambda 确实可以工作,所以这里的一切都与超时有关

完整的堆栈跟踪

java.net.socketTimeoutException:读取超时 在 java.net.socketInputStream.socketRead0(本机方法) 在 java.net.socketInputStream.socketRead(SocketInputStream.java:116) 在 java.net.socketInputStream.read(SocketInputStream.java:171) 在 java.net.socketInputStream.read(SocketInputStream.java:141) 在 sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:457) 在 sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:68) 在 sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1095) 在 sun.security.ssl.SSLSocketImpl.access$200(SSLSocketImpl.java:72) 在 sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:815) 在 org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137) 在 org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153) 在 org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280) 在 org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138) 在 org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56) 在 org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259) 在 org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163) 在 org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:157) 在 org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273) 在 com.amazonaws.http.protocol.SdkHttpRequestExecutor.doReceiveResponse(SdkHttpRequestExecutor.java:82) 在 org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125) 在 org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272) 在 org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) 在 org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83) 在 org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) 在 com.amazonaws.http.apache.client.impl.SdkHttpClient.execute(SdkHttpClient.java:72) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1258) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1074) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:745) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:719) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:701) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:669) 在 com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:651) 在 com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:515) 在 com.amazonaws.services.lambda.AWSLambdaClient.doInvoke(AWSLambdaClient.java:2682) 在 com.amazonaws.services.lambda.AWSLambdaClient.invoke(AWSLambdaClient.java:2651) 在 com.amazonaws.services.lambda.AWSLambdaClient.invoke(AWSLambdaClient.java:2640) 在 com.amazonaws.services.lambda.AWSLambdaClient.executeInvoke(AWSLambdaClient.java:1503) 在 com.amazonaws.services.lambda.AWSLambdaClient.invoke(AWSLambdaClient.java:1474)
在 Repository.invokeLambda(Repository.java:60)
在 Service.invoke(Service.java:40)
在 Controller.invoke(Controller.java:37)
在控制器$$FastClassBySpringcglib$$9d602606.invoke()

解决方法

这些方法应该可以完成我看到您已注释掉的技巧:

  • TOOL_NODE_FLAGS
  • setSDKRequestTimeout(int milliseconds)

我认为您不应该使用 0。您应该使用 setSdkClientExecutionTimeout(int milliseconds)

https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/AmazonWebServiceRequest.html#setSdkRequestTimeout-int-

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。