В этой записи блога мы углубимся в тему настройки таймаутов запросов в библиотеке aws-sdk-go-v2 для программирования на Go. Мы рассмотрим различные методы и приемы эффективной обработки тайм-аутов, гарантируя, что ваши вызовы API AWS не зависнут на неопределенный срок. Так что берите свой любимый напиток, садитесь поудобнее и начнем!
Метод 1: использование контекста с таймаутом
Один из самых простых и распространенных методов установки таймаута — использование функции context.WithTimeout. Эта функция позволяет создать новый контекст со значением таймаута, который затем можно будет передавать в запросы API AWS. Вот пример:
import (
"context"
"time"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func main() {
cfg, err := config.LoadDefaultConfig(context.TODO())
if err != nil {
panic(err)
}
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
svc := s3.NewFromConfig(cfg)
_, err = svc.ListBuckets(ctx, &s3.ListBucketsInput{})
if err != nil {
// Handle error
}
}
В приведенном выше фрагменте кода мы создаем новый контекст с тайм-аутом 5 секунд, используя context.WithTimeout. Этот контекст затем используется при вызове API AWS для получения списка сегментов в сервисе S3.
Метод 2: использование интерфейса RequestOption
aws-sdk-go-v2 предоставляет интерфейс RequestOption, который позволяет настраивать запросы. Один из доступных вариантов — RequestTimeout, который позволяет вам установить тайм-аут, специфичный для конкретного запроса. Вот пример:
import (
"context"
"time"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func main() {
cfg, err := config.LoadDefaultConfig(context.TODO())
if err != nil {
panic(err)
}
svc := s3.NewFromConfig(cfg)
_, err = svc.ListBuckets(context.TODO(), func(options *s3.Options) {
options.RequestOptions = append(options.RequestOptions, func(r *s3.Options) {
r.RequestTimeout = 5 * time.Second
})
})
if err != nil {
// Handle error
}
}
В приведенном выше фрагменте кода мы используем метод ListBucketsс опцией запроса для установки тайм-аута в 5 секунд. Поле RequestOptionsструктуры s3.Optionsизменяется и включает желаемое значение таймаута.
Метод 3: собственный HTTP-клиент с тайм-аутом.
Другой подход — создать собственный HTTP-клиент с тайм-аутом и передать его в конфигурацию aws-sdk-go-v2. Вот пример:
import (
"context"
"net/http"
"time"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/s3"
"github.com/aws/aws-sdk-go-v2/aws"
)
func main() {
cfg, err := config.LoadDefaultConfig(context.TODO(),
config.WithHTTPClient(&http.Client{
Timeout: 5 * time.Second,
}),
)
if err != nil {
panic(err)
}
svc := s3.NewFromConfig(cfg)
_, err = svc.ListBuckets(context.TODO(), &s3.ListBucketsInput{})
if err != nil {
// Handle error
}
}
В приведенном выше фрагменте кода мы создаем собственный HTTP-клиент с таймаутом 5 секунд и передаем его в конфигурацию aws-sdk-go-v2 с помощью параметра WithHTTPClient. Это гарантирует, что все запросы, сделанные SDK, будут соответствовать указанному времени ожидания.
В этой статье мы рассмотрели три метода установки таймаутов в библиотеке aws-sdk-go-v2. Используя context.WithTimeout, интерфейс RequestOptionили собственный HTTP-клиент, вы можете эффективно контролировать длительность тайм-аута для вызовов API AWS. Не забудьте выбрать метод, который лучше всего соответствует вашим конкретным требованиям и стратегии обработки ошибок.