Difusión de mensajes
Envíe mensajes a muchos clientes
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
broadcastde mensajes - Canales
registeryunregister
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
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
- Conceptos básicos de WebSocket
- Uso de gorilla/websocket
- Difusión de mensajes
- Gestión de conexiones