Tablestore Go SDK は、エラーを例外として処理します。このトピックでは、Tablestore Go SDK のエラー処理方法とリトライポリシーについて説明します。
メソッド
Tablestore Go SDK は、エラーを例外として処理します。操作で例外がスローされない場合、操作は成功です。操作で例外がスローされた場合、操作は失敗です。
BatchGetRow や BatchWriteRow などのバッチ操作は、システムが例外が返されていないことを確認し、各行のステータスが成功である場合にのみ成功します。
例外
Go 用の Tablestore SDK を使用する場合、err パラメーターはレスポンスの 2 番目のパラメーターとして返されます。操作結果を取得する前に、err パラメーターに値が返されているかどうかを確認する必要があります。
サーバー側でエラーが発生した場合、requestId が 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)
}
}リトライ
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 |
| 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