Раздел 4. Путь сообщения онлайн-доставка
Полный путь от отправителя к получателю, когда оба онлайн; роль message-сервиса и маршрутизации; подтверждения sent / delivered / read.
Здесь мы собираем воедино то, что уже разбирали по частям: полный путь сообщения, когда и отправитель, и получатель в сети. Это основной, самый частый сценарий. В тренажёре нажми «▶ Онлайн» — материал ниже объясняет логику того, что ты там видишь по шагам.
Полный путь, когда оба в сети
Алиса нажимает «отправить». Дальше сообщение идёт по цепочке:
- Алиса → балансировщик. Балансировщик — это узел, который принимает все входящие соединения и распределяет их по серверам, чтобы ни один не перегрузился.
- Балансировщик → сервер соединений Алисы (в тренажёре он подписан «Conn-сервер A»). Это узел, который держит постоянную живую связь именно с устройством Алисы.
- Сервер соединений → Message-сервис. Message-сервис — это «диспетчер», ядро, через которое проходят все сообщения и где наводится порядок.
- Message-сервис сохраняет сообщение в базу данных. Теперь оно надёжно записано и не потеряется, даже если что-то упадёт.
- Message-сервис спрашивает Реестр сессий, где сейчас Боб. Реестр сессий — это справочник «кто к какому серверу соединений сейчас подключён».
- Боб в сети → Message-сервис пересылает сообщение на сервер соединений Боба.
- Сервер соединений → Боб. Сообщение приходит на устройство Боба по его живой связи.
Главная мысль: ни один кусок пути не «магия» — у каждого узла одна понятная задача. На доске именно так и проводят сообщение: проговаривая роль каждого шага.
Message-сервис — диспетчер
Почему всё идёт через одну центральную точку? Потому что именно здесь удобно навести порядок. Message-сервис на каждое сообщение:
- присваивает уникальный номер (его называют
message_id) — чтобы потом отличать сообщения, ловить повторы и выстраивать порядок; - проверяет — имеет ли Алиса право писать Бобу, не заблокирована ли она, корректное ли сообщение;
- сохраняет сообщение в базу;
- определяет получателя (одного человека или всю группу) и отдаёт сообщение на доставку.
Единая точка логики — это то, из чего потом вырастают гарантии: «не потеряли», «не задвоили», «порядок правильный» (подробно — Раздел 6).
Три галочки: отправлено, доставлено, прочитано
Это любимый вопрос на интервью. Три статуса — это три разных события, и важно их не путать.
- Отправлено (по-английски sent, одна галочка): сервер принял и сохранил сообщение. Алиса видит: «дошло хотя бы до сервера».
- Доставлено (delivered, две галочки): сообщение дошло до устройства Боба. Не путать с «прочитано» — Боб мог даже не открывать приложение, но телефон уже получил сообщение.
- Прочитано (read, синие галочки): Боб открыл чат и увидел сообщение.
Ключевое: «доставлено» — это про устройство, а «прочитано» — про то, что человек реально посмотрел. И то, и другое появляется позже, чем «отправлено».
Подтверждения (квитанции)
Откуда сервер и Алиса узнаю́т про эти статусы? Через подтверждения — маленькие служебные сообщения-квитанции, которые идут обратно по тому же пути.
- Устройство Боба, получив сообщение, шлёт назад квитанцию «получил» → так рождается галочка доставлено.
- Когда Боб открывает чат, его устройство шлёт квитанцию «прочитал» → галочка прочитано.
То есть подтверждения — это тоже сообщения, просто технические. Они нужны по двум причинам: чтобы отправитель знал статус, и чтобы система поняла, что сообщение можно убрать из списка «ждущих доставки». Статус «прочитано» — ещё и продуктовое решение: во многих мессенджерах его разрешают отключать ради приватности.
А если получатель отключился прямо сейчас?
Частый вопрос с подвохом. Боб пропал из сети ровно в момент доставки. Сообщение не теряется: оно уже сохранено на сервере (шаг 4). Просто вместо мгновенной доставки оно уходит в очередь ожидания, а Боба позже будит уведомление — это уже офлайн-сценарий (Раздел 5).
Запомни эту мысль: онлайн и офлайн — не два отдельных мира, а одна развилка, которая случается уже ПОСЛЕ сохранения. Сохранили — а дальше либо доставили сразу, либо положили в очередь.
Вопросы интервьюера (с разбором)
«Проведи сообщение по доске от Алисы к Бобу.» Образец: «Алиса отправляет → балансировщик → сервер соединений Алисы → Message-сервис. Он присваивает номер, сохраняет в базу, спрашивает Реестр сессий, где Боб. Боб в сети → пересылаем на его сервер соединений → тот доставляет Бобу. Назад идут квитанции, из которых складываются галочки.» Главное — проговаривать роль каждого узла, а не просто называть стрелки.
«Где появляются галочки "доставлено" и "прочитано"?» Образец: «"Доставлено" — когда устройство Боба получило сообщение и прислало обратно квитанцию. "Прочитано" — когда Боб открыл чат, и его устройство прислало вторую квитанцию. Обе квитанции доходят до Алисы тем же путём в обратную сторону. "Отправлено" появляется раньше — это просто факт, что сервер принял и сохранил сообщение.»
«Что если получатель отключился в момент отправки?» Образец: «Ничего не теряется. Сообщение к этому моменту уже сохранено на сервере. Раз доставить сразу не вышло — оно уходит в очередь ожидания, а получателя будит уведомление. То есть это просто переход на офлайн-ветку, а не ошибка.»
#мессенджер #онлайн-доставка #путь-сообщения #статусы-сообщений #подтверждения #подготовка-к-интервью