Table StoreGo SDK目前採用“異常”的方式處理錯誤。本文介紹了Table Store錯誤處理方式、異常處理資訊和出錯時的重試策略。
方式
Table StoreGo SDK目前採用“異常”的方式處理錯誤,如果調用介面沒有拋出異常,則說明操作成功,否則失敗。
批量相關介面,例如BatchGetRow和BatchWriteRow不僅需要判斷是否有異常,還需要檢查每行的狀態是否成功,只有全部成功後才能保證整個介面調用是成功的。
異常
在使用Table StoreGo SDK時,異常通常作為方法傳回值的第二個參數返回。因此,在擷取返回資料前,您需要檢查err
參數是否有值。
如果是Table Store服務端報錯,err
中會包含requestId
,它是一個用於唯一標識該次請求的UUID。如果您無法解決問題,請記錄此requestId
並提交工單。
異常處理的程式碼範例如下:
client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
listTables, err := client.ListTable()
if err != nil {
// 異常處理。
fmt.Println(err.Error())
} else {
// 無異常。
for _, table := range listTables.TableNames {
fmt.Println("TableName: ", table)
}
}
重試
Go SDK提供了預設重試策略,您也可以根據需要自訂重試邏輯。
預設重試策略
當發生流控類錯誤或者是讀操作相關的服務端內部錯誤時,Go SDK會進行退避重試,預設的重試最大次數為10次,預設的重試總時間長度為5秒。您可以通過修改tablestore.TableStoreConfig
來設定預設重試的參數。具體參數說明請參見下表。
參數 | 說明 | 預設值 |
RetryTimes | 最大的重試次數。 | 10 |
MaxRetryTime | 重試最大總時間長度。 | 5s |
DefaultRetryInterval | 指數退避重試策略的抖動值,以避免多個故障用戶端在同一時間點發起重試請求。 | 10 ms |
MaxRetryInterval | 兩次重試之間的最大時間間隔。 | 320 ms |
Transport | 管理HTTP用戶端的底層傳輸屬性,預設為nil。 如果設定了該參數,則HTTPTimeout.ConnectionTimeout、MaxIdleConnections、IdleConnTimeout參數不生效。 | nil |
HTTPTimeout.ConnectionTimeout | HTTP建立新的網路連接時的逾時時間長度。 | 15s |
HTTPTimeout.RequestTimeout | HTTP用戶端發起請求並等待伺服器響應的最長時間。 | 30s |
MaxIdleConnections | HTTP host的最大空閑串連數。 | 2000 |
IdleConnTimeout | HTTP host空閑串連在串連池中保持開啟狀態但未被複用的最大時間長度。 | 25s |
使用者自訂重試邏輯
如果您希望在預設重試邏輯的基礎上進行一些改造或者是完全自訂重試邏輯,您可以通過設定TableStoreClient
的以下參數實現。
參數 | 說明 | 預設值 |
CustomizedRetryFunc | 如果設定了
| nil |
KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc | true |
自訂重試邏輯的樣本如下:
針對所有錯誤都進行重試
以下樣本用於對所有錯誤都進行重試。
func alwaysRetry(errorCode string, errorMsg string, action string, httpStatus int) bool {
return true
}
func main() {
client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
client.CustomizedRetryFunc = alwaysRetry
// do something
}
針對所有錯誤都不進行重試
以下樣本用於對所有錯誤都不進行重試。
func alwaysNotRetry(errorCode string, errorMsg string, action string, httpStatus int) bool {
return false
}
func main() {
client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
client.CustomizedRetryFunc = alwaysNotRetry
client.KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc = false
// do something
}
重試時進行回調
如果需要在SDK進行重試時進行一些預定義的操作,您可以通過設定TableStoreClient
的以下參數實現。
參數 | 說明 | 預設值 |
RetryNotify | SDK重試時會觸發的回調方法。 | nil |
以下樣本展示了如何針對每一次請求設定一個業務側的traceID,在發生重試時列印此traceID。
func userRetryNotify(traceId, requestId string, err error, action string, backoffDuration time.Duration) {
// 使用者自訂邏輯,在重試時會觸發調用。
fmt.Println("Retry for traceId: " + traceId + ", timestamp: " + strconv.FormatInt(time.Now().UnixNano(), 10))
}
func alwaysRetry(errorCode string, errorMsg string, action string, httpStatus int) bool {
return true
}
func main() {
client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
client.CustomizedRetryFunc = alwaysRetry
client.RetryNotify = userRetryNotify
request := &tablestore.DescribeTableRequest{TableName: "tableNotExist"}
// 佈建要求的業務側traceID。
request.ExtraRequestInfo.SetTraceID("test_TraceId_" + strconv.FormatInt(time.Now().UnixNano(), 10))
// do something
res, err := client.DescribeTable(request)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println(res.ResponseInfo.RequestId)
}
}
返回結果樣本如下:
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752655394000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752683437000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752708603000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752760519000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752814590000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097752916539000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097753110943000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097753454311000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097753798531000
Retry for traceId: test_TraceId_1711097752255675000, timestamp: 1711097754165411000
OTSObjectNotExist Requested table does not exist. 0006143b-fdd6-5050-10ef-700b045590fc