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 です。 このパラメーターを設定した場合、 |
nil |
|
HTTPTimeout.ConnectionTimeout |
新しい HTTP ネットワーク接続を確立するためのタイムアウト時間。 |
15 s |
|
HTTPTimeout.RequestTimeout |
リクエストを送信した後に、HTTP クライアントがサーバーからの応答を待機する最大時間。 |
30 s |
|
MaxIdleConnections |
HTTP ホストの最大アイドル接続数。 |
2000 |
|
IdleConnTimeout |
HTTP ホストのアイドル接続が、再利用されないまま接続プール内で開いた状態を維持できる最大時間。 |
25 s |
カスタムの再試行ロジック
デフォルトの再試行ロジックを変更する、またはカスタムの再試行ロジックを作成するには、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
// 任意の処理
}
再試行時のコールバック
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