Freigeben über


Verbindungsresilienz mit Azure Managed Redis (Vorschau)

Wiederholungsbefehle

Konfigurieren Ihrer Clientverbindungen für Wiederholungsbefehle mit exponentiellem Backoff Weitere Informationen finden Sie in den Wiederholungsrichtlinien.

TCP-Einstellungen für unter Linux gehostete Clientanwendungen

Die TCP-Standardeinstellungen bei einigen Linux-Versionen können dazu führen, dass Redis-Serververbindungen nach 13 Minuten oder mehr fehlschlagen. Die Standardeinstellungen können verhindern, dass die Clientanwendung geschlossene Verbindungen erkennt und diese automatisch wiederherstellt, wenn die Verbindung nicht ordnungsgemäß geschlossen wurde.

Der Fehler beim Wiederherstellen einer Verbindung kann in Situationen auftreten, in denen die Netzwerkverbindung unterbrochen oder der Redis-Server für eine nicht geplante Wartung offline geschaltet wird.

Es werden die folgenden TCP-Einstellungen empfohlen:

Einstellung Wert
net.ipv4.tcp_retries2 5

Weitere Informationen zu dem Szenario finden Sie unter Verbindung wird bei der Ausführung unter Linux für 15 Minuten nicht wiederhergestellt. Während sich diese Diskussion auf die StackExchange.Redis-Bibliothek bezieht, sind auch andere Clientbibliotheken betroffen, die unter Linux ausgeführt werden. Die Erläuterung ist immer noch nützlich, und Sie können sie hinsichtlich anderer Bibliotheken verallgemeinern.

Verwenden von ForceReconnect mit StackExchange.Redis

In seltenen Fällen kann StackExchange.Redis nach einer Verbindungsunterbrechung die Verbindung nicht mehr wiederherstellen. In diesen Fällen wird das Problem behoben, indem Sie den Client neu starten oder einen neuen ConnectionMultiplexer erstellen. Es wird empfohlen, ein ConnectionMultiplexer-Singletonmuster zu verwenden, wenn Sie Apps gestatten, eine erneute Verbindung in regelmäßigen Abständen zu erzwingen. Sehen Sie sich das Schnellstart-Beispielprojekt an, das am besten zu dem Framework und der Plattform passt, die Ihre Anwendung verwendet. Ein Beispiel für dieses Codemuster finden Sie in unseren Schnellstartanleitungen.

Benutzer von ConnectionMultiplexer müssen alle ObjectDisposedException-Fehler behandeln, die möglicherweise aufgrund des Verwerfens des alten Multiplexers auftreten.

Rufen Sie ForceReconnectAsync() für RedisConnectionExceptions und RedisSocketExceptions auf. Sie können auch ForceReconnectAsync() für RedisTimeoutExceptions aufrufen, aber nur, wenn Sie großzügige Werte für ReconnectMinInterval und ReconnectErrorThreshold verwenden. Andernfalls kann das Herstellen neuer Verbindungen zu einem kaskadierten Fehler auf einem Server führen, bei dem ein Timeout auftritt, weil er bereits überlastet ist.

In einer ASP.NET-Anwendung können Sie die integrierte Implementierung im Microsoft.Extensions.Caching.StackExchangeRedis -Paket verwenden, anstatt das StackExchange.Redis-Paket direkt zu verwenden. Wenn Sie Microsoft.Extensions.Caching.StackExchangeRedis in einer ASP.NET Anwendung verwenden, anstatt StackExchange.Redis direkt zu verwenden, können Sie die UseForceReconnect-Eigenschaft auf „true“ festlegen:

Microsoft.AspNetCore.Caching.StackExchangeRedis.UseForceReconnect = true

Konfigurieren von entsprechenden Timeouts

Zwei Timeoutwerte sind bei der Verbindungsresilienz wichtig: Connect timeout (Verbindungstimeout) und command timeout (Befehlstimeout).

Connect timeout

Das connect timeout ist die Zeit, die ein Client wartet, bis er eine Verbindung mit dem Redis-Server herstellt. Konfigurieren Sie Ihre Clientbibliothek so, dass sie ein connect timeout von fünf Sekunden verwendet, damit das System auch bei hoher CPU-Auslastung genügend Zeit hat, eine Verbindung herzustellen.

