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

Tablestore:Go SDK のエラー処理

最終更新日:Aug 05, 2026

Tablestore Go ソフトウェア開発キット (SDK) は、例外を使用してエラーを処理します。このトピックでは、Tablestore がエラーを処理する方法、例外に含まれる情報、および利用可能な再試行ポリシーについて説明します。

方法

Tablestore Go SDK は、エラーが発生すると例外をスローします。例外がスローされない場合、API 呼び出しは成功です。それ以外の場合、操作は失敗です。

説明

BatchGetRow や BatchWriteRow などのバッチ操作では、例外だけでなく各行のステータスも確認する必要があります。すべての行が正常に処理された場合にのみ、API 呼び出し全体が成功となります。

例外

Tablestore Go SDK を使用する場合、例外は通常、メソッドの戻り値の 2 番目のパラメーターとして返されます。そのため、返されたデータを取得する前に、err パラメーターに値があるかどうかを確認してください。

Tablestore でサーバー側のエラーが発生した場合、err パラメーターには requestId が含まれます。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

再試行の最大合計時間。

5 s

DefaultRetryInterval

エクスポネンシャルバックオフ再試行におけるジッター値です。これにより、リクエストが失敗した複数のクライアントが同時に再試行リクエストを開始することを防ぎます。

10 ms

MaxRetryInterval

2 回の再試行間の最大時間間隔。

320 ms

Transport

HTTP クライアントの基盤となるトランスポートのプロパティを管理します。デフォルト値は nil です。

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

nil

HTTPTimeout.ConnectionTimeout

新しい HTTP ネットワーク接続を確立するためのタイムアウト時間。

15 s

HTTPTimeout.RequestTimeout

リクエストを送信した後に、HTTP クライアントがサーバーからの応答を待機する最大時間。

30 s

MaxIdleConnections

HTTP ホストの最大アイドル接続数。

2000

IdleConnTimeout

HTTP ホストのアイドル接続が、再利用されないまま接続プール内で開いた状態を維持できる最大時間。

25 s

カスタムの再試行ロジック

デフォルトの再試行ロジックを変更する、またはカスタムの再試行ロジックを作成するには、TableStoreClient に対して次のパラメーターを設定します。

パラメーター

説明

デフォルト値

CustomizedRetryFunc

CustomizedRetryFunc を設定すると、SDK は最初にこのメソッドを確認し、再試行を実行するかどうかを判断します。

  • CustomizedRetryFunc が設定されていない (nil である) 場合、SDK はデフォルトの再試行ロジックを実行します。

  • CustomizedRetryFunc が nil ではなく、かつ再試行が必要であると判断した場合、SDK はカスタムの再試行ロジックに基づいて再試行を実行します。

  • CustomizedRetryFunc が nil ではなく、かつ再試行が不要であると判断した場合、SDK は KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc の値を確認して後続の動作を決定します。

    • KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc が false の場合、再試行は実行されません。

    • KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc が true の場合、SDK は次にデフォルトの再試行ロジックを確認し、再試行を実行するかどうかを判断します。

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
    // 任意の処理
}

再試行時のコールバック

SDK が操作を再試行する際に事前定義した処理を実行するには、TableStoreClient に対して次のパラメーターを設定します。

パラメーター

説明

デフォルト値

RetryNotify

SDK が再試行を実行するときにトリガーされるコールバックメソッド。

nil

次の例は、各リクエストにアプリケーション側のトレース ID を設定し、再試行が発生した際にこのトレース ID を出力する方法を示しています。

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"}
    // リクエストにアプリケーション側のトレース ID を設定します。
    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