Курс «Архитектура мессенджера» · Часть 2 · Соединение и доставка

Раздел 4. Путь сообщения онлайн-доставка

Полный путь от отправителя к получателю, когда оба онлайн; роль message-сервиса и маршрутизации; подтверждения sent / delivered / read.

Здесь мы собираем воедино то, что уже разбирали по частям: полный путь сообщения, когда и отправитель, и получатель в сети. Это основной, самый частый сценарий. В тренажёре нажми «▶ Онлайн» — материал ниже объясняет логику того, что ты там видишь по шагам.

Полный путь, когда оба в сети

Алиса нажимает «отправить». Дальше сообщение идёт по цепочке:

  1. Алиса → балансировщик. Балансировщик — это узел, который принимает все входящие соединения и распределяет их по серверам, чтобы ни один не перегрузился.
  2. Балансировщик → сервер соединений Алисы (в тренажёре он подписан «Conn-сервер A»). Это узел, который держит постоянную живую связь именно с устройством Алисы.
  3. Сервер соединений → Message-сервис. Message-сервис — это «диспетчер», ядро, через которое проходят все сообщения и где наводится порядок.
  4. Message-сервис сохраняет сообщение в базу данных. Теперь оно надёжно записано и не потеряется, даже если что-то упадёт.
  5. Message-сервис спрашивает Реестр сессий, где сейчас Боб. Реестр сессий — это справочник «кто к какому серверу соединений сейчас подключён».
  6. Боб в сети → Message-сервис пересылает сообщение на сервер соединений Боба.
  7. Сервер соединений → Боб. Сообщение приходит на устройство Боба по его живой связи.

Главная мысль: ни один кусок пути не «магия» — у каждого узла одна понятная задача. На доске именно так и проводят сообщение: проговаривая роль каждого шага.

Message-сервис — диспетчер

Почему всё идёт через одну центральную точку? Потому что именно здесь удобно навести порядок. Message-сервис на каждое сообщение:

  • присваивает уникальный номер (его называют message_id) — чтобы потом отличать сообщения, ловить повторы и выстраивать порядок;
  • проверяет — имеет ли Алиса право писать Бобу, не заблокирована ли она, корректное ли сообщение;
  • сохраняет сообщение в базу;
  • определяет получателя (одного человека или всю группу) и отдаёт сообщение на доставку.

Единая точка логики — это то, из чего потом вырастают гарантии: «не потеряли», «не задвоили», «порядок правильный» (подробно — Раздел 6).

Три галочки: отправлено, доставлено, прочитано

Это любимый вопрос на интервью. Три статуса — это три разных события, и важно их не путать.

  • Отправлено (по-английски sent, одна галочка): сервер принял и сохранил сообщение. Алиса видит: «дошло хотя бы до сервера».
  • Доставлено (delivered, две галочки): сообщение дошло до устройства Боба. Не путать с «прочитано» — Боб мог даже не открывать приложение, но телефон уже получил сообщение.
  • Прочитано (read, синие галочки): Боб открыл чат и увидел сообщение.

Ключевое: «доставлено» — это про устройство, а «прочитано» — про то, что человек реально посмотрел. И то, и другое появляется позже, чем «отправлено».

Подтверждения (квитанции)

Откуда сервер и Алиса узнаю́т про эти статусы? Через подтверждения — маленькие служебные сообщения-квитанции, которые идут обратно по тому же пути.

  • Устройство Боба, получив сообщение, шлёт назад квитанцию «получил» → так рождается галочка доставлено.
  • Когда Боб открывает чат, его устройство шлёт квитанцию «прочитал» → галочка прочитано.

То есть подтверждения — это тоже сообщения, просто технические. Они нужны по двум причинам: чтобы отправитель знал статус, и чтобы система поняла, что сообщение можно убрать из списка «ждущих доставки». Статус «прочитано» — ещё и продуктовое решение: во многих мессенджерах его разрешают отключать ради приватности.

А если получатель отключился прямо сейчас?

Частый вопрос с подвохом. Боб пропал из сети ровно в момент доставки. Сообщение не теряется: оно уже сохранено на сервере (шаг 4). Просто вместо мгновенной доставки оно уходит в очередь ожидания, а Боба позже будит уведомление — это уже офлайн-сценарий (Раздел 5).

Запомни эту мысль: онлайн и офлайн — не два отдельных мира, а одна развилка, которая случается уже ПОСЛЕ сохранения. Сохранили — а дальше либо доставили сразу, либо положили в очередь.

Вопросы интервьюера (с разбором)

«Проведи сообщение по доске от Алисы к Бобу.» Образец: «Алиса отправляет → балансировщик → сервер соединений Алисы → Message-сервис. Он присваивает номер, сохраняет в базу, спрашивает Реестр сессий, где Боб. Боб в сети → пересылаем на его сервер соединений → тот доставляет Бобу. Назад идут квитанции, из которых складываются галочки.» Главное — проговаривать роль каждого узла, а не просто называть стрелки.

«Где появляются галочки "доставлено" и "прочитано"?» Образец: «"Доставлено" — когда устройство Боба получило сообщение и прислало обратно квитанцию. "Прочитано" — когда Боб открыл чат, и его устройство прислало вторую квитанцию. Обе квитанции доходят до Алисы тем же путём в обратную сторону. "Отправлено" появляется раньше — это просто факт, что сервер принял и сохранил сообщение.»

«Что если получатель отключился в момент отправки?» Образец: «Ничего не теряется. Сообщение к этому моменту уже сохранено на сервере. Раз доставить сразу не вышло — оно уходит в очередь ожидания, а получателя будит уведомление. То есть это просто переход на офлайн-ветку, а не ошибка.»


#мессенджер #онлайн-доставка #путь-сообщения #статусы-сообщений #подтверждения #подготовка-к-интервью