无法执行 HTTP 请求:获取操作的时间超过了配置的最长时间。

10

我正在AWS上运行一个批处理作业,该作业使用Akka从SQS队列消耗消息,并将它们写入Kafka主题。我已经创建了一个带有以下参数的Sqs异步客户端:

private static SqsAsyncClient getSqsAsyncClient(final Config configuration, final String awsRegion) {
    var asyncHttpClientBuilder = NettyNioAsyncHttpClient.builder()
            .maxConcurrency(100)
            .maxPendingConnectionAcquires(10_000)
            .connectionMaxIdleTime(Duration.ofSeconds(60))
            .connectionTimeout(Duration.ofSeconds(30))
            .connectionAcquisitionTimeout(Duration.ofSeconds(30))
            .readTimeout(Duration.ofSeconds(30));

    return SqsAsyncClient.builder()
            .region(Region.of(awsRegion))
            .httpClientBuilder(asyncHttpClientBuilder)
            .endpointOverride(URI.create("https://sqs.us-east-1.amazonaws.com/000000000000")).build();
}

private static SqsSourceSettings getSqsSourceSettings(final Config configuration) {
        final SqsSourceSettings sqsSourceSettings = SqsSourceSettings.create().withCloseOnEmptyReceive(false);
        if (configuration.hasPath(ConfigPaths.SqsSource.MAX_BATCH_SIZE)) {
            sqsSourceSettings.withMaxBatchSize(10);
        }
        if (configuration.hasPath(ConfigPaths.SqsSource.MAX_BUFFER_SIZE)) {
            sqsSourceSettings.withMaxBufferSize(1000);
        }
        if (configuration.hasPath(ConfigPaths.SqsSource.WAIT_TIME_SECS)) {
            sqsSourceSettings.withWaitTime(Duration.of(20, SECONDS));
        }


        return sqsSourceSettings;
    }

但是,在运行批处理作业时,我遇到了以下AWS SDK异常:

software.amazon.awssdk.core.exception.SdkClientException: 无法执行HTTP请求:获取操作花费的时间超过了配置的最大时间。这表明请求无法在指定的最大时间内从池中获取连接。这可能是由于请求速率过高造成的。

即使尝试调整此处提到的参数后,仍然会出现此异常:

考虑采取以下任何操作以减轻问题:增加最大连接数、增加获取超时时间或降低请求速率。增加最大连接数可以提高客户端吞吐量(除非网络接口已被充分利用),但最终可能开始达到过程使用的文件描述符数的操作系统限制。如果您已经充分利用了网络接口或无法进一步增加连接计数,则增加获取超时时间可以为请求在超时之前获得连接提供额外时间。如果连接未释放,则随后的请求仍将超时。如果上述机制无法解决问题,请尝试平稳地处理请求,以使大量流量突发事件不会过载客户端,更有效地使用您需要调用 AWS 的次数,或通过增加发送请求的主机数量来解决问题。

是否有人遇到过这个问题?


你从SQS中弹出的速度有多快?你能把代码包含进来吗? - spinlok
2
我使用了你的NettyNioAsyncHttpClient.builder,不是用于sqs而是用于s3(谢谢!)。在适当地调整后,我解决了间歇性的“Acquire…”错误。我每秒可以获得4000个跨区域的CopyObject(s3-to-s3 CopyObject,在云中运行的应用程序),没有出现错误。我将maxConcurrency设置为500(池大小),这使它明显更快。在本地(我的家用机器上),我只能获得750/s(没有错误)。即使将maxConcurrency设置为4000(!),也无法超越这个速度。当在本地运行时,我不得不限制请求速率以避免错误(如果> MAX_REQUESTS_PER_SECOND,则休眠1秒)。 - Curtis Yallop
1个回答

0

我遇到了同样的问题,最终我发出了100个异步批处理请求,然后等待这100个请求被清除后再发出另外100个请求,如此往复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接