Когда чат теряет сообщения, почти все команды винят WebSocket.
Сокет тут обычно ни при чём. Реальная проблема — в том, что происходит после reconnect: клиент переподключается, но не знает, какие события уже получил и с какого места продолжать. Поэтому в проде работает не сам сокет, а контракт события: тип, id и порядок. Плюс resume с last event id — без него после обрыва вы молча теряете кусок ленты.
И второй слой, о котором часто забывают, — очередь недоставленного. Retry с backoff и дедупликация по clientMutationId: иначе на мигающем Wi-Fi одно сообщение уходит трижды, и пользователь это заметит.
Это один из тех инвариантов, которые не попадают в туториалы, но без которых чат не выдерживает реальную сеть.
Больше таких разборов — подписывайся на канал. А если хотите собрать realtime-чат от каналов до пушей — первый модуль курса «Realtime и чат» открыт бесплатно.