

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Coba Ulang dan Batas Waktu
<a name="configure-retries-timeouts"></a>

 AWS SDK untuk Go Ini memungkinkan Anda untuk mengonfigurasi perilaku percobaan ulang permintaan ke layanan HTTP. Secara default, klien layanan menggunakan [Retry.standard sebagai retryer](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry#Standard) default mereka. Jika konfigurasi atau perilaku default tidak memenuhi persyaratan aplikasi, Anda dapat menyesuaikan konfigurasi retryer atau menyediakan implementasi retryer Anda sendiri. 

 AWS SDK untuk Go Ini menyediakan antarmuka [AWS.Retryer](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#Retryer) yang mendefinisikan kumpulan metode yang diperlukan oleh implementasi coba lagi untuk diimplementasikan. [SDK menyediakan dua implementasi untuk percobaan ulang: [retry.Standard](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry#Standard) dan aws. NoOpRetryer](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#NoOpRetryer). 

## Retryer Standar
<a name="standard-retryer"></a>

 [Retry.standard retryer](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry#Standard) adalah `aws.Retryer` implementasi default yang digunakan oleh klien SDK. Retryer standar adalah retryer terbatas dengan jumlah upaya maksimal yang dapat dikonfigurasi, dan kemampuan untuk menyetel kebijakan mundur permintaan. 

 Tabel berikut mendefinisikan nilai default untuk retryer ini: 


| Properti | Default | 
| --- | --- | 
| Jumlah Upaya Maks | 3 | 
| Penundaan Mundur Maks | 20 detik | 

 Ketika kesalahan yang dapat dicoba ulang terjadi saat menjalankan permintaan Anda, retryer standar akan menggunakan konfigurasi yang disediakan untuk menunda dan kemudian mencoba kembali permintaan tersebut. Mencoba lagi menambah latensi keseluruhan permintaan Anda, dan Anda harus mengonfigurasi retryer jika konfigurasi default tidak memenuhi persyaratan aplikasi Anda. 

 Lihat dokumentasi paket [coba ulang](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry) untuk detail tentang kesalahan apa yang dianggap dapat dicoba ulang oleh implementasi retryer standar. 

## NopRetryer
<a name="nopretryer"></a>

 [Aw. NopRetryer](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws#NopRetryer)adalah `aws.Retryer` implementasi yang disediakan jika Anda ingin menonaktifkan semua upaya coba lagi. Saat menjalankan operasi klien layanan, retryer ini hanya akan mengizinkan permintaan untuk dicoba sekali, dan kesalahan apa pun yang dihasilkan akan dikembalikan ke aplikasi panggilan. 

## Menyesuaikan Perilaku
<a name="customizing-behavior"></a>

 SDK menyediakan satu set utilitas pembantu yang membungkus `aws.Retryer` implementasi, dan mengembalikan retryer yang disediakan yang dibungkus dengan perilaku coba lagi yang diinginkan. Anda dapat mengganti retryer default untuk semua klien, per klien, atau per operasi tergantung pada kebutuhan aplikasi Anda. Untuk melihat contoh tambahan yang menunjukkan cara melakukannya, lihat contoh dokumentasi paket [coba lagi](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry). 

**Awas**  
 Jika menentukan `aws.Retryer` implementasi global menggunakan`config.WithRetryer`, Anda harus memastikan bahwa Anda mengembalikan instance baru dari `aws.Retryer` setiap pemanggilan. Ini akan memastikan bahwa Anda tidak akan membuat ember token coba ulang global di semua klien layanan. 

### Membatasi jumlah maksimal upaya
<a name="limiting-the-max-number-of-attempts"></a>

 Anda menggunakan [coba lagi. AddWithMaxAttempts](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry#AddWithMaxAttempts)untuk membungkus `aws.Retryer` implementasi untuk mengatur upaya angka maksimal ke nilai yang Anda inginkan. 

**Awas**  
 Menggunakan `retry.AddWithMaxAttempts` dengan nilai nol akan memungkinkan SDK untuk mencoba kembali semua kesalahan yang dapat dicoba ulang hingga permintaan berhasil, atau kesalahan yang tidak dapat dicoba kembali dikembalikan. **Mengizinkan SDK untuk mencoba lagi tanpa batas dapat mengakibatkan beban kerja yang tidak terkendali dan siklus penagihan yang meningkat.** 

```
import "context"
import "github.com/aws/aws-sdk-go-v2/aws/retry"
import "github.com/aws/aws-sdk-go-v2/config"
import "github.com/aws/aws-sdk-go-v2/service/s3"

// ...

// MaxAttempts will be infinite (will retry indefinitely)
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRetryer(func() aws.Retryer {
    return retry.AddWithMaxAttempts(retry.NewStandard(), 0)
}))
if err != nil {
    return err
}

client := s3.NewFromConfig(cfg)
```

 Perhatikan bahwa membuat instance retryer menggunakan opsi fungsional untuk disetel MaxAttempts secara langsung akan memiliki perilaku yang sedikit berbeda. Lebih khusus lagi, menyetel nilai kurang dari atau sama dengan nol akan menyebabkan retryer menggunakan maksimum default 3 percobaan, daripada mencoba lagi tanpa batas: 

```
import "context"
import "github.com/aws/aws-sdk-go-v2/aws/retry"
import "github.com/aws/aws-sdk-go-v2/config"
import "github.com/aws/aws-sdk-go-v2/service/s3"

// ...

// MaxAttempts will default to 3
cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRetryer(func() aws.Retryer {
    return retry.NewStandard(func(o *retry.StandardOptions) {
        o.MaxAttempts = 0
    })
}))
if err != nil {
    return err
}

client := s3.NewFromConfig(cfg)
```

### Membatasi penundaan mundur maksimal
<a name="limiting-the-max-back-off-delay"></a>

 Anda menggunakan [coba lagi. AddWithMaxBackoffDelay](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry#AddWithMaxBackoffDelay)untuk membungkus `aws.Retryer` implementasi dan membatasi penundaan mundur maksimal yang diizinkan terjadi antara mencoba kembali permintaan yang gagal. 

 Misalnya, Anda dapat menggunakan kode berikut untuk membungkus retryer klien standar dengan penundaan maksimal lima detik yang diinginkan: 

```
import "context"
import "time"
import "github.com/aws/aws-sdk-go-v2/aws/retry"
import "github.com/aws/aws-sdk-go-v2/config"
import "github.com/aws/aws-sdk-go-v2/service/s3"

// ...

cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRetryer(func() aws.Retryer {
    return retry.AddWithMaxBackoffDelay(retry.NewStandard(), time.Second*5)
}))
if err != nil {
    return err
}

client := s3.NewFromConfig(cfg)
```

### Coba lagi kode kesalahan API tambahan
<a name="retry-additional-api-error-codes"></a>

 Anda menggunakan [coba lagi. AddWithErrorCodes](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry#AddWithErrorCodes)untuk membungkus `aws.Retryer` implementasi dan menyertakan kode kesalahan API tambahan yang harus dianggap dapat dicoba ulang. 

 Misalnya, Anda dapat menggunakan kode berikut untuk membungkus retryer klien standar untuk menyertakan pengecualian Amazon `NoSuchBucketException` S3 sebagai dapat dicoba ulang. 

```
import "context"
import "time"
import "github.com/aws/aws-sdk-go-v2/aws/retry"
import "github.com/aws/aws-sdk-go-v2/config"
import "github.com/aws/aws-sdk-go-v2/service/s3"
import "github.com/aws/aws-sdk-go-v2/service/s3/types"

// ...

cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRetryer(func() aws.Retryer {
    return retry.AddWithErrorCodes(retry.NewStandard(), (*types.NoSuchBucketException)(nil).ErrorCode())
}))
if err != nil {
    return err
}

client := s3.NewFromConfig(cfg)
```

### Pembatasan tingkat sisi klien
<a name="client-side-rate-limiting"></a>

 Ini AWS SDK untuk Go memperkenalkan mekanisme pembatasan tingkat sisi klien baru dalam kebijakan coba ulang standar untuk menyelaraskan dengan perilaku modern. SDKs [Ini adalah perilaku yang dikendalikan oleh [RateLimiter](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry#RateLimiter)bidang pada opsi retryer.](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/retry#StandardOptions) 

 A RateLimiter beroperasi sebagai ember token dengan kapasitas yang ditetapkan, di mana kegagalan upaya operasi menggunakan token. Coba lagi yang mencoba mengkonsumsi lebih banyak token daripada yang tersedia menghasilkan kegagalan operasi dengan a [QuotaExceededError](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/ratelimit#QuotaExceededError). 

 Implementasi default diparameterisasi sebagai berikut (cara memodifikasi setiap pengaturan): 
+  kapasitas 500 (mengatur nilai RateLimiter pada StandardOptions penggunaan [NewTokenRateLimit](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/ratelimit#NewTokenRateLimit)) 
+  coba lagi yang disebabkan oleh biaya batas waktu 10 token (ditetapkan RetryTimeoutCost ) StandardOptions 
+  percobaan lagi yang disebabkan oleh kesalahan lain membutuhkan biaya 5 token (disetel RetryCost) StandardOptions 
+  operasi yang berhasil pada upaya pertama menambahkan 1 token (diatur NoRetryIncrement ) StandardOptions 
  +  operasi yang berhasil pada upaya ke-2 atau yang lebih baru tidak menambahkan kembali token apa pun 

 Jika Anda menemukan bahwa perilaku default tidak sesuai dengan kebutuhan aplikasi Anda, Anda dapat menonaktifkannya dengan [RateLimit.none](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/ratelimit#pkg-variables). 

#### Contoh: pembatas tingkat yang dimodifikasi
<a name="example-modified-rate-limiter"></a>

```
import (
    "context"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/aws/ratelimit"
    "github.com/aws/aws-sdk-go-v2/aws/retry"
    "github.com/aws/aws-sdk-go-v2/config"
)

// ...

cfg, err := config.LoadDefaultConfig(context.Background(), config.WithRetryer(func() aws.Retryer {
    return retry.NewStandard(func(o *retry.StandardOptions) {
        // Makes the rate limiter more permissive in general. These values are
        // arbitrary for demonstration and may not suit your specific
        // application's needs.
        o.RateLimiter = ratelimit.NewTokenRateLimit(1000)
        o.RetryCost = 1
        o.RetryTimeoutCost = 3
        o.NoRetryIncrement = 10
    })
}))
```

#### Contoh: tidak ada batas tarif menggunakan RateLimit.none
<a name="example-no-rate-limit-using-ratelimitnone"></a>

```
import (
    "context"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/aws/ratelimit"
    "github.com/aws/aws-sdk-go-v2/aws/retry"
    "github.com/aws/aws-sdk-go-v2/config"
)

// ...

cfg, err := config.LoadDefaultConfig(context.Background(), config.WithRetryer(func() aws.Retryer {
    return retry.NewStandard(func(o *retry.StandardOptions) {
        o.RateLimiter = ratelimit.None
    })
}))
```

## Timeout
<a name="timeouts"></a>

 Anda menggunakan paket [konteks](https://golang.org/pkg/context/) untuk mengatur batas waktu atau tenggat waktu saat menjalankan operasi klien layanan. Gunakan [konteksnya. WithDeadline](https://golang.org/pkg/context/#WithDeadline)untuk membungkus konteks aplikasi Anda dan menetapkan tenggat waktu ke waktu tertentu dimana operasi yang dipanggil harus diselesaikan. Untuk mengatur batas waktu setelah [konteks `time.Duration` penggunaan tertentu. WithTimeout](https://golang.org/pkg/context/#WithTimeout). SDK meneruskan yang disediakan `context.Context` ke klien transport HTTP saat menjalankan API layanan. Jika konteks yang diteruskan ke SDK dibatalkan atau dibatalkan saat menjalankan operasi, SDK tidak akan mencoba lagi permintaan lebih lanjut dan akan kembali ke aplikasi panggilan. Anda harus menangani pembatalan konteks dengan tepat dalam aplikasi Anda jika konteks yang diberikan kepada SDK telah dibatalkan. 

### Menetapkan batas waktu
<a name="setting-a-timeout"></a>

 Contoh berikut menunjukkan cara mengatur batas waktu untuk operasi klien layanan. 

```
import "context"
import "time"

// ...

ctx := context.TODO() // or appropriate context.Context value for your application

client := s3.NewFromConfig(cfg)

// create a new context from the previous ctx with a timeout, e.g. 5 seconds
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()

resp, err := client.GetObject(ctx, &s3.GetObjectInput{
    // input parameters
})
if err != nil {
    // handle error
}
```