使用 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
錯誤。
對 RedisConnectionExceptions
和 RedisSocketExceptions
呼叫 ForceReconnectAsync()
。 您也可以對RedisTimeoutExceptions
呼叫 ForceReconnectAsync()
,但僅限於使用寬裕的 ReconnectMinInterval
和 ReconnectErrorThreshold
時。 否則,在因為已超載而逾時的伺服器上,建立新的連線可能導致連鎖失敗。
在 ASP.NET 應用程式中,您可以在 Microsoft.Extensions.Caching.StackExchangeRedis 套件中使用整合實作,而不是直接使用 StackExchange.Redis 套件。 如果您在 ASP.NET 應用程式中使用 Microsoft.Extensions.Caching.StackExchangeRedis,而不是直接使用 StackExchange.Redis,您可以將 屬性設定UseForceReconnect
為 true:
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 用戶端連結庫時,請在 連接字串 中設定abortConnect
為 false
。 建議由 ConnectionMultiplexer
處理重新連線。 如需詳細資訊,請參閱 StackExchange.Redis 最佳做法。
避免殘留連線
快取會限制每個快取層的用戶端連線數目。 請確定用戶端應用程式重新建立連線時會關閉並移除舊的連線。
排程維護時段
調整快取設定以順應維護。 如需建立維護時段以減少對快取造成任何負面影響的詳細資訊,請參閱更新通道和排程更新。
復原的更多設計模式
針對復原套用設計模式。 如需詳細資訊,請參閱如何確保應用程式的復原性。
閒置逾時
Azure 受控 Redis (預覽版) 有 10 分鐘的閒置連線逾時。 10 分鐘逾時可讓伺服器自動清除外洩連線或用戶端應用程式孤立的連線。 大部分 Redis 用戶端程式庫都有內建功能,定期傳送 heartbeat
或 keepalive
命令,以防止連線關閉,即使用戶端應用程式沒有要求也一樣。
如果您的連線閒置 10 分鐘有任何風險,請將 keepalive
間隔設定為小於 10 分鐘的值。 如果您應用程式使用的是對 keepalive
功能沒有原生支援的用戶端程式庫,您可以定期傳送 PING
命令,在應用程式中實作該功能。