Make DynamoDB client connection pool sizes configurable

This commit is contained in:
Jon Chambers 2023-11-16 12:29:43 -05:00 committed by GitHub
parent e09dec330a
commit c85ddaeb9c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 37 additions and 33 deletions

View File

@ -297,6 +297,14 @@
<artifactId>reactor-grpc-stub</artifactId> <artifactId>reactor-grpc-stub</artifactId>
</dependency> </dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>apache-client</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>netty-nio-client</artifactId>
</dependency>
<dependency> <dependency>
<groupId>software.amazon.awssdk</groupId> <groupId>software.amazon.awssdk</groupId>
<artifactId>sts</artifactId> <artifactId>sts</artifactId>

View File

@ -5,37 +5,27 @@
package org.whispersystems.textsecuregcm.configuration; package org.whispersystems.textsecuregcm.configuration;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.time.Duration; import java.time.Duration;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;
public class DynamoDbClientConfiguration { public record DynamoDbClientConfiguration(@NotBlank String region,
@NotNull Duration clientExecutionTimeout,
@NotNull Duration clientRequestTimeout,
@Positive int maxConnections) {
private final String region; public DynamoDbClientConfiguration {
private final Duration clientExecutionTimeout; if (clientExecutionTimeout == null) {
private final Duration clientRequestTimeout; clientExecutionTimeout = Duration.ofSeconds(30);
}
@JsonCreator if (clientRequestTimeout == null) {
public DynamoDbClientConfiguration( clientRequestTimeout = Duration.ofSeconds(10);
@JsonProperty("region") final String region, }
@JsonProperty("clientExcecutionTimeout") final Duration clientExecutionTimeout,
@JsonProperty("clientRequestTimeout") final Duration clientRequestTimeout) {
this.region = region;
this.clientExecutionTimeout = clientExecutionTimeout != null ? clientExecutionTimeout : Duration.ofSeconds(30);
this.clientRequestTimeout = clientRequestTimeout != null ? clientRequestTimeout : Duration.ofSeconds(10);
}
@NotEmpty if (maxConnections == 0) {
public String getRegion() { maxConnections = 50;
return region; }
}
public Duration getClientExecutionTimeout() {
return clientExecutionTimeout;
}
public Duration getClientRequestTimeout() {
return clientRequestTimeout;
} }
} }

View File

@ -3,6 +3,8 @@ package org.whispersystems.textsecuregcm.util;
import org.whispersystems.textsecuregcm.configuration.DynamoDbClientConfiguration; import org.whispersystems.textsecuregcm.configuration.DynamoDbClientConfiguration;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider; import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration; import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
import software.amazon.awssdk.http.apache.ApacheHttpClient;
import software.amazon.awssdk.http.nio.netty.NettyNioAsyncHttpClient;
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient; import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
@ -11,12 +13,14 @@ public class DynamoDbFromConfig {
public static DynamoDbClient client(DynamoDbClientConfiguration config, AwsCredentialsProvider credentialsProvider) { public static DynamoDbClient client(DynamoDbClientConfiguration config, AwsCredentialsProvider credentialsProvider) {
return DynamoDbClient.builder() return DynamoDbClient.builder()
.region(Region.of(config.getRegion())) .region(Region.of(config.region()))
.credentialsProvider(credentialsProvider) .credentialsProvider(credentialsProvider)
.overrideConfiguration(ClientOverrideConfiguration.builder() .overrideConfiguration(ClientOverrideConfiguration.builder()
.apiCallTimeout(config.getClientExecutionTimeout()) .apiCallTimeout(config.clientExecutionTimeout())
.apiCallAttemptTimeout(config.getClientRequestTimeout()) .apiCallAttemptTimeout(config.clientRequestTimeout())
.build()) .build())
.httpClientBuilder(ApacheHttpClient.builder()
.maxConnections(config.maxConnections()))
.build(); .build();
} }
@ -24,12 +28,14 @@ public class DynamoDbFromConfig {
DynamoDbClientConfiguration config, DynamoDbClientConfiguration config,
AwsCredentialsProvider credentialsProvider) { AwsCredentialsProvider credentialsProvider) {
return DynamoDbAsyncClient.builder() return DynamoDbAsyncClient.builder()
.region(Region.of(config.getRegion())) .region(Region.of(config.region()))
.credentialsProvider(credentialsProvider) .credentialsProvider(credentialsProvider)
.overrideConfiguration(ClientOverrideConfiguration.builder() .overrideConfiguration(ClientOverrideConfiguration.builder()
.apiCallTimeout(config.getClientExecutionTimeout()) .apiCallTimeout(config.clientExecutionTimeout())
.apiCallAttemptTimeout(config.getClientRequestTimeout()) .apiCallAttemptTimeout(config.clientRequestTimeout())
.build()) .build())
.httpClientBuilder(NettyNioAsyncHttpClient.builder()
.maxConcurrency(config.maxConnections()))
.build(); .build();
} }
} }