Go Academy · Pelajaran

Menyiarkan Mesej

Hantar kepada banyak klien

Pelajaran 3 daripada 413 langkah

Menyiarkan Mesej ialah pelajaran Go Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Go Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Go Academy merangkumi sejumlah 4 pelajaran.

Menghantar kepada Banyak Klien

Bilik sembang dan suapan langsung perlu menolak satu mesej kepada setiap klien yang bersambung. Oleh sebab setiap WebSocket hanya membenarkan seorang penulis, anda memerlukan corak penyelarasan: hab.

Corak Hab

Hab ialah satu gorutin pusat yang memiliki set klien dan saluran penyiaran. Klien mendaftar, menyahdaftar, dan hab menyebarkan mesej kepada mereka. Tiada peta dikongsi yang diakses secara langsung oleh beberapa gorutin.

Struktur Data Hab

Hab menyimpan:

  • Satu set klien (map[*Client]bool)
  • Satu saluran broadcast yang mengandungi mesej
  • Saluran register dan unregister
type Hub struct {
    clients    map[*Client]bool
    broadcast  chan []byte
    register   chan *Client
    unregister chan *Client
}

Gelung Pelaksanaan Hab

Satu gorutin Run memilih daripada saluran-saluran tersebut. Oleh sebab hanya gorutin ini yang mengubah peta, mutex tidak diperlukan.

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
            }
        }
    }
}

Saluran Penghantaran Setiap Klien

Setiap klien mempunyai send chan []byte berpenimbal. Hab menulis kepadanya; gorutin penulis khusus mengosongkan saluran itu ke soket. Ini mematuhi peraturan seorang penulis.

type Client struct {
    conn *websocket.Conn
    send chan []byte
}

Gorutin Penulis

Setiap klien menjalankan writePump yang mengulangi kandungan send dan menulisnya ke soket. Jika saluran ditutup, gorutin itu menghantar bingkai penutupan.

func (c *Client) writePump() {
    for msg := range c.send {
        c.conn.WriteMessage(websocket.TextMessage, msg)
    }
}

Mengelakkan Klien Perlahan

Jika seorang klien perlahan, send berpenimbal miliknya akan penuh. Dasar yang biasa digunakan ialah menggugurkan klien itu apabila penimbal penuh, bukannya menyekat seluruh hab.

select {
case c.send <- msg:
default:
    close(c.send)
    delete(h.clients, c)
}

Mengapa Saluran, Bukan Mutex

Cogan kata Go: "kongsi memori melalui komunikasi." Menyalurkan semua perubahan melalui satu gorutin menggunakan saluran mengelakkan keadaan perlumbaan pada peta klien tanpa penguncian eksplisit.

Menyiarkan Mesej

Mana-mana pengendali boleh menyiarkan mesej dengan menghantarnya melalui saluran hab; hab akan menyebarkannya kepada setiap klien yang berdaftar.

hub.broadcast <- []byte("server announcement")

Disasarkan berbanding Disiarkan

Untuk bilik atau mesej terus, simpan klien dengan kunci bilik atau ID pengguna dan ulang hanya subset yang berkaitan, bukannya semua klien. Ini memastikan sembang dengan banyak bilik kekal cekap.

Boleh Dijalankan: Penyebaran Menggunakan Saluran

Program kendiri ini memodelkan hab yang menyebarkan satu mesej kepada beberapa saluran klien menggunakan pustaka standard dan gorutin sahaja.

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()
}

Semakan Pantas

Uji pemahaman anda tentang penyiaran.

Ulang Kaji

Anda telah mempelajari cara menyiarkan kepada banyak klien:

  • Gorutin hab memiliki set klien dan saluran penyiaran
  • Setiap klien mempunyai saluran penghantaran berpenimbal yang dikosongkan oleh gorutin penulis
  • Ini mematuhi peraturan seorang penulis bagi setiap sambungan
  • Gugurkan klien perlahan supaya hab kekal responsif
Percuma untuk bermula

Pelajari Go dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
51
Pelajaran
203

Soalan Lazim

Adakah pelajaran “Menyiarkan Mesej” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Go Academy, termasuk “Menyiarkan Mesej”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Go Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Menyiarkan Mesej”?

Hantar kepada banyak klien Anda berlatih Go Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Go Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Go Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Menyiarkan Mesej” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Asas WebSocket
  2. Menggunakan gorilla/websocket
  3. Menyiarkan Mesej
  4. Pengurusan Sambungan
← Kembali ke Go Academy