Bei einem niedrigeren connection timeout ist nicht sichergestellt, dass die Verbindung in diesem Zeitraum hergestellt werden kann. Bei Beeinträchtigungen (hohe Client- oder Server-CPU-Auslastung usw.) hat ein kurzer connection timeout-Wert zur Folge, dass bei dem Verbindungsversuch ein Fehler auftritt. Dieses Verhalten macht eine schlechte Situation häufig noch schlimmer. Statt zu helfen, verschlimmern kürzere Timeouts das Problem, weil sie einen Neustarten der Verbindungswiederherstellung erzwingen und damit zu einer Schleife Verbinden -> Fehler -> Wiederholen führen können.

Befehlstimeout

Die meisten Clientbibliotheken verfügen über eine weitere Timeoutkonfiguration für command timeouts. Dies ist die Zeitspanne, die der Client auf eine Antwort vom Redis-Server wartet. Wir empfehlen zwar eine anfängliche Einstellung von weniger als fünf Sekunden, aber sie sollten je nach Szenario und der Größe der Werte, die in Ihrem Cache gespeichert sind, den höheren oder niedrigeren command timeout festlegen.

Ist das command timeout zu kurz, kann die Verbindung instabil wirken. Wenn der command timeout-Wert jedoch zu groß ist, muss Ihre Anwendung möglicherweise lange warten, um herauszufinden, ob der Befehl einen Timeout verursacht.

Vermeiden von Spitzen bei Clientverbindungen

Vermeiden Sie das gleichzeitige Erstellen vieler Verbindungen, wenn die Verbindung nach einem Verbindungsverlust wiederhergestellt wird, da die Anzahl der neu erstellten Verbindungen begrenzt ist. Ähnlich wie kurze Verbindungstimeouts zu längeren Ausfällen führen können, kann das gleichzeitige Starten vieler Verbindungsversuche auch die Serverauslastung erhöhen und die Dauer der erfolgreichen Verbindungsherstellung für alle Clients verlängern.

Wenn Sie viele Clientinstanzen erneut verbinden, sollten Sie die neuen Verbindungen gestaffelt erstellen, um zu vermeiden, dass die neuen Verbindungen gedrosselt werden.

Hinweis

Wenn Sie die Clientbibliothek StackExchange.Redis verwenden, legen Sie abortConnect in der Verbindungszeichenfolge auf false fest. Wir empfehlen, ConnectionMultiplexer die Neuverbindung zu überlassen. Weitere Informationen finden Sie unter Bewährte Methoden für StackExchange.Redis.

Vermeiden Sie übrig bleibende Verbindungen

Caches weisen Grenzwerte für die Anzahl von Clientverbindungen pro Cacheebene auf. Stellen Sie sicher, dass die Clientanwendung Verbindungen, die sie schließt, neu erstellt und die alten Verbindungen entfernt.

Zeitplan für Wartungsfenster

Passen Sie Ihre Cacheeinstellungen an die Wartung an. Weitere Informationen zum Erstellen eines Wartungsfensters, um negative Auswirkungen auf Ihren Cache zu reduzieren, finden Sie unter Updatekanal und Planen von Updates.

Weitere Entwurfsmuster für Resilienz

Wenden Sie Entwurfsmuster für Resilienz an. Weitere Informationen finden Sie unter Wie mache ich meine Anwendung resilient.

Leerlauftimeout

Azure Managed Redis (Vorschau) verfügt über ein Timeout von 10 Minuten für Leerlaufverbindungen. Das Timeout von 10 Minuten ermöglicht es dem Server, fehlerhafte Verbindungen oder verwaiste Verbindungen einer Clientanwendung automatisch zu bereinigen. Die meisten Redis-Clientbibliotheken verfügen über eine integrierte Funktion zum regelmäßigen Senden von heartbeat- oder keepalive-Befehlen, um zu verhindern, dass Verbindungen geschlossen werden, auch wenn keine Anforderungen von der Clientanwendung vorliegen.

Wenn das Risiko besteht, dass Ihre Verbindungen 10 Minuten im Leerlauf verbleiben, konfigurieren Sie das keepalive-Intervall auf einen Wert von unter 10 Minuten. Wenn Ihre Anwendung eine Clientbibliothek verwendet, die keine native Unterstützung für keepalive-Funktionen bietet, können Sie diese in Ihrer Anwendung implementieren, indem Sie regelmäßig einen PING-Befehl senden.