İletileri Yayınlama
Birçok istemciye gönderin
İletileri Yayınlama, 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.
Birçok İstemciye Gönderme
Sohbet odaları ve canlı akışlar tek bir mesajı bağlı her istemciye göndermelidir. Her WebSocket yalnızca bir yazıcıya izin verdiğinden bir eşgüdüm düzenine ihtiyacınız vardır: merkez.
Merkez Düzeni
Merkez, istemci kümesine ve bir yayın kanalına sahip olan merkezi bir goroutine'dir. İstemciler kaydolur, kayıtlarını siler ve merkez mesajları dağıtır. Paylaşılan haritaya birden fazla goroutine tarafından doğrudan erişilmez.
Merkez Veri Yapıları
Merkez şunları tutar:
- Bir istemci kümesi (
map[*Client]bool) - Mesajlardan oluşan bir
broadcastkanalı registerveunregisterkanalları
type Hub struct {
clients map[*Client]bool
broadcast chan []byte
register chan *Client
unregister chan *Client
}Merkezin Çalışma Döngüsü
Tek bir Run goroutine'i kanallar üzerinde seçim yapar. Haritayı yalnızca bu goroutine değiştirdiği için mutex gerekmez.
func (h *Hub) Run() {
for {
select {
case c := <-h.register:
h.clients[c] = true
case c := <-h.unregister:
delete(h.clients, c)
close(c.send)
case msg := <-h.broadcast:
for c := range h.clients {
c.send <- msg
}
}
}
}İstemci Başına Gönderim Kanalı
Her istemcide tamponlanmış bir send chan []byte bulunur. Merkez bu kanala yazar; özel bir yazıcı goroutine'i kanaldaki verileri sokete aktarır. Böylece tek yazıcı kuralına uyulur.
type Client struct {
conn *websocket.Conn
send chan []byte
}Yazıcı Goroutine'i
Her istemci, send üzerinde dolaşan ve sokete yazan bir writePump çalıştırır. Kanal kapanırsa bir kapatma çerçevesi gönderir.
func (c *Client) writePump() {
for msg := range c.send {
c.conn.WriteMessage(websocket.TextMessage, msg)
}
}Yavaş İstemcilerden Kaçınma
Bir istemci yavaşsa tamponlanmış send kanalı dolar. Yaygın bir ilke şudur: arabellek doluysa tüm merkezi engellemek yerine istemciyi çıkarınız.
select {
case c.send <- msg:
default:
close(c.send)
delete(h.clients, c)
}Kilitler Yerine Kanalların Tercih Edilmesi
Go'nun düsturu şudur: "belleği iletişim kurarak paylaşın." Tüm değişiklikleri kanallar aracılığıyla tek bir goroutine üzerinden yönlendirmek, açık kilitleme olmadan istemci haritasındaki yarış koşullarını önler.
Mesaj Yayınlama
Herhangi bir işleyici, merkez kanalına gönderim yaparak yayınlayabilir; merkez de mesajı kayıtlı her istemciye dağıtır.
hub.broadcast <- []byte("server announcement")Hedefli Gönderim ve Yayınlama
Odalar veya doğrudan mesajlar için istemcileri oda ya da kullanıcı kimliğine göre saklayınız ve tüm istemciler yerine yalnızca ilgili alt kümeyi dolaşınız. Bu, çok sayıda odanın bulunduğu bir sohbeti verimli tutar.
Çalıştırılabilir: Kanallarla Dağıtım
Bu kendi içinde çalışan program, yalnızca standart kitaplığı ve goroutine'leri kullanarak merkezin tek bir mesajı birkaç istemci kanalına dağıtmasını modeller.
package main
import (
"fmt"
"sync"
)
func main() {
clients := []chan string{make(chan string, 1), make(chan string, 1), make(chan string, 1)}
msg := "hello all"
for _, c := range clients {
c <- msg // fan-out
}
var wg sync.WaitGroup
for i, c := range clients {
wg.Add(1)
go func(id int, ch chan string) {
defer wg.Done()
fmt.Printf("client %d got: %s\n", id, <-ch)
}(i, c)
}
wg.Wait()
}Hızlı Kontrol
Yayınlamayı anlayıp anlamadığınızı sınayınız.
Özet
Birçok istemciye yayın yapmayı öğrendiniz:
- Merkez goroutine'i istemci kümesine ve bir yayın kanalına sahip olur
- Her istemcinin, bir yazıcı goroutine'i tarafından boşaltılan tamponlanmış bir gönderim kanalı vardır
- Bu, bağlantı başına tek yazıcı kuralına uyar
- Merkezi yanıt verebilir durumda tutmak için yavaş istemcileri çıkarınız
Sıkça Sorulan Sorular
“İletileri Yayınlama” dersi ücretsiz mi?
Evet — “İletileri Yayınlama” 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.
“İletileri Yayınlama” dersinde ne öğreneceğim?
Birçok istemciye gönderin 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.
“İletileri Yayınlama” 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
- WebSocket Temelleri
- gorilla/websocket Kullanımı
- İletileri Yayınlama
- Bağlantı Yönetimi