All Products
Search
Document Center

Tablestore:Penanganan kesalahan

Last Updated:Jun 24, 2025

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.

null

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 CustomizedRetryFunc, sistem menentukan apakah akan melakukan operasi pengulangan berdasarkan konfigurasi CustomizedRetryFunc.

  • Jika Anda tidak menentukan CustomizedRetryFunc, nilai default nil digunakan. Dalam hal ini, sistem menggunakan logika pengulangan default.

  • Jika Anda menentukan nilai yang mengindikasikan pengulangan diizinkan untuk CustomizedRetryFunc, sistem melakukan operasi pengulangan berdasarkan logika kustom yang Anda tentukan.

  • Jika Anda menentukan nilai yang mengindikasikan tidak ada pengulangan untuk CustomizedRetryFunc, sistem menentukan apakah akan melakukan operasi pengulangan berdasarkan nilai KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc.

    • Jika Anda mengatur KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc ke false, tidak ada pengulangan yang dilakukan.

    • Jika Anda mengatur KeepDefaultRetryStrategyWhileUsingCustomizedRetryFunc ke true, sistem menentukan apakah akan melakukan operasi pengulangan berdasarkan logika pengulangan default.

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