Когда чат теряет сообщения, почти все команды винят WebSocket.

Сокет тут обычно ни при чём. Реальная проблема — в том, что происходит после reconnect: клиент переподключается, но не знает, какие события уже получил и с какого места продолжать. Поэтому в проде работает не сам сокет, а контракт события: тип, id и порядок. Плюс resume с last event id — без него после обрыва вы молча теряете кусок ленты.

И второй слой, о котором часто забывают, — очередь недоставленного. Retry с backoff и дедупликация по clientMutationId: иначе на мигающем Wi-Fi одно сообщение уходит трижды, и пользователь это заметит.

Это один из тех инвариантов, которые не попадают в туториалы, но без которых чат не выдерживает реальную сеть.

Больше таких разборов — подписывайся на канал. А если хотите собрать realtime-чат от каналов до пушей — первый модуль курса «Realtime и чат» открыт бесплатно.