Verbindingstolerantie
Opdrachten voor opnieuw proberen
Configureer uw clientverbindingen om opdrachten opnieuw uit te voeren met exponentieel uitstel. Zie richtlijnen voor opnieuw proberen voor meer informatie.
Tolerantie testen
Test de tolerantie van uw systeem voor verbindingsonderbrekingen met behulp van opnieuw opstarten om een patch te simuleren. Zie Prestatietests voor meer informatie over het testen van uw prestaties.
TCP-instellingen voor door Linux gehoste clienttoepassingen
De standaard TCP-instellingen in sommige Linux-versies kunnen ertoe leiden dat Redis-serververbindingen 13 minuten of langer mislukken. De standaardinstellingen kunnen voorkomen dat de clienttoepassing gesloten verbindingen detecteert en deze automatisch herstelt als de verbinding niet correct is gesloten.
De fout bij het herstellen van een verbinding kan optreden in situaties waarin de netwerkverbinding wordt onderbroken of de Redis-server offline gaat voor ongepland onderhoud.
We raden deze TCP-instellingen aan:
Instelling | Weergegeven als |
---|---|
net.ipv4.tcp_retries2 |
5 |
Zie Verbinding maken ion 15 minuten niet opnieuw tot stand wordt gebracht bij het uitvoeren van Linux voor meer informatie over het scenario. Hoewel deze discussie gaat over de StackExchange.Redis-bibliotheek , worden ook andere clientbibliotheken op Linux beïnvloed. De uitleg is nog steeds nuttig en u kunt generaliseren naar andere bibliotheken.
ForceReconnect gebruiken met StackExchange.Redis
In zeldzame gevallen kan StackExchange.Redis niet opnieuw verbinding maken nadat een verbinding is verbroken. In deze gevallen start u de client opnieuw op of maakt u een nieuwe ConnectionMultiplexer
oplossing voor het probleem. U wordt aangeraden een singleton-patroon ConnectionMultiplexer
te gebruiken, terwijl apps periodiek opnieuw verbinding kunnen maken. Bekijk het quickstart-voorbeeldproject dat het beste overeenkomt met het framework en het platform dat uw toepassing gebruikt. In onze quickstarts ziet u een voorbeeld van dit codepatroon.
Gebruikers van de ConnectionMultiplexer
app moeten eventuele ObjectDisposedException
fouten afhandelen die kunnen optreden als gevolg van het verwijderen van de oude.
Bellen ForceReconnectAsync()
naar RedisConnectionExceptions
en RedisSocketExceptions
. Je kunt ook bellen ForceReconnectAsync()
, RedisTimeoutExceptions
maar alleen als je genereus ReconnectMinInterval
en ReconnectErrorThreshold
. Anders kan het tot stand brengen van nieuwe verbindingen een trapsgewijze fout veroorzaken op een server die een time-out optreedt omdat deze al overbelast is.
In een ASP.NET-toepassing kunt u geïntegreerde implementatie gebruiken in het pakket Microsoft.Extensions.Caching.StackExchangeRedis in plaats van het StackExchange.Redis-pakket rechtstreeks te gebruiken. Als u Microsoft.Extensions.Caching.StackExchangeRedis gebruikt in een ASP.NET toepassing in plaats van StackExchange.Redis rechtstreeks te gebruiken, kunt u de UseForceReconnect
eigenschap instellen op true:
Microsoft.AspNetCore.Caching.StackExchangeRedis.UseForceReconnect = true
De juiste time-outs configureren
Twee time-outwaarden zijn belangrijk om rekening mee te houden in de verbindingstolerantie: time-out en time-out voor opdrachten verbinden.
time-out voor Verbinding maken
Dit connect timeout
is het tijdstip waarop uw client wacht om verbinding te maken met redis-server. Configureer uw clientbibliotheek voor het gebruik van een connect timeout
periode van vijf seconden, waardoor het systeem voldoende tijd heeft om verbinding te maken, zelfs onder hogere CPU-omstandigheden.
Een kleine connection timeout
waarde garandeert niet dat er in dat tijdsbestek een verbinding tot stand wordt gebracht. Als er iets misgaat (een hoog CPU-clientgebruik, een hoog CPU-gebruik van de server, enzovoort), zorgt een korte connection timeout
waarde ervoor dat de verbindingspoging mislukt. Dit gedrag maakt vaak een slechte situatie erger. In plaats van te helpen, verergeren kortere time-outs het probleem door het systeem te dwingen het proces van opnieuw verbinding te starten, wat kan leiden tot een verbinding -> mislukt - lus voor> opnieuw proberen .
Time-out van opdracht
De meeste clientbibliotheken hebben een andere time-outconfiguratie. command timeouts
Dit is het tijdstip waarop de client wacht op een reactie van de Redis-server. Hoewel we een eerste instelling van minder dan vijf seconden aanbevelen, kunt u overwegen om de command timeout
hogere of lagere instelling in te stellen, afhankelijk van uw scenario en de grootten van de waarden die zijn opgeslagen in uw cache.
Als de command timeout
verbinding te klein is, kan de verbinding er instabiel uitzien. Als de command timeout
toepassing echter te groot is, moet uw toepassing mogelijk lang wachten om erachter te komen of er een time-out optreedt voor de opdracht.
Pieken in clientverbindingen voorkomen
Vermijd het maken van veel verbindingen tegelijk wanneer u opnieuw verbinding maakt na verlies van een verbinding. Net als bij de manier waarop korte verbindingstime-outs kunnen leiden tot langere storingen, kan het starten van veel nieuwe verbindingspogingen tegelijkertijd ook de serverbelasting verhogen en uitbreiden hoe lang het duurt voordat alle clients opnieuw verbinding kunnen maken.
Als u verbinding maakt met veel clientexemplaren, kunt u overwegen de nieuwe verbindingen te sluizen om een steile piek in het aantal verbonden clients te voorkomen.
Notitie
Wanneer u de StackExchange.Redis-clientbibliotheek gebruikt, ingesteld abortConnect
op false
in uw verbindingsreeks. We raden u aan de ConnectionMultiplexer
ingang opnieuw verbinding te laten maken. Zie de best practices voor StackExchange.Redis voor meer informatie.
Overblijvende verbindingen voorkomen
Caches hebben limieten voor het aantal clientverbindingen per cachelaag. Zorg ervoor dat wanneer uw clienttoepassing opnieuw verbindingen maakt die worden gesloten en de oude verbindingen verwijdert.
Melding van vooraf onderhoud
Gebruik meldingen om meer te weten te komen over gepland onderhoud. Zie Kan ik vooraf op de hoogte worden gesteld van een gepland onderhoud voor meer informatie.
Onderhoudsvenster plannen
Pas de cache-instellingen aan om onderhoud mogelijk te maken. Zie Updatekanaal en Planningsupdates voor meer informatie over het maken van een onderhoudsvenster om negatieve gevolgen voor uw cache te verminderen.
Meer ontwerppatronen voor tolerantie
Ontwerppatronen toepassen op tolerantie. Zie Hoe kan ik mijn toepassing tolerant maken voor meer informatie.
Time-out voor inactiviteit
Azure Cache voor Redis heeft een time-out van 10 minuten voor niet-actieve verbindingen. Met de time-out van 10 minuten kan de server lekkende verbindingen of verbindingen die zijn zwevend door een clienttoepassing automatisch opschonen. De meeste Redis-clientbibliotheken hebben een ingebouwde mogelijkheid om periodiek te verzenden heartbeat
of keepalive
opdrachten uit te voeren om te voorkomen dat verbindingen worden gesloten, zelfs als er geen aanvragen van de clienttoepassing zijn.
Als er een risico bestaat dat uw verbindingen 10 minuten inactief zijn, configureert u het keepalive
interval in minder dan 10 minuten. Als uw toepassing gebruikmaakt van een clientbibliotheek die geen systeemeigen ondersteuning voor keepalive
functionaliteit heeft, kunt u deze in uw toepassing implementeren door periodiek een PING
opdracht te verzenden.