Springboot версии 3.4.5
Lettuce версии 6.8.1.RELEASE
Бессерверный Elasticache Valkey с использованием аутентификации IAM
Обнаружено странное поведение во время нагрузочного теста. Когда автоматическое масштабирование задач ECS запускается при высокой нагрузке (ЦП > 50%) в течение 500 об/с,
- задержка API резко возрастает.
- Тайм-аут вызовов API составляет 504.
- команды Elasticache завершаются сбоем из-за тайм-аута соединения, тайм-аута команды.
- Проверка работоспособности задач Ecs не выполняется, и задачи создаются/уничтожаются непрерывно в цикле для некоторое время
Политика автоматического масштабирования срабатывает, когда:
Загрузка ЦП >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
Мобильная версия