Go Academy · Lección

Difusión de mensajes

Envíe mensajes a muchos clientes

Lección 3 de 413 pasos

Difusión de mensajes es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

Envío a muchos clientes

Las salas de chat y los feeds en directo necesitan enviar un único mensaje a todos los clientes conectados. Como cada WebSocket permite un solo escritor, necesita un patrón de coordinación: el hub.

El patrón hub

Un hub es una goroutine central que posee el conjunto de clientes y un canal de difusión. Los clientes se registran y se dan de baja, y el hub distribuye los mensajes entre ellos. Ninguna goroutine accede directamente al mapa compartido.

Estructuras de datos del hub

El hub contiene:

  • Un conjunto de clientes (map[*Client]bool)
  • Un canal broadcast de mensajes
  • Canales register y unregister
type Hub struct {
    clients    map[*Client]bool
    broadcast  chan []byte
    register   chan *Client
    unregister chan *Client
}

El bucle de ejecución del hub

Una única goroutine Run selecciona entre los canales. Como solo esta goroutine modifica el mapa, no se necesita ningún mutex.

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

Canal de envío por cliente

Cada cliente tiene un send chan []byte con búfer. El hub escribe en él y una goroutine de escritura dedicada lo vacía hacia el socket. Esto respeta la regla de un solo escritor.

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

La goroutine de escritura

Cada cliente ejecuta un writePump que recorre send y escribe en el socket. Si el canal se cierra, envía una trama de cierre.

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

Cómo evitar clientes lentos

Si un cliente es lento, su send con búfer se llena. Una política habitual consiste en eliminar el cliente si el búfer está lleno, en lugar de bloquear todo el hub.

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

Por qué usar canales en lugar de mutexes

El lema de Go es: "comparta memoria comunicándose". Canalizar todas las modificaciones a través de una sola goroutine mediante canales evita las condiciones de carrera en el mapa de clientes sin bloqueos explícitos.

Difusión de un mensaje

Cualquier handler puede difundir un mensaje enviándolo al canal del hub; el hub lo distribuye entre todos los clientes registrados.

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

Envío dirigido frente a difusión

Para salas o mensajes directos, almacene los clientes agrupados por sala o ID de usuario y recorra únicamente el subconjunto relevante, en lugar de recorrer todos los clientes. Así, un chat con muchas salas sigue siendo eficiente.

Ejecutable: distribución mediante canales

Este programa autónomo modela cómo un hub distribuye un mensaje entre varios canales de clientes utilizando únicamente la biblioteca estándar y goroutines.

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

Comprobación rápida

Compruebe su comprensión de la difusión.

Resumen

Ha aprendido a difundir mensajes a muchos clientes:

  • La goroutine del hub posee el conjunto de clientes y un canal de difusión
  • Cada cliente tiene un canal de envío con búfer que una goroutine de escritura vacía
  • Esto respeta la regla de un solo escritor por conexión
  • Elimine los clientes lentos para mantener el hub receptivo
Gratis para empezar

Aprende Go con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
51
Lecciones
203

Preguntas frecuentes

¿La lección «Difusión de mensajes» es gratis?

Sí — el texto completo de «Difusión de mensajes» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Difusión de mensajes»?

Envíe mensajes a muchos clientes Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Difusión de mensajes»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Conceptos básicos de WebSocket
  2. Uso de gorilla/websocket
  3. Difusión de mensajes
  4. Gestión de conexiones
← Volver a Go Academy