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 main23import (4"fmt"5"net/http"6"time"7)89func main() {10client:= &http.Client{11Timeout: 5 * time.Second,12}1314resp, err:= client.Get("https://httpbin.org/delay/10")15if err!= nil {16fmt.Println("Hata:", err)17return18}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
Context, her isteğe ayrı ayrı deadline atayabilirsin. Daha granüler kontrol sağlar.
1package main23import (4"context"5"fmt"6"net/http"7"time"8)910func main() {11client:= &http.Client{}1213ctx, cancel:= context.WithTimeout(context.Background(), 3*time.Second)14defer cancel()1516req, _:= http.NewRequestWithContext(ctx, "GET", "https://httpbin.org/delay/5", nil)17resp, err:= client.Do(req)18if err!= nil {19fmt.Println("Hata:", err)20return21}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.
0 yorum