共用方式為


使用 Azure 受控 Redis 進行連線復原

在本文中,我們將討論如何建立快取的穩固連線。

重試命令

設定用戶端連線以指數輪詢來重試命令。 如需詳細資訊,請參閱重試指導方針

Linux 型用戶端應用程式的 TCP 設定

在某些 Linux 版本中,預設 TCP 設定可能會導致 Redis 伺服器連線失敗時間超過 13 分鐘。 預設設定可防止用戶端應用程式偵測已關閉連線,並在連線未正常關閉時自動還原。

在網路連線中斷或因進行非計劃性維護而使 Redis 伺服器離線的情況下,可能無法重新建立連線。

建議使用這些 TCP 設定:

設定 價值觀
net.ipv4.tcp_retries2 5

如需有關該情境的詳細資訊,請參閱 在 Linux 上執行時,連線需 15 分鐘後才重新建立。 雖然此討論與 StackExchange.Redis 連結庫有關,但 Linux 上執行的其他客戶端連結庫也會受到影響。 說明仍然有用,通用於其他程式庫。

搭配使用 ForceReconnect 與 StackExchange.Redis

在罕見的情況下, StackExchange.Redis 在卸除連線之後無法重新連線。 在這些情況下,重新啟動用戶端或建立新的 ConnectionMultiplexer 可解決問題。 建議您使用單一 ConnectionMultiplexer 模式,同時允許應用程式定期強制重新連線。 看一下與應用程式使用的架構和平台最相符的快速入門範例專案。 您可以在我們的快速入門中看到此程式碼模式的範例。

ConnectionMultiplexer 的使用者必須處理因處置舊錯誤而可能發生的任何 ObjectDisposedException 錯誤。

ForceReconnectAsync()RedisConnectionExceptions 呼叫 RedisSocketExceptions。 您也可以對ForceReconnectAsync() 呼叫 RedisTimeoutExceptions,但僅限於使用寬裕的 ReconnectMinIntervalReconnectErrorThreshold 時。 否則,在因為已超載而逾時的伺服器上,建立新的連線可能導致連鎖失敗。

在 ASP.NET 應用程式中,您可以在 Microsoft.Extensions.Caching.StackExchangeRedis 套件中使用整合實作,而不是直接使用 StackExchange.Redis 套件。 如果您在 ASP.NET 應用程式中使用 Microsoft.Extensions.Caching.StackExchangeRedis

Microsoft.AspNetCore.Caching.StackExchangeRedis.UseForceReconnect = true

設定適當的逾時

關於連線復原,必須考慮兩個逾時值:連線逾時命令逾時

連接逾時

connect timeout 是用戶端等候與 Redis 伺服器建立連線的時間。 將用戶端程式庫設定為使用五秒的 connect timeout,讓系統即使在較高的 CPU 狀況下,也有足夠的時間連線。

較小的 connection timeout 值無法保證在該時間範圍內建立連線。 如果出現問題 (高用戶端 CPU、高伺服器 CPU 等),則較短的 connection timeout 值會導致連線嘗試失敗。 這種行為通常會雪上加霜。 較短的逾時會強制系統重新開始嘗試重新連線,導致「連線 -> 失敗 -> 重試」迴圈,不但沒幫助,反而使問題惡化。

命令逾時

大部分的用戶端程式庫都有另一個逾時設定,即 command timeouts,這是用戶端等候 Redis 伺服器回應的時間。 雖然建議初始設定少於五秒,但請根據您的情況和儲存在快取中的值大小,以考慮將 command timeout 設定為較高或較低。

如果 command timeout 太小,則連線可能不穩定。 但如果 command timeout 太大,則應用程式可能必須等很久,才知道命令是否會逾時。

避免用戶端連線尖峰

避免在連線中斷后重新連線時同時建立許多連線,因為建立新連線的速率有限。 就像短的連線逾時可能導致中斷較久一樣,同時開始許多重新連線嘗試也會增加伺服器負載,並使得所有用戶端花更長時間才成功重新連線。

如果您要重新連線許多客戶端實例,請考慮交錯新的連線,以避免您的新連線受到節流。

備註

當您使用 StackExchange.Redis 用戶端連結庫時,請將 設定abortConnectfalse 連接字串。 建議由 ConnectionMultiplexer 處理重新連線。 如需詳細資訊,請參閱 StackExchange.Redis 最佳做法

避免殘留連線

快取會限制每個快取層的用戶端連線數目。 請確定用戶端應用程式重新建立連線時會關閉並移除舊的連線。

復原的更多設計模式

針對復原套用設計模式。 如需詳細資訊,請參閱如何確保應用程式的復原性

閒置超時

Azure 受管理 Redis 設有 10 分鐘的閒置連線超時。 10 分鐘逾時可讓伺服器自動清除外洩連線或用戶端應用程式孤立的連線。 大部分 Redis 用戶端程式庫都有內建功能,定期傳送 heartbeatkeepalive 命令,以防止連線關閉,即使用戶端應用程式沒有要求也一樣。

如果您的連線閒置 10 分鐘有任何風險,請將 keepalive 間隔設定為小於 10 分鐘的值。 如果您應用程式使用的是對 keepalive 功能沒有原生支援的用戶端程式庫,您可以定期傳送 PING 命令,在應用程式中實作該功能。