我正在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 的次数,或通过增加发送请求的主机数量来解决问题。
是否有人遇到过这个问题?