Go HTTP Client Timeout Stratejileri: Context vs Client Timeout

Go'da bir HTTP isteği sonsuz beklemeye alınabilir. Sunucu yanıt vermezse, ağ kesilirse ya da veri akışı durarsa istek asılı kalır. Bunu önlemek için timeout mekanizması gerekir. Go'da iki ana yol vardır: Client timeout ve Context deadline. Hangisini seçeceğin isteğin yapısına bağlıdır.

Client Timeout Nedir?

HTTP Client'ın kendisinde genel bir timeout ayarı yapabilirsin. Tüm istekler bu süreden uzun sürmezse otomatik kesilir.

1package main
2
3import (
4"fmt"
5"net/http"
6"time"
7)
8
9func main() {
10client:= &http.Client{
11Timeout: 5 * time.Second,
12}
13
14resp, err:= client.Get("https://httpbin.org/delay/10")
15if err!= nil {
16fmt.Println("Hata:", err)
17return
18}
19defer resp.Body.Close()
20fmt.Println("Başarılı:", resp.Status)
21}

Çıktı: Hata: context deadline exceeded

Client timeout basit ama esnek değildir. Tüm istekler aynı süreden sonra kesilir. Bazı istekler daha uzun, bazıları daha kısa olabilir.

Context Deadline Kullanmak

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Context, her isteğe ayrı ayrı deadline atayabilirsin. Daha granüler kontrol sağlar.

1package main
2
3import (
4"context"
5"fmt"
6"net/http"
7"time"
8)
9
10func main() {
11client:= &http.Client{}
12
13ctx, cancel:= context.WithTimeout(context.Background(), 3*time.Second)
14defer cancel()
15
16req, _:= http.NewRequestWithContext(ctx, "GET", "https://httpbin.org/delay/5", nil)
17resp, err:= client.Do(req)
18if err!= nil {
19fmt.Println("Hata:", err)
20return
21}
22defer resp.Body.Close()
23fmt.Println("Başarılı:", resp.Status)
24}

Çıktı: Hata: context deadline exceeded

Hangisini Seçmeliyim?

Client timeout hızlı, global koruma için kullan. Tüm istekler kısa sürmeli ve tek bir timeout yeterli ise uygun. Context deadline, her isteğin farklı timeout'u olması gerekiyorsa tercih et. Örneğin, kritik istekler 2 saniye, arka plan işleri 30 saniye alabilir.

Birleştirilmiş kullanım da mümkün: Client timeout genel güvenlik, Context deadline ise istek özel ihtiyaçları için. Böyle yapınca, en kısa süre geçerli olur.

bknz: PostgreSQL ile Go: Bağlantı Pooling ve Query Timeout

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz