Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Coba lagi dengan pola backoff
Niat
Coba lagi dengan pola backoff meningkatkan stabilitas aplikasi dengan mencoba ulang operasi secara transparan yang gagal karena kesalahan sementara.
Motivasi
Dalam arsitektur terdistribusi, kesalahan sementara mungkin disebabkan oleh pembatasan layanan, hilangnya konektivitas jaringan sementara, atau tidak tersedianya layanan sementara. Secara otomatis mencoba ulang operasi yang gagal karena kesalahan sementara ini meningkatkan pengalaman pengguna dan ketahanan aplikasi. Namun, percobaan ulang yang sering dapat membebani bandwidth jaringan dan menyebabkan pertengkaran. Backoff eksponensial adalah teknik di mana operasi dicoba ulang dengan meningkatkan waktu tunggu untuk sejumlah upaya coba lagi.
Penerapan
Gunakan coba lagi dengan pola backoff saat:
-
Layanan Anda sering membatasi permintaan untuk mencegah kelebihan beban, sehingga menghasilkan429 Terlalu banyak permintaanpengecualian untuk proses panggilan.
-
Jaringan adalah peserta yang tak terlihat dalam arsitektur terdistribusi, dan masalah jaringan sementara mengakibatkan kegagalan.
-
Layanan yang dipanggil sementara tidak tersedia, menyebabkan kegagalan. Percobaan ulang yang sering dapat menyebabkan penurunan layanan kecuali Anda memperkenalkan batas waktu backoff dengan menggunakan pola ini.
Masalah dan pertimbangan
-
Idempotensi: Jika beberapa panggilan ke metode memiliki efek yang sama dengan satu panggilan pada status sistem, operasi dianggap idempoten. Operasi harus idempoten ketika Anda menggunakan coba lagi dengan pola backoff. Jika tidak, pembaruan sebagian mungkin merusak status sistem.
-
Bandwidth jaringan: Degradasi layanan dapat terjadi jika terlalu banyak percobaan ulang menempati bandwidth jaringan, yang mengarah ke waktu respons yang lambat.
-
Gagal skenario cepat: Untuk kesalahan non-transien, jika Anda dapat menentukan penyebab kegagalan, lebih efisien untuk gagal cepat dengan menggunakan pola pemutus sirkuit.
-
Backoff laju: Memperkenalkan backoff eksponensial dapat berdampak pada batas waktu layanan, sehingga waktu tunggu yang lebih lama untuk pengguna akhir.
Implementasi
Arsitektur tingkat tinggi
Diagram berikut menggambarkan bagaimana Layanan A dapat mencoba kembali panggilan ke Layanan B sampai respons berhasil dikembalikan. Jika Layanan B tidak mengembalikan respons yang berhasil setelah beberapa kali mencoba, Layanan A dapat berhenti mencoba ulang dan mengembalikan kegagalan ke pemanggilnya.
![Arsitektur tingkat tinggi untuk dicoba lagi dengan pola backoff](images/retry-backoff-1.png)
Implementasi menggunakanAWSjasa
Diagram berikut menunjukkan alur kerja pemrosesan tiket pada platform dukungan pelanggan. Tiket dari pelanggan yang tidak bahagia dipercepat dengan secara otomatis meningkatkan prioritas tiket. YangTicket info
Fungsi Lambda mengekstrak detail tiket dan memanggilGet sentiment
Fungsi lambda. YangGet sentiment
Fungsi Lambda memeriksa sentimen pelanggan dengan meneruskan deskripsiAmazon Memahami
Jika panggilan keGet sentiment
Fungsi Lambda gagal, alur kerja mencoba ulang operasi tiga kali.AWS Step Functionsmemungkinkan backoff eksponensial dengan membiarkan Anda mengkonfigurasi nilai backoff.
Dalam contoh ini, maksimal tiga percobaan ulang dikonfigurasi dengan peningkatan pengganda 1,5 detik. Jika percobaan ulang pertama terjadi setelah 3 detik, percobaan ulang kedua terjadi setelah 3 x 1,5 detik = 4,5 detik, dan percobaan ulang ketiga terjadi setelah 4,5 x 1,5 detik = 6,75 detik. Jika percobaan ketiga tidak berhasil, alur kerja gagal. Logika backoff tidak memerlukan kode kustom apa pun—itu disediakan sebagai konfigurasi olehAWS Step Functions.
![Coba lagi dengan pola backoff denganAWSjasa](images/retry-backoff-2.png)
Kode sampel
Kode berikut menunjukkan pelaksanaan coba lagi dengan pola backoff.
public async Task DoRetriesWithBackOff() { int retries = 0; bool retry; do { //Sample object for sending parameters var parameterObj = new InputParameter { SimulateTimeout = "false" }; var content = new StringContent(JsonConvert.SerializeObject(parameterObj), System.Text.Encoding.UTF8, "application/json"); var waitInMilliseconds = Convert.ToInt32((Math.Pow(2, retries) - 1) * 100); System.Threading.Thread.Sleep(waitInMilliseconds); var response = await _client.PostAsync(_baseURL, content); switch (response.StatusCode) { //Success case HttpStatusCode.OK: retry = false; Console.WriteLine(response.Content.ReadAsStringAsync().Result); break; //Throttling, timeouts case HttpStatusCode.TooManyRequests: case HttpStatusCode.GatewayTimeout: retry = true; break; //Some other error occured, so stop calling the API default: retry = false; break; } retries++; } while (retry && retries < MAX_RETRIES); }
GitHubrepositori
Untuk implementasi lengkap arsitektur sampel untuk pola ini, lihatGitHubrepositori dihttps://github.com/aws-samples/retry-with-backoff
Konten terkait
-
Timeout, percobaan ulang, dan backoff dengan jitter
(Pustaka Pembuat Amazon)