awesome-everything EN
↑ Обратно к восхождению

Сети и протоколы

WebSocket: чтение кода и конфигов

Суть Читай реальные байты WebSocket-frame, broadcast-цикл отправки, процедуру переподключения и блок Nginx — предскажи поведение и выбери исправление, которое senior-инженер делает первым.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Real-time-баги диагностируются в дампах frame, циклах отправки, процедурах переподключения и конфиге proxy — не в спецификации. Прочитай каждый артефакт, предскажи поведение под нагрузкой и выбери исправление, к которому senior-инженер тянется первым.

Цель

Отрепетируй цикл, который ты гоняешь в каждом WebSocket-инциденте: прочитай байты на проводе или горячий путь, предскажи, где он ломается, и примени самое результативное исправление до добавления серверов или ручек.

Сниппет 1 — frame на проводе

Frame bytes (hex): 89 04 70 69 6E 67
Викторина

Сервер получил эти байты от клиента. Что это за frame и что сервер обязан сделать?

Сниппет 2 — broadcast-цикл

function broadcast(clients, message) {
  for (const ws of clients) {
    ws.send(message);            // enqueue, returns immediately
  }
}
// called every 10 ms with a 100 KB payload, 10k clients
Викторина

Несколько сотен клиентов на медленных каналах. С этим циклом что происходит под устойчивой нагрузкой и каково самое результативное исправление?

Сниппет 3 — процедура переподключения

let attempt = 0;
function reconnect() {
  const delay = Math.min(1000 * 2 ** attempt, 60000);
  setTimeout(() => { attempt++; connect(); }, delay);
}
Викторина

Деплой роняет 5 миллионов клиентов разом, и все запускают эту процедуру. Что идёт не так и каково однострочное исправление?

Сниппет 4 — блок location в Nginx

location /ws {
  proxy_pass http://backend;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "Upgrade";
}
Викторина

Upgrade WebSocket проходит успешно, но соединения тихо умирают примерно через минуту бездействия в production. Чего не хватает в этом блоке?

Итог

Каждый WebSocket-инцидент читается в артефактах: nibble opcode у frame говорит ping (отвечай pong) против data; безграничный цикл отправки уходит в OOM на медленных клиентах, если high-water mark не ограничит очередь; процедура переподключения без jitter превращает деплой в thundering herd; а блок Nginx без поднятого proxy_read_timeout тихо убивает idle-соединения на 60 с. Диагностируй по артефакту, примени исправление с верха лестницы, потом подтверди под той же нагрузкой.

Продолжить восхождение ↑WebSocket: пережить broadcast-шторм
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.