すべてのプロダクト
Search
ドキュメントセンター

Tablestore:エラー処理

最終更新日:Dec 28, 2024

Tablestore Go SDK は、エラーを例外として処理します。このトピックでは、Tablestore Go SDK のエラー処理方法とリトライポリシーについて説明します。

メソッド

Tablestore Go SDK は、エラーを例外として処理します。操作で例外がスローされない場合、操作は成功です。操作で例外がスローされた場合、操作は失敗です。

説明

BatchGetRow や BatchWriteRow などのバッチ操作は、システムが例外が返されていないことを確認し、各行のステータスが成功である場合にのみ成功します。

例外

Go 用の Tablestore SDK を使用する場合、err パラメーターはレスポンスの 2 番目のパラメーターとして返されます。操作結果を取得する前に、err パラメーターに値が返されているかどうかを確認する必要があります。

サーバー側でエラーが発生した場合、requestIderr パラメーターに返されます。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)
    }
}

リトライ

Tablestore Go SDK は、デフォルトのリトライポリシーを提供します。カスタムリトライポリシーを作成することもできます。

デフォルトのリトライポリシー

書き込み操作に関連するスロットリングエラーまたは内部サーバーエラーが発生した場合、Tablestore SDK for Go は、指数バックオフを使用して 5 秒以内に最大 10 回自動的に再試行を実行します。 tablestore.TableStoreConfig を設定して、デフォルトの再試行パラメーターを変更できます。次の表にパラメーターを示します。

パラメーター

説明

デフォルト値

RetryTimes

最大リトライ回数。

10

MaxRetryTime

リトライされた操作の実行が許可される最大時間。

5 秒

DefaultRetryInterval

指数バックオフリトライポリシーのジッター値。これにより、複数のクライアントから送信された同時リトライリクエストが防止されます。

10 ミリ秒

MaxRetryInterval

2 回のリトライ間の最大間隔。

320 ミリ秒

Transport

HTTP クライアントのトランスポート属性。デフォルト値:nil。

このパラメーターを指定した場合、HTTPTimeout.ConnectionTimeout、MaxIdleConnections、および IdleConnTimeout パラメーターは有効になりません。

nil

HTTPTimeout.ConnectionTimeout

HTTP 接続が確立されるまでの最大時間。

15 秒

HTTPTimeout.RequestTimeout

サーバーからの応答を待つ時間。

30 秒

MaxIdleConnections

アイドル接続の最大数。

2000

IdleConnTimeout

ホストが接続プールでアイドル状態を維持する最大期間。

25 秒

カスタムリトライロジック

TableStoreClient で以下のパラメーターを設定することで、デフォルトの再試行ロジックを変更したり、カスタムの再試行ロジックを作成したりできます。次の表にパラメーターを示します。

パラメーター

説明

デフォルト値

CustomizedRetryFunc

CustomizedRetryFunc を指定した場合、システムは CustomizedRetryFunc の設定に基づいて再試行操作を実行するかどうかを判断します。

  • CustomizedRetryFunc を指定しない場合、デフォルト値 nil が使用されます。この場合、システムはデフォルトのリトライロジックを使用します。

  • CustomizedRetryFunc にリトライを許可することを示す値を指定した場合、システムは指定したカスタムロジックに基づいてリトライ操作を実行します。

  • CustomizedRetryFunc に再試行なしを示す値を指定した場合、システムは 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
    // 何かを実行します
}

失敗したリクエストをリトライしない

失敗したリクエストをリトライしないサンプルコード:

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
    // 何かを実行します
}

リトライコールバックを構成する

再試行中に事前定義された操作を実行するには、TableStoreClient で次のパラメーターを構成します。次の表にパラメーターを示します。

パラメーター

説明

デフォルト値

RetryNotify

リトライ中にトリガーされるコールバック。

nil

次のサンプルコードは、各リクエストに traceID を設定し、リトライ時に traceID を返す方法の例を示しています。

func userRetryNotify(traceId, requestId string, err error, action string, backoffDuration time.Duration) {
    // リトライコールバックを構成します。
    fmt.Println("traceId のリトライ: " + traceId + ", タイムスタンプ: " + 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))
    // 何かを実行します
    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