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á.
Práticas recomendadas para usar réplicas de leitura
Muitos aplicativos, como armazenamentos de sessões, tabelas de classificação e mecanismos de recomendação, exigem alta disponibilidade e lidam com muito mais operações de leitura do que operações de gravação. Esses aplicativos geralmente podem tolerar dados um pouco obsoletos (consistência eventual), o que significa que é aceitável que usuários diferentes vejam momentaneamente versões ligeiramente diferentes dos mesmos dados. Por exemplo:
Os resultados das consultas em cache geralmente podem tolerar dados um pouco obsoletos, especialmente para padrões de armazenamento em cache, nos quais a fonte da verdade é externa.
Em uma tabela de classificação de jogos, alguns segundos de atraso nas pontuações atualizadas geralmente não afetam significativamente a experiência do usuário.
Para armazenamentos de sessões, alguns pequenos atrasos na propagação dos dados da sessão entre réplicas raramente afetam a funcionalidade do aplicativo.
Os mecanismos de recomendação geralmente usam análise de dados históricos, portanto, a consistência em tempo real é menos crítica.
A consistência eventual significa que todos os nós de réplica eventualmente retornarão os mesmos dados quando o processo de replicação for concluído, normalmente em milissegundos. Para esses casos de uso, implementar réplicas de leitura é uma estratégia eficaz para reduzir a latência ao ler a partir da sua ElastiCache instância.
O uso de réplicas de leitura na Amazon ElastiCache pode oferecer benefícios significativos de desempenho por meio de:
Escalabilidade de leitura aprimorada
Distribui as operações de leitura em vários nós de réplica
Descarrega o tráfego de leitura do nó primário
Reduz a latência de leitura ao atender solicitações de réplicas geograficamente mais próximas
Desempenho otimizado do nó primário
Dedica recursos do nó primário às operações de gravação
Reduz a sobrecarga de conexão no nó primário
Melhora o desempenho de gravação e mantém melhores tempos de resposta durante os períodos de pico de tráfego
Usando a leitura da réplica sem servidor ElastiCache
ElastiCache O serverless fornece dois endpoints diferentes, para diferentes requisitos de consistência. Os dois endpoints usam o mesmo nome de DNS, mas portas diferentes. Para usar a read-from-replica porta, você deve autorizar o acesso às duas portas do seu aplicativo cliente configurando os grupos de segurança e as listas de controle de acesso à rede da sua VPC.
Endpoint primário (porta 6379)
Use para operações que exigem consistência imediata
Garante a leitura da maioria dos up-to-date dados
Ideal para transações críticas e operações de gravação
Necessário para operações de gravação
Example:
test-12345.serverless.use1.cache.amazonaws.com:6379
Endpoint otimizado para latência (porta 6380)
Otimizado para operações de leitura que podem tolerar uma eventual consistência
Quando possível, o ElastiCache serverless encaminha automaticamente as solicitações de leitura para o nó de réplica na zona de disponibilidade local do cliente. Essa otimização fornece menor latência ao evitar a latência adicional de rede resultante da recuperação de dados de um nó em uma zona de disponibilidade diferente.
ElastiCache serverless seleciona automaticamente os nós disponíveis em outras zonas se um nó local não estiver disponível
Example:
test-12345.serverless.use1.cache.amazonaws.com:6380
Clientes como Glide e Lettuce detectarão e rotearão automaticamente as leituras para o endpoint com latência otimizada se você fornecer a leitura da configuração da réplica. Se seu cliente não oferece suporte à configuração de roteamento (por exemplo, valkey-java e versões mais antigas do jedis), você deve definir a porta e a configuração do cliente corretas para ler as réplicas.
Conectando-se a réplicas de leitura em ElastiCache Serverless - Valkey and Glide
O trecho de código a seguir mostra como você pode configurar a leitura da réplica para ElastiCache Serverless na biblioteca Valkey glide. Você não precisa especificar a porta para leitura das réplicas, mas precisa configurar a configuração de roteamento. ReadFrom.PREFER_REPLICA
package glide.examples; import glide.api.GlideClusterClient; import glide.api.logging.Logger; import glide.api.models.configuration.GlideClusterClientConfiguration; import glide.api.models.configuration.NodeAddress; import glide.api.models.exceptions.ClosingException; import glide.api.models.exceptions.ConnectionException; import glide.api.models.exceptions.TimeoutException; import glide.api.models.configuration.ReadFrom; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; public class ClusterExample { public static void main(String[] args) { // Set logger configuration Logger.setLoggerConfig(Logger.Level.INFO); GlideClusterClient client = null; try { System.out.println("Connecting to Valkey Glide..."); // Configure the Glide Client GlideClusterClientConfiguration config = GlideClusterClientConfiguration.builder() .address(NodeAddress.builder() .host("your-endpoint") .port(6379) .build()) .useTLS(true) .readFrom(ReadFrom.PREFER_REPLICA) .build(); // Create the GlideClusterClient client = GlideClusterClient.createClient(config).get(); System.out.println("Connected successfully."); // Perform SET operation CompletableFuture<String> setResponse = client.set("key", "value"); System.out.println("Set key 'key' to 'value': " + setResponse.get()); // Perform GET operation CompletableFuture<String> getResponse = client.get("key"); System.out.println("Get response for 'key': " + getResponse.get()); // Perform PING operation CompletableFuture<String> pingResponse = client.ping(); System.out.println("PING response: " + pingResponse.get()); } catch (ClosingException | ConnectionException | TimeoutException | ExecutionException e) { System.err.println("An exception occurred: "); e.printStackTrace(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { // Close the client connection if (client != null) { try { client.close(); System.out.println("Client connection closed."); } catch (ClosingException | ExecutionException e) { System.err.println("Error closing client: " + e.getMessage()); } } } } }