Resiliência da ligação

Comandos de repetição

Configure as ligações do cliente para repetir comandos com um backoff exponencial. Para obter mais informações, veja Diretrizes de repetição.

Testar a resiliência

Teste a resiliência do sistema a quebras de ligação com um reinício para simular um patch. Para obter mais informações sobre como testar o desempenho, veja Testes de desempenho.

Definições de TCP para aplicações cliente alojadas no Linux

As predefinições de TCP em algumas versões do Linux podem fazer com que as ligações do servidor Redis falhem durante 13 minutos ou mais. As predefinições podem impedir que a aplicação cliente detete ligações fechadas e restaurá-las automaticamente se a ligação não tiver sido fechada corretamente.

A falha ao restabelecer uma ligação pode ocorrer em situações em que a ligação de rede é interrompida ou o servidor Redis fica offline para manutenção não planeada.

Recomendamos estas definições de TCP:

Definição Valor
net.ipv4.tcp_retries2 5

Para obter mais informações sobre o cenário, veja A ligação não estabelece novamente durante 15 minutos quando é executada no Linux. Embora este debate seja sobre a biblioteca StackExchange.Redis, outras bibliotecas de cliente em execução no Linux também são afetadas. A explicação ainda é útil e pode generalizar para outras bibliotecas.

Utilizar ForceReconnect com StackExchange.Redis

Em casos raros, StackExchange.Redis não consegue restabelecer a ligação depois de uma ligação ser removida. Nestes casos, reiniciar o cliente ou criar um novo ConnectionMultiplexer corrige o problema. Recomendamos que utilize um padrão singleton ConnectionMultiplexer ao mesmo tempo que permite que as aplicações forcem uma ligação periodicamente. Veja o projeto de exemplo de início rápido que melhor corresponde à arquitetura e plataforma que a sua aplicação utiliza. Pode ver um exemplo deste padrão de código nos nossos inícios rápidos.

Os utilizadores do ConnectionMultiplexer têm de lidar com quaisquer ObjectDisposedException erros que possam ocorrer como resultado da eliminação da antiga.

Chame ForceReconnectAsync() e RedisConnectionExceptionsRedisSocketExceptions. Também pode chamar ForceReconnectAsync() para RedisTimeoutExceptions, mas apenas se estiver a utilizar generosos ReconnectMinInterval e ReconnectErrorThreshold. Caso contrário, estabelecer novas ligações pode causar uma falha em cascata num servidor que está a exceder o tempo limite porque já está sobrecarregado.

Configurar tempos limite adequados

Dois valores de tempo limite são importantes a ter em conta na resiliência da ligação: tempo limite de ligação e tempo limite do comando.

Tempo limite da ligação

É connect timeout o momento em que o cliente aguarda para estabelecer uma ligação com o servidor Redis. Configure a biblioteca de cliente para utilizar um connect timeout de cinco segundos, dando ao sistema tempo suficiente para se ligar mesmo em condições de CPU mais elevadas.

Um valor pequeno connection timeout não garante que uma ligação seja estabelecida nesse período de tempo. Se algo correr mal (CPU de cliente elevada, CPU de servidor elevado, etc.), um valor curto connection timeout fará com que a tentativa de ligação falhe. Este comportamento muitas vezes piora a situação. Em vez de ajudar, tempos limite mais curtos agravam o problema ao forçar o sistema a reiniciar o processo de tentativa de restabelecimento de ligação, o que pode levar a um ciclo de ligação -> falha -> repetição .

Tempo limite do comando

A maioria das bibliotecas de cliente tem outra configuração de tempo limite para command timeouts, que é o momento em que o cliente aguarda uma resposta do servidor Redis. Embora recomendemos uma definição inicial inferior a cinco segundos, considere definir o valor mais alto ou inferior consoante o command timeout seu cenário e os tamanhos dos valores armazenados na cache.

Se for command timeout demasiado pequena, a ligação pode parecer instável. No entanto, se for command timeout demasiado grande, a sua aplicação poderá ter de esperar muito tempo para saber se o comando vai exceder ou não o tempo limite.

Evitar picos de ligações do cliente

Evite criar muitas ligações ao mesmo tempo ao restabelecer a ligação após uma perda de ligação. Semelhante à forma como os tempos limite de ligação curtos podem resultar em interrupções mais longas, iniciar muitas tentativas de restabelecimento de ligação ao mesmo tempo também pode aumentar a carga do servidor e prolongar o tempo que todos os clientes demoram a restabelecer ligação com êxito.

Se estiver a voltar a ligar várias instâncias de cliente, considere dimensionar as novas ligações para evitar um aumento acentuado do número de clientes ligados.

Nota

Quando utilizar a biblioteca de StackExchange.Redis cliente, defina abortConnect como false na cadeia de ligação. Recomendamos que deixe a ConnectionMultiplexer alça restabelecer a ligação. Para obter mais informações, veja StackExchange.Redis best practices (Melhores práticas do StackExchange.Redis).

Evitar ligações restantes

As caches têm limites no número de ligações de cliente por camada de cache. Certifique-se de que quando a aplicação cliente recria ligações que fecha e remove as ligações antigas.

Notificação de manutenção antecipada

Utilize notificações para saber mais sobre a manutenção futura. Para obter mais informações, consulte Posso ser notificado antes de uma manutenção planeada.

Agendar janela de manutenção

Ajuste as definições da cache para acomodar a manutenção. Para obter mais informações sobre como criar uma janela de manutenção para reduzir quaisquer efeitos negativos na cache, consulte Atualizar canal e Agendar atualizações.

Mais padrões de conceção para resiliência

Aplicar padrões de estrutura para resiliência. Para obter mais informações, veja Como devo proceder para tornar a minha aplicação resiliente.

Tempo limite de inatividade

Cache do Azure para Redis tem um tempo limite de 10 minutos para ligações inativas. O tempo limite de 10 minutos permite ao servidor limpar automaticamente ligações com fugas ou ligações órfãs por uma aplicação cliente. A maioria das bibliotecas de cliente redis tem uma capacidade incorporada de enviar heartbeat ou keepalive comandos periodicamente para impedir que as ligações sejam fechadas mesmo que não existam pedidos da aplicação cliente.

Se existir algum risco de as ligações ficarem inativas durante 10 minutos, configure o keepalive intervalo para um valor inferior a 10 minutos. Se a sua aplicação estiver a utilizar uma biblioteca de cliente que não tenha suporte nativo para keepalive funcionalidades, pode implementá-la na sua aplicação enviando periodicamente um PING comando.