

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
<a name="retry-backoff"></a>

## Niat
<a name="retry-backoff-intent"></a>

Coba lagi dengan pola backoff meningkatkan stabilitas aplikasi dengan mencoba kembali operasi secara transparan yang gagal karena kesalahan sementara.

## Motivasi
<a name="retry-backoff-motivation"></a>

Dalam arsitektur terdistribusi, kesalahan sementara mungkin disebabkan oleh pelambatan layanan, hilangnya konektivitas jaringan sementara, atau tidak tersedianya layanan sementara. Secara otomatis mencoba kembali 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 lagi dengan meningkatkan waktu tunggu untuk sejumlah upaya coba lagi tertentu.

## Penerapan
<a name="retry-backoff-applicability"></a>

Gunakan coba lagi dengan pola backoff saat:
+ Layanan Anda sering membatasi permintaan untuk mencegah kelebihan beban, menghasilkan *429 Terlalu banyak permintaan* pengecualian untuk proses panggilan.
+ Jaringan adalah peserta yang tidak terlihat dalam arsitektur terdistribusi, dan masalah jaringan sementara mengakibatkan kegagalan.
+ Layanan yang dipanggil sementara tidak tersedia, menyebabkan kegagalan. Percobaan ulang yang sering dapat menyebabkan degradasi layanan kecuali Anda memperkenalkan batas waktu backoff dengan menggunakan pola ini.

## Masalah dan pertimbangan
<a name="retry-backoff-issues"></a>
+ **Idempotensi**: Jika beberapa panggilan ke metode memiliki efek yang sama dengan panggilan tunggal pada status sistem, operasi dianggap idempoten. Operasi harus idempoten saat Anda menggunakan coba lagi dengan pola backoff. Jika tidak, pembaruan sebagian dapat merusak status sistem.
+ **Bandwidth jaringan**: Degradasi layanan dapat terjadi jika terlalu banyak percobaan ulang menempati bandwidth jaringan, yang menyebabkan waktu respons yang lambat.
+ **Gagal skenario cepat**: Untuk kesalahan non-transien, jika Anda dapat menentukan penyebab kegagalan, akan lebih efisien untuk gagal cepat dengan menggunakan pola pemutus sirkuit.
+ **Tingkat backoff**: Memperkenalkan backoff eksponensial dapat berdampak pada batas waktu layanan, menghasilkan waktu tunggu yang lebih lama bagi pengguna akhir.

## Implementasi
<a name="retry-backoff-implementation"></a>

### Arsitektur tingkat tinggi
<a name="retry-high-level-arch"></a>

Diagram berikut menggambarkan bagaimana Layanan A dapat mencoba kembali panggilan ke Layanan B hingga respons yang berhasil dikembalikan. Jika Layanan B tidak mengembalikan respons yang berhasil setelah beberapa kali mencoba, Layanan A dapat berhenti mencoba lagi dan mengembalikan kegagalan ke pemanggilnya.

![Arsitektur tingkat tinggi untuk dicoba lagi dengan pola backoff](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/cloud-design-patterns/images/retry-backoff-1.png)


### Implementasi menggunakan AWS layanan
<a name="retry-aws-services"></a>

Diagram berikut menunjukkan alur kerja pemrosesan tiket pada platform dukungan pelanggan. Tiket dari pelanggan yang tidak puas dipercepat dengan secara otomatis meningkatkan prioritas tiket. Fungsi `Ticket info` Lambda mengekstrak detail tiket dan memanggil fungsi Lambda`Get sentiment`. Fungsi `Get sentiment` Lambda memeriksa sentimen pelanggan dengan meneruskan deskripsi ke [Amazon](https://aws.amazon.com/comprehend/) Comprehend (tidak ditampilkan).

Jika panggilan ke fungsi `Get sentiment` Lambda gagal, alur kerja mencoba ulang operasi tiga kali. AWS Step Functions memungkinkan backoff eksponensial dengan membiarkan Anda mengonfigurasi nilai backoff.

Dalam contoh ini, maksimal tiga percobaan ulang dikonfigurasi dengan pengganda peningkatan 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 ulang ketiga tidak berhasil, alur kerja gagal. Logika backoff tidak memerlukan kode khusus apa pun―itu disediakan sebagai konfigurasi oleh. AWS Step Functions

![Coba lagi dengan pola backoff dengan layanan AWS](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/cloud-design-patterns/images/retry-backoff-2.png)


### Kode sampel
<a name="retry-sample-code"></a>

Kode berikut menunjukkan implementasi 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);
  }
```

### GitHub repositori
<a name="retry-github-repo"></a>

Untuk implementasi lengkap arsitektur sampel untuk pola ini, lihat GitHub repositori di. [https://github.com/aws-samples/retry-with-backoff](https://github.com/aws-samples/retry-with-backoff)

## Konten terkait
<a name="retry-backoff-resources"></a>
+ [Timeout, percobaan ulang, dan backoff dengan jitter (Amazon](https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/) Builders' Library)