> Что такое WebSocket и как он работает (Go)
Уровень: junior · Роль: backend · Категория: Технические вопросы
Компании: Wildberries
Стек: Go
> Пример ответа
WebSocket - это протокол полнодуплексной связи поверх одного TCP-соединения, предназначенный для реального времени. В отличие от HTTP, где клиент инициирует запрос, а сервер отвечает, WebSocket позволяет обеим сторонам отправлять данные в любой момент без дополнительных накладных расходов.
Как это работает:
-
Рукакопожатие (handshake): Клиент отправляет HTTP-запрос с заголовком
Upgrade: websocketиConnection: Upgrade. Сервер отвечает статусом 101 Switching Protocols, после чего соединение переводится из HTTP в WebSocket. -
Фреймы данных: После установки соединения данные передаются в виде фреймов (текстовых или бинарных). Каждый фрейм имеет заголовок (длиной от 2 до 14 байт) и полезную нагрузку. Протокол поддерживает фрагментацию сообщений и контрольные фреймы (ping/pong для проверки соединения, close для закрытия).
-
Закрытие: Любая сторона может инициировать закрытие, отправив фрейм close с кодом причины.
В Go для работы с WebSocket часто используют библиотеку gorilla/websocket. Пример эхо-сервера:
GOpackage mainimport ("log""net/http""github.com/gorilla/websocket")var upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { return true },}func echoHandler(w http.ResponseWriter, r *http.Request) {conn, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Print("Upgrade failed:", err)return}defer conn.Close()for {messageType, message, err := conn.ReadMessage()if err != nil {break}if err := conn.WriteMessage(messageType, message); err != nil {break}}}func main() {http.HandleFunc("/echo", echoHandler)log.Fatal(http.ListenAndServe(":8080", nil))}
Ключевые особенности: низкая задержка, постоянное соединение, подходит для чатов, уведомлений, игр и стриминга. Важно учитывать, что WebSocket не поддерживается в HTTP/2 (но есть альтернативы вроде Server-Sent Events для однонаправленной связи).
> Похожие задачи по backend
Использовали ли кэши в Go, например Redis, и как кэшировали
Какой формат данных выбрать для клиента: JSON, YAML или XML и почему
В чем разница наследования в Go и классического наследования
Какой план действий при перегрузке CPU и срабатывании алерта
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью