Java Springboot разговаривает с Elasticache - вызовы API завершаются сбоем во время автоматического масштабирования задаJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java Springboot разговаривает с Elasticache - вызовы API завершаются сбоем во время автоматического масштабирования зада

Сообщение Anonymous »

Приложение Java Springboot взаимодействует с Aws Elasticache с помощью клиента Lettuce, работающего на ECS.
Springboot версии 3.4.5
Lettuce версии 6.8.1.RELEASE
Бессерверный Elasticache Valkey с использованием аутентификации IAM
Обнаружено странное поведение во время нагрузочного теста. Когда автоматическое масштабирование задач ECS запускается при высокой нагрузке (ЦП > 50%) в течение 500 об/с,
  • задержка API резко возрастает.
  • Тайм-аут вызовов API составляет 504.
  • команды Elasticache завершаются сбоем из-за тайм-аута соединения, тайм-аута команды.
  • Проверка работоспособности задач Ecs не выполняется, и задачи создаются/уничтожаются непрерывно в цикле для некоторое время
Для правильного масштабирования задач требуется около 30 минут, затем все успокаивается и API работают нормально.
Политика автоматического масштабирования срабатывает, когда:
Загрузка ЦП >50%
Загрузка памяти >50%
Конфигурация Elasticache:
maxTotal 15
maxIdle 8
minIdle 3
тайм-аут соединения 3 секунды
тайм-аут команды 2 секунды
Что здесь не так?
Ниже приведен класс конфигурации elasticache. Заранее спасибо.

Код: Выделить всё

public class ElastiCacheConfig {

@Bean(destroyMethod = "shutdown")
public ClientResources clientResources() {
return DefaultClientResources.builder()
.ioThreadPoolSize(8)
.computationThreadPoolSize(8)
.reconnectDelay(Delay.equalJitter(
Duration.ofMillis(100),
Duration.ofSeconds(30),
1, TimeUnit.MILLISECONDS))
.build();
}

@Bean(destroyMethod = "shutdown")
public RedisClient redisClient(ClientResources clientResources) {
RedisURI redisURI = RedisURI.builder()
.withHost(host)
.withPort(6379)
.withSsl(true)
.withAuthentication(getCredentials())
.withTimeout(Duration.ofMillis(3000))
.build();

RedisClient client = RedisClient.create(clientResources, redisURI);
client.setOptions(createClientOptions());
return client;
}

@Bean
public CompletionStage cacheAsyncConnectionPool(RedisClient redisClient) {
RedisURI redisURI = RedisURI.builder()
.withHost(host)
.withPort(port)
.withSsl(true)
.withAuthentication(getCredentials())
.withTimeout(Duration.ofMillis(3000))
.build();

BoundedPoolConfig poolConfig = BoundedPoolConfig.builder()
.maxTotal(15)
.maxIdle(8)
.minIdle(3)
.testOnAcquire(true)
.testOnCreate(true)
.build();

return AsyncConnectionPoolSupport.createBoundedObjectPoolAsync(
() -> redisClient.connectAsync(StringCodec.UTF8, redisURI),
poolConfig);
}

private ClientOptions createClientOptions() {
return ClientOptions.builder()
.pingBeforeActivateConnection(true)
.socketOptions(SocketOptions.builder()
.connectTimeout(Duration.ofMillis(3000))
.keepAlive(true)
.tcpNoDelay(true)
.build())
.timeoutOptions(TimeoutOptions.builder()
.fixedTimeout(Duration.ofMillis(2000))
.build())
.build();
}

private RedisCredentialsProvider getCredentials() {
AWSCredentialsProvider awsCredentialsProvider = new DefaultAWSCredentialsProviderChain();
IAMAuthTokenRequest iamAuthTokenRequest = new IAMAuthTokenRequest(user, name, region, true);
return new RedisIAMAuthCredentialsProvider(
user, iamAuthTokenRequest, awsCredentialsProvider);
}
}

Подробнее здесь: https://stackoverflow.com/questions/798 ... ks-auto-sc
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»