Context: İstek İptalleri ve Timeout Yönetimi

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18

"İptal Et" Butonunun Arkasındaki Güç​

Bir web sunucusu yazdınız. Kullanıcı bir rapor istedi, veritabanı sorgusu başladı ve işlemin 10 saniye süreceği belli.Kullanıcı 2. saniyede sıkıldı ve tarayıcıyı kapattı. Ne olur?

  • Context Kullanmazsanız: Sunucu habersizce 8 saniye daha çalışır, sonucu bulur ve kimseye gönderemez. Kaynak israfı!
  • Context Kullanırsanız: Kullanıcı gittiği an, veritabanı sorgusu da dahil tüm işlemler anında iptal edilir.

context.WithTimeout​

Go'da her işlem (goroutine), bir Context taşımalıdır.

Kod:
package main

import ("context""fmt""time")

// Uzun süren bir işlemi simüle eden fonksiyonfunc islemYap(ctx context.Context) {select {case <-time.After(5 * time.Second): // İşlem 5 saniye sürüyorfmt.Println("İşlem başarıyla bitti!")case <-ctx.Done(): // Context'ten "Bitti/İptal" sinyali gelirsefmt.Println("İşlem İPTAL EDİLDİ:", ctx.Err())}}

func main() {// 1. Boş bir context oluşturctx := context.Background()

// 2. Bu context'e 2 saniyelik bir zaman aşımı (Timeout) kuralı ekle<br>// Yani: "Bu işlem 2 saniyede bitmezse, öldür."<br>ctx, cancel := context.WithTimeout(ctx, 2*time.Second)<br><br>// cancel fonksiyonunu main bitince çağırmak iyi pratiktir (Kaynak temizliği)<br>defer cancel()<br><br>fmt.Println("İşlem başlıyor...")<br>islemYap(ctx) <br><br>// Sonuç: İşlem 5 saniye sürecekti ama biz 2 saniye süre verdik.<br>// Çıktı: İşlem İPTAL EDİLDİ: context deadline exceeded<br>
}

Neden Önemli?​

Özellikle Mikroservislerde, Servis A -> Servis B -> Veritabanı zincirinde; A iptal olursa bu bilginin Veritabanına kadar gitmesi gerekir. Context bu sinyali taşıyan kuryedir.

Sonuç​

Context paketi Go'nun "Concurrency" modelinin emniyet kemeridir. Done() kanalını dinleyerek işlemlerinizi ne zaman durdurmanız gerektiğini bilirsiniz.
 
Geri
Üst