全部產品
Search
文件中心

Tablestore:錯誤處理

更新時間:Jun 30, 2024

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

如果設定了CustomizedRetryFunc,則會優先判斷CustomizedRetryFunc的方法是否進行重試。

  • 如果未設定CustomizedRetryFunc,即CustomizedRetryFunc為nil,則SDK會執行預設重試邏輯。

  • 如果CustomizedRetryFunc的取值不為nil,且判定值為重試,則SDK會根據設定的自訂重試邏輯進行重試。

  • 如果CustomizedRetryFunc的取值不為nil,且判定值為不重試,則需要根據KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc的值做進一步判斷。

    • 如果KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc的取值為false,則不進行重試。

    • 如果KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc的取值為true,則繼續校正預設重試邏輯判斷是否進行重試。

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