Concurrency Patterns: Fan-in, Fan-out ve Worker Pool Modelleri

irfo

Moderatör
Katılım
7 Ocak 2026
Mesajlar
183
Tepkime puanı
2
Puanları
18
Go’nun goroutine ve channel yapısı, karmaşık iş yüklerini yönetmek için basit ama çok güçlü desenler (concurrency patterns) sunar. Bu modelleri anlamak, uygulamanızın kaynaklarını boşa harcamadan binlerce işlemi paralel olarak yönetmenizi sağlar.
İşte en yaygın üç eşzamanlılık deseni:

1. Fan-Out (Yelpaze Dışa)​

Fan-Out, tek bir kaynaktan gelen işlerin, paralel olarak işlenmesi için birden fazla goroutine'e dağıtılmasıdır. Ağır hesaplama gerektiren veya uzun süren işlemleri hızlandırmak için kullanılır.
  • Nasıl Çalışır? Bir ana goroutine, işleri bir kanala gönderir; birden fazla "worker" (işçi) aynı kanalı dinleyerek işleri paylaşır.

2. Fan-In (Yelpaze İçe)​

Fan-In, birden fazla kaynaktan gelen verilerin tek bir kanalda birleştirilmesidir. Farklı servislerden veya goroutine'lerden gelen sonuçları tek bir yerden okumak istediğinizde kullanılır.
  • Nasıl Çalışır? Birden fazla kanal, birleştirici (multiplexer) bir fonksiyona veri gönderir ve bu fonksiyon tüm verileri tek bir çıkış kanalına yönlendirir.
Go
Kod:
func fanIn(input1, input2 <-chan string) <-chan string {
    c := make(chan string)
    go func() {
        for {
            select {
            case s := <-input1: c <- s
            case s := <-input2: c <- s
            }
        }
    }()
    return c
}

3. Worker Pool (İşçi Havuzu) Modeli​

Bu, sistem kaynaklarını korumak için en kritik desendir. Sınırsız sayıda goroutine açmak yerine, sabit sayıda "işçi" oluşturup işleri bir kuyruk (queue) üzerinden yönetmenizi sağlar.
  • Neden Önemli? Eğer 1 milyon isteği 1 milyon goroutine ile karşılarsanız bellek ve CPU darboğazı oluşabilir. Worker Pool, bu yükü örneğin sadece 100 goroutine ile sırayla işlemenizi sağlar.

Örnek Worker Pool Yapısı:​

Go
Kod:
func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        fmt.Printf("İşçi %d işe başladı: %d\n", id, j)
        time.Sleep(time.Second) // İş simülasyonu
        results <- j * 2
    }
}

func main() {
    const numJobs = 5
    jobs := make(chan int, numJobs)
    results := make(chan int, numJobs)

    // 3 adet işçi oluştur (Havuz)
    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }

    // İşleri gönder
    for j := 1; j <= numJobs; j++ {
        jobs <- j
    }
    close(jobs)

    // Sonuçları topla
    for a := 1; a <= numJobs; a++ {
        <-results
    }
}

Modellerin Karşılaştırması​

ModelNe Zaman Kullanılır?Temel Faydası
Fan-OutElinizde çok iş, az zaman varsa.Paralellik ve hız kazandırır.
Fan-InFarklı kaynaklardan veri topluyorsanız.Veri akışını merkezileştirir.
Worker PoolKaynakları (CPU/RAM) kontrol altında tutmak istiyorsanız.Aşırı yüklenmeyi (overloading) önler.
 
Geri
Üst