Какие проблемы возникают в Web Socket при конкурентной записи

«Какие проблемы возникают в Web Socket при конкурентной записи» — вопрос из категории Сети, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Главные проблемы при конкурентной записи в WebSocket:

  1. Гонка данных - несколько горутин могут одновременно пытаться записать в соединение, что приводит к повреждению сообщений. WebSocket соединение не потокобезопасно.

  2. Блокировка - долгая запись одной горутиной может заблокировать другие.

  3. Паника - попытка записи в закрытое соединение вызовет панику.

Решение - использовать мьютексы или каналы для синхронизации:

type SafeConn struct {
    conn net.Conn
    mu   sync.Mutex
}

func (sc *SafeConn) Write(data []byte) error {
    sc.mu.Lock()
    defer sc.mu.Unlock()
    _, err := sc.conn.Write(data)
    return err
}

Или канал-диспетчер:

func writer(conn net.Conn, ch chan []byte) {
    for msg := range ch {
        conn.Write(msg)
    }
}