Контекст: В WSHub.broadcastVisitors было два последовательных прохода по h.clients под одним lock — сначала сбор visitors, затем сбор clients. Между проходами состояние не меняется (lock удерживается), но второй проход избыточен.
// Было: два прохода под одним lock
h.mu.Lock()
for c := range h.clients { // 1-й проход: сбор visitors
visitors = append(visitors, ...)
}
for c := range h.clients { // 2-й проход: сбор clients (дубликат)
clients = append(clients, c)
}
h.mu.Unlock()
map[*Client]bool — лишняя работаclients — состояние может устареть (client уже отключился), но это приемлемоОдин проход:
h.mu.Lock()
for c := range h.clients {
visitors = append(visitors, VisitorDot{...})
clients = append(clients, c)
}
h.mu.Unlock()
Файл: backend/internal/handlers/websocket.go:91-106
Code review 2026-07-01, P2 fix.
#backend #websocket #concurrency #performance