无法执行 HTTP 请求:获取操作花费的时间超过配置的最大时间

问题描述 投票:0回答:1

我正在 AWS 中运行一个批处理作业,它使用来自 SQS 队列的消息并使用 akka 将它们写入 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 的次数或增加发送请求的主机数量来提高效率

有人遇到过这个问题吗?

java amazon-web-services akka netty amazon-sqs
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.