As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Configuração do cliente Lettuce (Valkey e Redis) OSS
Esta seção descreve as opções de configuração recomendadas do Java e do Lettuce e como elas se aplicam aos ElastiCache clusters.
As recomendações nesta seção foram testadas com o Lettuce versão 6.2.2.
Tópicos
DNSCache Java TTL
A máquina virtual Java (JVM) armazena em cache as pesquisas de DNS nomes. Quando o JVM resolve um nome de host para um endereço IP, ele armazena o endereço IP em cache por um período de tempo especificado, conhecido como (). time-to-liveTTL
A escolha do TTL valor é uma troca entre latência e capacidade de resposta às mudanças. Com a versão mais curtaTTLs, DNS os resolvedores notam atualizações no cluster DNS mais rapidamente. Isso pode fazer com que sua aplicação responda com maior rapidez às substituições ou a outros fluxos de trabalho pelos quais seu cluster passa. No entanto, se TTL for muito baixo, ele aumentará o volume de consultas, o que pode aumentar a latência do seu aplicativo. Embora não haja um TTL valor correto, vale a pena considerar o tempo que você pode esperar até que uma alteração entre em vigor ao definir seu TTL valor.
Como ElastiCache os nós usam entradas de DNS nome que podem mudar, recomendamos que você configure seu JVM com um mínimo TTL de 5 a 10 segundos. Isso garante que, quando o endereço IP de um nó for alterado, seu aplicativo possa receber e usar o novo endereço IP do recurso solicitando a DNS entrada.
Em algumas configurações Java, o JVM padrão TTL é definido para que ele nunca atualize DNS as entradas até que JVM seja reiniciado.
Para obter detalhes sobre como definir seu JVMTTL, consulte Como definir JVM TTL o.
Versão do Lettuce
Recomendamos o Lettuce versão 6.2.2 ou posterior.
Endpoints
Quando você estiver usando clusters habilitados para o modo de cluster, defina o redisUri
como o endpoint de configuração do cluster. A DNS busca por isso URI retorna uma lista de todos os nós disponíveis no cluster e é resolvida aleatoriamente para um deles durante a inicialização do cluster. Para obter mais detalhes sobre como a atualização de topologia funciona, consulte dynamicRefreshResourcesmais adiante neste tópico.
SocketOption
Habilitar KeepAlive
Defina Tempo limite de conexão
ClusterClientOption: Opções de cliente habilitadas para o modo de cluster
Ative AutoReconnect
Conjunto CommandTimeout
nodeFilter
Por exemplo, depois que um failover é concluído e o cluster inicia o processo de recuperação, enquanto ele clusterTopology é atualizado, o mapa dos nós do barramento do cluster tem um curto período de tempo em que o nó inativo é listado como um FAIL nó, antes de ser completamente removido da topologia. Durante esse período, o cliente do Lettuce o considera um nódulo saudável e se conecta continuamente a ele. Isso causa uma falha após o término da nova tentativa.
Por exemplo:
final ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder() ... // other options .nodeFilter(it -> ! (it.is(RedisClusterNode.NodeFlag.FAIL) || it.is(RedisClusterNode.NodeFlag.EVENTUAL_FAIL) || it.is(RedisClusterNode.NodeFlag.HANDSHAKE) || it.is(RedisClusterNode.NodeFlag.NOADDR))) .validateClusterNodeMembership(false) .build(); redisClusterClient.setOptions(clusterClientOptions);
nota
A filtragem de nós é melhor usada com DynamicRefreshSources definida como verdadeira. Do contrário, se a visualização da topologia for obtida de um único nó inicial problemático, que vê um nó primário de algum fragmento com o status de falha, ela filtrará esse nó primário, o que causará a falta de cobertura dos slots. Ter vários nós iniciais (quando DynamicRefreshSources é verdade) reduz a probabilidade desse problema, pois pelo menos alguns dos nós iniciais devem ter uma visão de topologia atualizada após um failover com o primário recém-promovido.
ClusterTopologyRefreshOptions: Opções para controlar a atualização da topologia do cluster do cliente habilitado para o modo de cluster
nota
Os clusters com modo de cluster desabilitado não dão suporte a comandos de descoberta do cluster nem são compatíveis com a funcionalidade de descoberta da topologia dinâmica de todos os clientes.
O modo de cluster desativado com ElastiCache não é compatível com o Lettuce's. MasterSlaveTopologyRefresh
Em vez disso, para o modo de cluster desabilitado, você pode configurar um StaticMasterReplicaTopologyProvider
e fornecer os endpoints de leitura e gravação do cluster.
Para obter mais informações sobre a conexão com clusters no modo de cluster desabilitado, consulte Encontrando os endpoints de um cluster Valkey ou Redis OSS (modo de cluster desativado) (console).
Se quiser usar a funcionalidade de descoberta da topologia dinâmica do Lettuce, você poderá criar um cluster com modo de cluster habilitado com a mesma configuração de fragmento do cluster existente. No entanto, para clusters habilitados no modo de cluster, recomendamos configurar pelo menos três fragmentos com no mínimo uma réplica para oferecer compatibilidade com failover rápido.
Habilitar enablePeriodicRefresh
Com essa opção habilitada, você pode reduzir a latência associada à atualização da topologia do cluster adicionando esse trabalho a uma tarefa em segundo plano. Embora a atualização da topologia seja executada em um trabalho em segundo plano, ela pode ser um pouco lenta para clusters com muitos nós. Isso ocorre porque todos os nós estão sendo consultados para obter a visualização mais atualizada do cluster. Se você executa um cluster grande, é recomendável aumentar o período.
Habilitar enableAllAdaptiveRefreshTriggers
Habilitar closeStaleConnections
Habilitar dynamicRefreshResources
A atualização dinâmica consulta todos os nós descobertos para a topologia do cluster e tenta escolher a visualização mais precisa do cluster. Se for definido como falso, somente os nós iniciais serão usados como fontes para a descoberta da topologia e o número de clientes será obtido apenas para os nós iniciais. Quando desabilitado, se o endpoint de configuração do cluster for resolvido em um nó com falha, a tentativa de atualizar a visualização do cluster falhará e causará exceções. Esse cenário pode ocorrer porque demora até que a entrada de um nó com falha seja removida do endpoint de configuração do cluster. Portanto, o endpoint de configuração ainda pode ser resolvido aleatoriamente em um nó com falha por um curto período.
No entanto, quando está habilitado, usamos todos os nós do cluster recebidos da visualização do cluster para consultar a visualização atual. Como filtramos os nós com falha nessa visualização, a atualização da topologia será bem-sucedida. No entanto, quando dynamicRefreshSources é verdade, o Lettuce consulta todos os nós para obter a visualização do cluster e, em seguida, compara os resultados. Portanto, isso pode ser caro para clusters com muitos nós. Sugerimos que você desabilite esse recurso para clusters com muitos nós.
final ClusterTopologyRefreshOptions topologyOptions = ClusterTopologyRefreshOptions.builder() .enableAllAdaptiveRefreshTriggers() .enablePeriodicRefresh() .dynamicRefreshSources(true) .build();
ClientResources
Configure DnsResolver
Configure reconnectDelay
ClientResources clientResources = DefaultClientResources.builder() .dnsResolver(new DirContextDnsResolver()) .reconnectDelay( Delay.fullJitter( Duration.ofMillis(100), // minimum 100 millisecond delay Duration.ofSeconds(10), // maximum 10 second delay 100, TimeUnit.MILLISECONDS)) // 100 millisecond base .build();
Tempos limite
Use um valor de tempo limite de conexão menor do que o tempo limite do comando. O Lettuce utiliza uma conexão preguiçosa. Portanto, se o tempo limite de conexão for maior do que o tempo limite do comando, você poderá ter um período de falha persistente após uma atualização da topologia se o Lettuce tentar se conectar a um nó não íntegro e o tempo limite do comando sempre for excedido.
Utilize um tempo limite de comando dinâmico para comandos diferentes. Recomendamos definir o tempo limite do comando com base na duração esperada do comando. Por exemplo, use um tempo limite maior para comandos que iteram em várias chaves, como scriptsFLUSHDB,FLUSHALL, KEYSSMEMBERS, ou Lua. Use tempos limite mais curtos para comandos de tecla únicaSET, comoGET, e. HSET
nota
Os tempos limite configurados no exemplo a seguir são para testes que executaram GET comandosSET/com chaves e valores de até 20 bytes. O tempo de processamento pode ser maior quando os comandos são complexos ou quando as chaves e os valores são maiores. Você deve definir os tempos limite com base no caso de uso de sua aplicação.
private static final Duration META_COMMAND_TIMEOUT = Duration.ofMillis(1000); private static final Duration DEFAULT_COMMAND_TIMEOUT = Duration.ofMillis(250); // Socket connect timeout should be lower than command timeout for Lettuce private static final Duration CONNECT_TIMEOUT = Duration.ofMillis(100); SocketOptions socketOptions = SocketOptions.builder() .connectTimeout(CONNECT_TIMEOUT) .build(); class DynamicClusterTimeout extends TimeoutSource { private static final Set<ProtocolKeyword> META_COMMAND_TYPES = ImmutableSet.<ProtocolKeyword>builder() .add(CommandType.FLUSHDB) .add(CommandType.FLUSHALL) .add(CommandType.CLUSTER) .add(CommandType.INFO) .add(CommandType.KEYS) .build(); private final Duration defaultCommandTimeout; private final Duration metaCommandTimeout; DynamicClusterTimeout(Duration defaultTimeout, Duration metaTimeout) { defaultCommandTimeout = defaultTimeout; metaCommandTimeout = metaTimeout; } @Override public long getTimeout(RedisCommand<?, ?, ?> command) { if (META_COMMAND_TYPES.contains(command.getType())) { return metaCommandTimeout.toMillis(); } return defaultCommandTimeout.toMillis(); } } // Use a dynamic timeout for commands, to avoid timeouts during // cluster management and slow operations. TimeoutOptions timeoutOptions = TimeoutOptions.builder() .timeoutSource( new DynamicClusterTimeout(DEFAULT_COMMAND_TIMEOUT, META_COMMAND_TIMEOUT)) .build();