SDK Tablestore Go menggunakan exception untuk menangani error. Topik ini menjelaskan cara Tablestore menangani error, informasi yang terdapat dalam exception, serta kebijakan retry yang tersedia.
Metode
Tablestore Go SDK melemparkan exception saat terjadi error. Panggilan API dianggap berhasil jika tidak melemparkan exception; sebaliknya, operasi tersebut gagal.
Untuk operasi batch, seperti BatchGetRow dan BatchWriteRow, Anda harus memeriksa tidak hanya exception tetapi juga status setiap baris. Panggilan API secara keseluruhan dianggap berhasil hanya jika semua baris diproses dengan sukses.
Pengecualian
Saat menggunakan Tablestore Go SDK, exception biasanya dikembalikan sebagai parameter kedua dari nilai kembali suatu metode. Oleh karena itu, sebelum mengambil data yang dikembalikan, periksa apakah parameter err bernilai non-nil.
Jika terjadi error di sisi server pada Tablestore, parameter err akan berisi requestId. requestId adalah identifier unik universal (UUID) yang secara unik mengidentifikasi permintaan tersebut. Jika Anda tidak dapat menyelesaikan masalah, catat requestId ini dan submit a ticket.
Kode berikut memberikan contoh cara menangani exception:
client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
listTables, err := client.ListTable()
if err != nil {
// Tangani exception.
fmt.Println(err.Error())
} else {
// Tidak ada exception.
for _, table := range listTables.TableNames {
fmt.Println("TableName: ", table)
}
}
Upaya Ulang
Go SDK menyediakan kebijakan retry default. Anda juga dapat menyesuaikan logika retry.
Kebijakan Coba Lagi Default
Go SDK melakukan retry dengan backoff ketika terjadi error pembatasan kecepatan (throttling) atau error internal di sisi server selama operasi baca. Jumlah maksimum retry default adalah 10, dan durasi total maksimum retry default adalah 5 detik. Anda dapat memodifikasi tablestore.TableStoreConfig untuk mengatur parameter kebijakan retry default. Tabel berikut menjelaskan parameter-parameter tersebut.
|
Parameter |
Deskripsi |
Nilai default |
|
RetryTimes |
Jumlah maksimum retry. |
10 |
|
MaxRetryTime |
Durasi total maksimum untuk retry. |
5s |
|
DefaultRetryInterval |
Nilai jitter untuk kebijakan retry backoff eksponensial. Ini mencegah beberapa klien yang gagal mengirim permintaan retry secara bersamaan. |
10 ms |
|
MaxRetryInterval |
Interval waktu maksimum antara dua retry. |
320 ms |
|
Transport |
Mengelola properti transport dasar dari klien HTTP. Nilai default adalah nil. Jika Anda mengatur parameter ini, parameter |
nil |
|
HTTPTimeout.ConnectionTimeout |
Durasi timeout untuk membuat koneksi jaringan HTTP baru. |
15s |
|
HTTPTimeout.RequestTimeout |
Waktu maksimum klien HTTP menunggu respons server setelah mengirim permintaan. |
30s |
|
MaxIdleConnections |
Jumlah maksimum koneksi idle untuk host HTTP. |
2000 |
|
IdleConnTimeout |
Durasi maksimum koneksi idle untuk host HTTP tetap terbuka di kolam koneksi tanpa digunakan kembali. |
25s |
Logika retry kustom
Untuk memodifikasi logika retry default atau membuat logika retry kustom, Anda dapat mengatur parameter berikut untuk TableStoreClient.
|
Parameter |
Deskripsi |
Nilai default |
|
CustomizedRetryFunc |
Jika Anda mengatur
|
nil |
|
KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc |
true |
Contoh berikut menunjukkan cara menyesuaikan logika retry:
Retry semua error
Contoh berikut menunjukkan cara melakukan retry untuk semua error.
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
// lakukan sesuatu
}
Jangan retry semua error
Contoh berikut menunjukkan cara menonaktifkan retry untuk semua error.
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
// lakukan sesuatu
}
Callback saat retry
Untuk menjalankan operasi yang telah ditentukan saat SDK melakukan retry, Anda dapat mengatur parameter berikut untuk TableStoreClient.
|
Parameter |
Deskripsi |
Nilai default |
|
RetryNotify |
Metode callback yang dipicu saat SDK melakukan retry. |
nil |
Contoh berikut menunjukkan cara mengatur trace ID sisi bisnis untuk setiap permintaan dan mencetak trace ID tersebut saat terjadi retry.
func userRetryNotify(traceId, requestId string, err error, action string, backoffDuration time.Duration) {
// Logika kustom yang dipanggil saat retry dipicu.
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"}
// Atur trace ID sisi bisnis untuk permintaan.
request.ExtraRequestInfo.SetTraceID("test_TraceId_" + strconv.FormatInt(time.Now().UnixNano(), 10))
// lakukan sesuatu
res, err := client.DescribeTable(request)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println(res.ResponseInfo.RequestId)
}
}
Output berikut merupakan contohnya:
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