Tablestore SDK untuk Go menangani kesalahan sebagai pengecualian. Topik ini menjelaskan metode penanganan kesalahan dan kebijakan pengulangan dari Tablestore SDK untuk Go.
Metode
Tablestore SDK untuk Go menangani kesalahan sebagai pengecualian. Jika suatu operasi tidak melemparkan pengecualian, operasi tersebut berhasil. Namun, jika suatu operasi melemparkan pengecualian, operasi tersebut gagal.
Operasi batch seperti BatchGetRow dan BatchWriteRow hanya dianggap berhasil jika sistem memverifikasi bahwa tidak ada pengecualian yang dikembalikan dan status setiap baris berhasil.
Pengecualian
Saat menggunakan Tablestore SDK untuk Go, parameter err dikembalikan sebagai parameter kedua dalam respons. Anda harus memeriksa apakah nilai dikembalikan untuk parameter err sebelum mendapatkan hasil operasi.
Jika terjadi kesalahan di sisi server, requestId dikembalikan untuk parameter err. requestId menunjukkan UUID yang digunakan untuk mengidentifikasi permintaan. Jika masalah berlanjut, catat nilai parameter requestId dan ajukan tiket.
Kode contoh berikut memberikan ilustrasi penanganan kesalahan:
client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
listTables, err := client.ListTable()
if err != nil {
// Tangani pengecualian.
fmt.Println(err.Error())
} else {
// Tidak ada pengecualian.
for _, table := range listTables.TableNames {
fmt.Println("TableName: ", table)
}
}Pengulangan
Tablestore SDK untuk Go menyediakan kebijakan pengulangan default. Anda juga dapat membuat kebijakan pengulangan kustom sesuai kebutuhan.
Kebijakan pengulangan default
Jika terjadi kesalahan throttling atau kesalahan server internal terkait operasi tulis, Tablestore SDK untuk Go secara otomatis melakukan pengulangan hingga 10 kali dalam waktu 5 detik dengan backoff eksponensial. Anda dapat mengonfigurasi tablestore.TableStoreConfig untuk mengubah parameter pengulangan default. Tabel berikut menjelaskan parameter-parameter tersebut.
Parameter | Deskripsi | Nilai default |
RetryTimes | Jumlah maksimum pengulangan. | 10 |
MaxRetryTime | Waktu maksimum yang diizinkan untuk operasi yang diulang. | 5s |
DefaultRetryInterval | Nilai jitter dari kebijakan pengulangan backoff eksponensial. Ini mencegah permintaan pengulangan simultan yang dikirim dari beberapa klien. | 10 ms |
MaxRetryInterval | Interval maksimum antara dua pengulangan. | 320 ms |
Transport | Atribut transport untuk klien HTTP. Nilai default: nil. Jika Anda menentukan parameter ini, parameter HTTPTimeout.ConnectionTimeout, MaxIdleConnections, dan IdleConnTimeout tidak akan berlaku. | nil |
HTTPTimeout.ConnectionTimeout | Waktu maksimum untuk koneksi HTTP dibuat. | 15s |
HTTPTimeout.RequestTimeout | Waktu menunggu respons dari server. | 30s |
MaxIdleConnections | Jumlah maksimum koneksi idle. | 2.000 |
IdleConnTimeout | Periode maksimum selama host tetap idle di kumpulan koneksi. | 25s |
Logika pengulangan kustom
Anda dapat mengonfigurasi parameter berikut di TableStoreClient untuk mengubah logika pengulangan default atau membuat logika pengulangan kustom. Tabel berikut menjelaskan parameter-parameter tersebut.
Parameter | Deskripsi | Nilai default |
CustomizedRetryFunc | Jika Anda menentukan
| nil |
KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc | true |
Contoh logika pengulangan kustom:
Ulangi semua permintaan yang gagal
Contoh kode untuk mengulangi semua permintaan yang gagal:
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 ulangi permintaan yang gagal
Contoh kode untuk tidak mengulangi permintaan yang gagal:
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
}Konfigurasikan callback pengulangan
Untuk melakukan operasi tertentu selama pengulangan, Anda dapat mengonfigurasi parameter berikut di TableStoreClient. Tabel berikut menjelaskan parameter tersebut.
Parameter | Deskripsi | Nilai default |
RetryNotify | Callback yang dipicu selama pengulangan. | nil |
Contoh kode berikut menunjukkan cara menyetel traceID untuk setiap permintaan dan mengembalikan traceID saat pengulangan.
func userRetryNotify(traceId, requestId string, err error, action string, backoffDuration time.Duration) {
// Konfigurasikan callback pengulangan.
fmt.Println("Pengulangan untuk 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"}
// Setel traceID dari 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)
}
}Contoh respons:
Pengulangan untuk traceId: test_TraceId_1711097752255675000, timestamp: 1711097752655394000
Pengulangan untuk traceId: test_TraceId_1711097752255675000, timestamp: 1711097752683437000
Pengulangan untuk traceId: test_TraceId_1711097752255675000, timestamp: 1711097752708603000
Pengulangan untuk traceId: test_TraceId_1711097752255675000, timestamp: 1711097752760519000
Pengulangan untuk traceId: test_TraceId_1711097752255675000, timestamp: 1711097752814590000
Pengulangan untuk traceId: test_TraceId_1711097752255675000, timestamp: 1711097752916539000
Pengulangan untuk traceId: test_TraceId_1711097752255675000, timestamp: 1711097753110943000
Pengulangan untuk traceId: test_TraceId_1711097752255675000, timestamp: 1711097753454311000
Pengulangan untuk traceId: test_TraceId_1711097752255675000, timestamp: 1711097753798531000
Pengulangan untuk traceId: test_TraceId_1711097752255675000, timestamp: 1711097754165411000
OTSObjectNotExist Permintaan tabel tidak ada. 0006143b-fdd6-5050-10ef-700b045590fc