Terkadang, API dapat mengekspos metode yang memerlukan waktu lama untuk diselesaikan. Daripada memblokir saat tugas berjalan, Anda dapat menampilkan promise dan membiarkan pengguna memeriksa statusnya.
Google Cloud Client Libraries for Rust menyediakan helper untuk menangani operasi yang berjalan lama (LRO). Panduan ini menunjukkan cara memulai LRO dan menunggu penyelesaiannya.
Prasyarat
Panduan ini menggunakan layanan Cloud Storage untuk menjaga agar cuplikan kode tetap konkret. Konsep ini berlaku untuk layanan lain yang menggunakan LRO.
Sebelum mengikuti panduan ini, Anda harus:
- Buat Google Cloud project.
- Aktifkan penagihan.
Untuk mengetahui petunjuk penyiapan lengkap untuk library Rust, lihat Menyiapkan lingkungan pengembangan Anda.
Dependensi
Mendeklarasikan dependensi Google Cloud dalam file Cargo.toml Anda:
cargo add google-cloud-storage google-cloud-lro google-cloud-longrunning
Anda juga memerlukan beberapa fitur tokio:
cargo add tokio --features full,macros
Memulai operasi yang berjalan lama
Contoh ini menggunakan rename folder. Operasi ini dapat memerlukan waktu yang lama untuk folder besar, tetapi relatif cepat untuk folder yang lebih kecil.
Untuk memulai operasi yang berjalan lama, Anda harus melakukan inisialisasi klien dan membuat RPC.
Pertama, tambahkan deklarasi use untuk menghindari nama paket yang panjang:
Selanjutnya, buat klien:
Di library klien Rust, setiap permintaan diwakili oleh metode yang menampilkan pembuat permintaan. Panggil metode pada klien untuk membuat builder permintaan:
Fungsi contoh menerima nama bucket dan folder sebagai argumen:
Buat permintaan dan tunggu hingga Operation ditampilkan. Operation ini bertindak sebagai janji untuk hasil
permintaan yang berjalan lama:
let operation =
// ...
.send()
.await?;
Permintaan ini memulai operasi di latar belakang. Tunggu hingga operasi selesai untuk menentukan apakah operasi berhasil.
Melakukan polling operasi yang berjalan lama secara otomatis
Untuk mengonfigurasi polling otomatis, Anda akan
Memulai operasi yang berjalan lama dengan
Poller, bukan .send().wait, seperti berikut:
Pertama, perkenalkan trait Poller dalam cakupan menggunakan deklarasi use:
Kemudian, lakukan inisialisasi klien dan siapkan permintaan seperti sebelumnya:
Lakukan polling hingga operasi selesai dan cetak hasilnya:
.poller()
.until_done()
.await?;
println!("LRO completed, response={response:?}");
Melakukan polling operasi yang berjalan lama dengan hasil sementara
Metode .until_done() memang praktis, tetapi tidak menyertakan laporan progres parsial
dari operasi yang berjalan lama. Jika aplikasi Anda memerlukan informasi ini, gunakan
poller secara langsung:
let mut poller = client
.rename_folder()
/* more stuff */
.poller();
Kemudian, gunakan poller dalam loop:
Loop ini secara eksplisit menunggu sebelum melakukan polling lagi. Periode polling bergantung pada operasi tertentu dan payload-nya. Lihat dokumentasi layanan atau bereksperimen dengan data Anda untuk menentukan nilai yang baik.
Melakukan polling operasi yang berjalan lama secara manual
Meskipun kami merekomendasikan pendekatan polling otomatis, Anda juga dapat melakukan polling operasi yang berjalan lama secara manual. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi pesan Operation.
Mulai operasi yang berjalan lama menggunakan klien:
let mut operation = client
.rename_folder()
/* more stuff */
.send()
.await?;
Mulai loop polling, dan periksa apakah operasi selesai menggunakan
kolom done:
Saat operasi selesai, biasanya akan berisi hasil. Kolom hasil bersifat opsional karena layanan dapat menampilkan done sebagai benar tanpa hasil. Misalnya, operasi penghapusan yang berhasil tidak memiliki nilai yang ditampilkan. Dalam contoh ini,
layanan Cloud Storage selalu menampilkan nilai:
Operasi yang dimulai mungkin tidak berhasil diselesaikan. Hasilnya dapat berupa error atau respons yang valid. Periksa error terlebih dahulu:
Jenis error adalah jenis pesan Status. Hal ini TIDAK
menerapkan sifat Error standar. Konversikan secara manual menjadi
error yang valid menggunakan Error::service.
Jika hasilnya berhasil, ekstrak jenis respons. Temukan jenis ini dalam dokumentasi metode LRO atau dokumentasi API layanan:
Perhatikan bahwa ekstraksi nilai dapat gagal jika jenisnya tidak cocok dengan yang dikirim oleh layanan.
JenisGoogle Cloud dapat menambahkan kolom dan cabang pada masa mendatang. Library Klien Google Cloud
untuk Rust menandai semua struct dan enum sebagai #[non_exhaustive].
Tangani kasus ini:
Jika operasi belum selesai, operasi tersebut mungkin berisi metadata. Beberapa layanan menyertakan informasi awal tentang permintaan, sementara layanan lainnya menyertakan laporan progres sebagian. Anda dapat mengekstrak dan melaporkan metadata ini:
Tunggu sebelum melakukan polling lagi. Pertimbangkan untuk menyesuaikan periode polling menggunakan backoff eksponensial yang dipangkas. Contoh ini melakukan polling setiap 500 md:
Buat kueri status operasi:
Agar mudah, contoh ini mengabaikan semua error. Di aplikasi, Anda dapat memperlakukan subset error sebagai tidak dapat dipulihkan dan membatasi jumlah upaya polling.
Langkah berikutnya
- Lihat kode sumber untuk contoh di GitHub.