引發暫時性故障的原因
原因 | 說明 |
故障觸發了高可用機制 | 雲資料庫 Tair(相容 Redis)支援節點健康狀態監測,當監測到執行個體中的主節點不可用時,會自動觸發主備切換,例如將主節點和從節點進行互換,保障執行個體的高可用性。此時,用戶端可能會遇到下列暫時性故障: |
慢查詢引起了請求堵塞 | 執行時間複雜度為O(N)的操作,引發慢查詢和請求的堵塞,此時,用戶端發起的其他請求可能出現暫時性失敗。 |
複雜的網路環境 | 由於用戶端與服務端之間複雜網路環境引起,可能出現偶發的網路抖動、資料重傳等問題,此時,用戶端發起的請求可能會出現暫時性失敗。 |
推薦的重試準則
重試準則 | 說明 |
僅重試等冪的操作 | 由於逾時可能發生在下述任一階段: 如果執行重試可能導致某個操作在服務端中被重複執行,因此不是所有操作均適合設計重試機制。通常推薦僅重試等冪的操作,例如SET操作,即多次執行SET a b命令,那麼a的值只可能是b或執行失敗;如果執行LPUSH mylist a則不是等冪的,可能導致mylist中包含多個a元素。 |
適當的重試次數與間隔 | 根據業務需求和實際情境調整適當的重試次數與間隔,否則可能引發下述問題: 常見的稍候再試方式包括立即重試、固定時間重試、指數增加時間重試、隨機時間重試等。 |
避免重試嵌套 | 避免重試嵌套,否則可能會導致重複的重試且無法停止。 |
記錄重試異常並列印失敗報告 | 在重試過程中,建議在WARN層級上列印重試錯誤記錄檔,同時,僅在重試失敗時列印異常資訊。 |
Jedis
建議使用Jedis 4.0.0及以上版本,推薦使用最新的Jedis版本,以下代碼為Jedis 5.0.0的重試樣本。
添加Jedis的Pom依賴。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.0.0</version>
</dependency>
重試程式碼範例。
Redisson
Redisson用戶端提供了兩個參數來控制重試邏輯:
重試樣本如下:
Config config = new Config();
config.useSingleServer()
.setTimeout(1000)
.setRetryAttempts(3)
.setRetryInterval(1500)
.setAddress("redis://127.0.0.1:6379");
RedissonClient connect = Redisson.create(config);
StackExchange.Redis
StackExchang.Redis用戶端目前僅支援重試時串連,重試樣本如下:
var conn = ConnectionMultiplexer.Connect("redis0:6380,redis1:6380,connectRetry=3");
Lettuce
Lettuce用戶端未提供在命令逾時後重試的參數,但是您可以通過下述參數來實現命令重試策略:
重試樣本:
clientOptions.isAutoReconnect() ? Reliability.AT_LEAST_ONCE : Reliability.AT_MOST_ONCE;