Halaman ini menjelaskan model percobaan ulang yang digunakan oleh library klien C++.
Library klien mengeluarkan RPC (Remote Procedure Call) atas nama Anda. RPC ini dapat gagal karena error sementara. Server dimulai ulang, load balancer menutup koneksi yang kelebihan beban atau tidak aktif, dan batas kecepatan dapat berlaku, dan ini hanyalah beberapa contoh kegagalan sementara.
Library dapat menampilkan error ini ke aplikasi. Namun, banyak error ini mudah ditangani di library, yang membuat kode aplikasi lebih sederhana.
Error yang Dapat Dicoba Ulang dan Operasi yang Dapat Dicoba Ulang
Hanya error sementara yang dapat dicoba lagi. Misalnya, kUnavailable menunjukkan bahwa klien tidak dapat terhubung, atau kehilangan koneksinya ke layanan saat permintaan sedang berlangsung. Hal ini hampir selalu merupakan kondisi sementara, meskipun mungkin memerlukan waktu yang lama untuk pulih. Error ini selalu dapat dicoba lagi (dengan asumsi
operasi itu sendiri aman untuk dicoba lagi). Sebaliknya, error kPermissionDenied memerlukan intervensi tambahan (biasanya oleh manusia) untuk diselesaikan. Error semacam ini tidak dianggap "sementara", atau setidaknya tidak sementara dalam skala waktu yang dipertimbangkan oleh loop percobaan ulang di library klien.
Demikian pula, beberapa operasi tidak aman untuk dicoba lagi, terlepas dari sifat kesalahannya. Hal ini mencakup operasi apa pun yang membuat perubahan inkremental. Misalnya, tidak aman untuk mencoba lagi operasi guna menghapus "versi terbaru X" jika ada beberapa versi resource bernama "X". Hal ini karena pemanggil mungkin bermaksud menghapus satu versi, dan mencoba lagi permintaan tersebut dapat mengakibatkan penghapusan semua versi.
Mengonfigurasi loop percobaan ulang
Library klien menerima tiga parameter konfigurasi yang berbeda untuk mengontrol loop percobaan ulang:
*IdempotencyPolicymenentukan apakah permintaan tertentu bersifat idempoten. Hanya permintaan tersebut yang dicoba lagi.*RetryPolicymenentukan (a) apakah error harus dianggap sebagai kegagalan sementara, dan (b) berapa lama (atau berapa kali) library klien mencoba lagi permintaan.*BackoffPolicymenentukan durasi library klien menunggu sebelum mengirim ulang permintaan.
Kebijakan Idempotensi Default
Secara umum, operasi bersifat idempoten jika berhasil memanggil fungsi beberapa kali membuat sistem berada dalam status yang sama seperti berhasil memanggil fungsi sekali. Hanya operasi idempoten yang aman untuk dicoba ulang. Contoh operasi idempoten mencakup, tetapi tidak terbatas pada, semua operasi hanya baca, dan operasi yang hanya dapat berhasil satu kali.
Secara default, library klien hanya memperlakukan RPC yang diterapkan melalui kata kerja GET atau
PUT sebagai idempoten. Hal ini mungkin terlalu konservatif, di beberapa layanan bahkan
beberapa permintaan POST bersifat idempoten. Anda dapat mengganti kebijakan idempoten default kapan saja agar lebih sesuai dengan kebutuhan Anda.
Beberapa operasi hanya bersifat idempoten jika menyertakan prasyarat. Misalnya, "hapus versi terbaru jika versi terbaru adalah Y" bersifat idempoten, karena hanya dapat berhasil satu kali.
Dari waktu ke waktu, library klien menerima peningkatan untuk memperlakukan lebih banyak operasi sebagai idempoten. Kami menganggap peningkatan ini sebagai perbaikan bug, dan oleh karena itu tidak akan merusak meskipun mengubah perilaku library klien.
Perhatikan bahwa meskipun operasi dapat dicoba lagi dengan aman, hal ini tidak berarti operasi menghasilkan hasil yang sama pada percobaan kedua dibandingkan dengan percobaan pertama yang berhasil. Misalnya, membuat resource yang diidentifikasi secara unik mungkin aman untuk dicoba lagi, karena upaya kedua dan berikutnya gagal dan membuat sistem dalam status yang sama. Namun, klien mungkin menerima error "sudah ada" pada upaya percobaan ulang.
Kebijakan Coba Lagi Default
Dengan mengikuti pedoman yang diuraikan dalam aip/194, sebagian besar library klien C++ hanya mencoba lagi error gRPC UNAVAILABLE. Nilai ini dipetakan ke
StatusCode::kUnavailable. Kebijakan defaultnya adalah mencoba ulang permintaan selama 30 menit.
Perhatikan bahwa error kUnavailable tidak menunjukkan bahwa server gagal menerima permintaan. Kode error ini digunakan saat permintaan tidak dapat dikirim,
tetapi juga digunakan jika permintaan berhasil dikirim, diterima oleh
layanan, dan koneksi terputus sebelum respons diterima oleh
klien. Selain itu, jika Anda dapat menentukan apakah permintaan berhasil diterima, Anda dapat menyelesaikan masalah Dua Jenderal, hasil ketidakmungkinan yang terkenal dalam sistem terdistribusi.
Oleh karena itu, tidak aman untuk mencoba kembali semua operasi yang gagal dengan
kUnavailable. Idempotensi operasi juga penting.
Kebijakan Backoff Default
Secara default, sebagian besar library menggunakan strategi backoff eksponensial yang dipangkas, dengan jitter. Backoff awal adalah 1 detik, backoff maksimum adalah 5 menit, dan backoff akan berlipat ganda setelah setiap percobaan ulang.
Mengubah kebijakan percobaan ulang dan backoff default
Setiap library menentukan struktur *Option untuk mengonfigurasi kebijakan ini. Anda dapat
memberikan opsi ini saat membuat class *Client, atau bahkan di setiap
permintaan.
Misalnya, contoh ini menunjukkan cara mengubah kebijakan coba lagi dan jeda untuk klien Cloud Pub/Sub:
Lihat dokumentasi setiap library untuk menemukan nama dan contoh spesifik untuk library tersebut.
Langkah Berikutnya
- Lihat Konfigurasi Library Klien untuk mempelajari lebih lanjut opsi konfigurasi library umum.