0Pricing
Go Academy · Ders

Sunucu ve İstemci Akışı

Çift yönlü akış ve geri basınç

Sunucu ve İstemci Akışı, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Go Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Go Academy kursu toplamda 4 dersten oluşur.

gRPC akış türleri

gRPC, tekli modelin yanı sıra üç akış türünü destekler: sunucu akışı (sunucu birçok ileti gönderir), istemci akışı (istemci birçok ileti gönderir) ve çift yönlü akış (her ikisi de akış oluşturur).

.proto dosyasında sunucu akışı

Yanıt türünün önünde stream anahtar sözcüğünü kullanın:

service EventService {
    rpc ListEvents (ListEventsRequest) returns (stream Event);
}

Sunucu akışının uygulanması

Sunucu, stream.Send() çağrısını yaparak birden çok ileti gönderir ve işlem tamamlandığında nil döndürür:

func (s *server) ListEvents(req *pb.ListEventsRequest, stream pb.EventService_ListEventsServer) error {
    for _, event := range s.events {
        if err := stream.Send(event); err != nil { return err }
    }
    return nil
}

İstemcinin sunucu akışını alması

İstemci, io.EOF oluşana kadar bir döngü içinde Recv() çağrısını yapar:

stream, err := client.ListEvents(ctx, &pb.ListEventsRequest{})
for {
    event, err := stream.Recv()
    if err == io.EOF { break }
    if err != nil { log.Fatal(err) }
    fmt.Println(event)
}

.proto dosyasında istemci akışı

İstek türünün önünde stream kullanın:

service UploadService {
    rpc Upload (stream Chunk) returns (UploadResponse);
}

İstemci akışının uygulanması

İstemci birden çok ileti gönderir, ardından CloseAndRecv ile akışı kapatır:

stream, _ := client.Upload(ctx)
for _, chunk := range chunks {
    stream.Send(chunk)
}
resp, err := stream.CloseAndRecv()

Sunucunun istemci akışını alması

io.EOF oluşana kadar bir döngü içinde stream.Recv() çağrısını yapın, ardından son yanıtı döndürün:

func (s *server) Upload(stream pb.UploadService_UploadServer) error {
    for {
        chunk, err := stream.Recv()
        if err == io.EOF {
            return stream.SendAndClose(&pb.UploadResponse{Received: total})
        }
        if err != nil { return err }
        total += len(chunk.Data)
    }
}

Çift yönlü akış

Hem istemci hem de sunucu birbirinden bağımsız olarak gönderip alabilir. .proto içinde her iki tarafta da stream kullanarak bildirimde bulunun.

service ChatService {
    rpc Chat (stream Message) returns (stream Message);
}

Çift yönlü sunucu uygulaması

Sunucu, alma işlemini bir goroutine içinde gerçekleştirir ve gönderme işlemini bağımsız olarak yapar:

func (s *server) Chat(stream pb.ChatService_ChatServer) error {
    for {
        msg, err := stream.Recv()
        if err == io.EOF { return nil }
        if err != nil { return err }
        stream.Send(&pb.Message{Text: "echo: " + msg.Text})
    }
}

Akış denetimi

gRPC, hızlı göndericilerin yavaş alıcıları aşırı yüklemesini önlemek için HTTP/2 akış denetimini kullanır. Recv() çağrıları doğal olarak geri basınç uygular; alıcı okumadığında gönderme işlemi engellenir.

Bağlamın iptal edilmesi

Tüm akış çağrılarına zaman sınırı veya iptal içeren bir bağlam aktarın. Bağlam tamamlandığında akış iptal edilir ve Recv/Send bir hata döndürür.

Hızlı Kontrol

Sunucu akışlı bir RPC sunucusu, gönderme işlemini tamamladığını nasıl bildirir?

Özet: gRPC Akışı

Temel noktalar:

  • Sunucu akışı: yanıt üzerinde stream anahtar sözcüğü; sunucu Send() çağrısını yapar
  • İstemci akışı: istek üzerinde stream anahtar sözcüğü; istemci önce Send(), ardından CloseAndRecv() çağrısını yapar
  • Çift yönlü akış: her iki tarafta da stream; bağımsız Send ve Recv goroutine'leri
  • Bağlam iptali tüm akış çağrıları için geçerlidir

Sıkça Sorulan Sorular

“Sunucu ve İstemci Akışı” dersi ücretsiz mi?

Evet — “Sunucu ve İstemci Akışı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Go Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Go Academy kursu toplamda 4 dersten oluşur.

“Sunucu ve İstemci Akışı” dersinde ne öğreneceğim?

Çift yönlü akış ve geri basınç Go Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Go Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Go Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Sunucu ve İstemci Akışı” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Go Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Go Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Protocol Buffers ve .proto Dosyaları
  2. Tekli gRPC Hizmeti Uygulama
  3. Sunucu ve İstemci Akışı
  4. gRPC Araya Giricileri ve Meta Veriler
← Go Academy Sayfasına Dön