Курс «Архитектура мессенджера» · Часть 1 · Картина целиком

Раздел 1. Что такое мессенджер с точки зрения архитектуры

Чем мессенджер отличается от обычного веб-сервиса; почему нужны постоянные соединения, а не модель «запрос — ответ»; ключевые сущности (пользователь, устройство, чат, сообщение); знакомство с главным тренажёром.

Это вводный раздел: здесь мы не лезем в протоколы и базы, а фиксируем одну мысль, из которой потом вырастают все остальные решения курса — мессенджер устроен принципиально не так, как обычный веб-сервис. Если эта мысль села, дальше всё ложится на неё. В главном тренажёре это та самая базовая схема, которую ты будешь дополнять по ходу курса.

Чем мессенджер отличается от модели «запрос — ответ»

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

Мессенджеру этого мало. Когда Алиса пишет Бобу, сообщение надо доставить тому, кто прямо сейчас ничего не спрашивает. Боб не опрашивает сервер каждую секунду «нет ли мне чего» — он может вообще смотреть в другое приложение. Значит, сервер должен уметь сам, по своей инициативе, толкнуть сообщение на устройство получателя. А чтобы было куда толкать, между устройством и сервером нужен заранее открытый канал — постоянное соединение (обычно WebSocket, подробно — Раздел 3).

Аналогия: обычный сайт — это справочное окно, к которому ты подходишь с вопросом. Мессенджер — это всегда поднятая телефонная линия: связь держат открытой, чтобы в любой момент можно было что-то сказать в обе стороны.

Вот это «доставить тому, кто не спрашивает» — и есть ядро отличия, ради которого вся архитектура и усложняется.

Ключевые сущности

Прежде чем рисовать, полезно назвать «действующих лиц» — на них держится вся модель:

  • Пользователь (аккаунт) — это человек, его учётная запись.
  • Устройство — телефон, ноутбук, веб-версия. Важно: аккаунт — это не одно устройство, у одного пользователя их обычно несколько, и каждое держит свою связь с сервером (Раздел 10).
  • Чат — диалог (1-на-1) или группа/канал. Именно к чату привязан порядок сообщений (Раздел 6).
  • Сообщение — единица переписки; у него есть уникальный номер, по которому ловят повторы и держат порядок (Раздел 6).

Различение «аккаунт ≠ устройство» кажется мелочью, но именно из него потом растут и мультидевайс, и сложности шифрования.

Хребет доставки

Главная схема всего курса — путь сообщения от отправителя к получателю. Запомни её как костяк, на который вешается всё остальное:

Клиент → балансировщик → сервер соединений отправителя → Message-сервис
        → (база сообщений + Реестр сессий) → сервер соединений получателя → клиент

У каждого узла одна понятная задача:

  • балансировщик — принимает входящие соединения и ровно раскидывает их по серверам;
  • сервер соединений (Conn-сервер, gateway) — держит живую связь с конкретным устройством;
  • Message-сервис — «диспетчер», единая точка, через которую проходят все сообщения и где наводится порядок;
  • база сообщений — надёжно хранит переписку;
  • Реестр сессий — справочник «кто к какому серверу соединений сейчас подключён».

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

Развилка онлайн / офлайн

Ключевой момент: сразу после того, как Message-сервис сохранил сообщение, происходит развилка.

  • Получатель в сети: Реестр находит его активное соединение → сообщение доставляют сразу.
  • Получатель офлайн: сообщение кладут в очередь ожидания, а устройство будит push-уведомление (APNs/FCM); при переподключении клиент сам забирает накопленное из очереди.

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

Что навешивается сверху

Базовый скелет доставляет текст между двумя людьми. Всё остальное — это навесные подсистемы, и каждая из них — отдельная инженерная задача со своими нагрузками и компромиссами. Поэтому их и выносят отдельно, а не пихают в одно ядро:

  • хранение и шардирование сообщений (Раздел 8);
  • медиа и CDN — фото, видео, файлы (Раздел 9);
  • статусы присутствия — онлайн, «печатает…» (Раздел 7);
  • fan-out — доставка в группы и каналы (Раздел 11);
  • георепликация — несколько дата-центров по миру (Раздел 13);
  • шифрование — транспортное и сквозное (Разделы 14–20).

С чего начинать на доске

Практический вывод раздела: на интервью не вываливай всё сразу. Начни с минимального скелета — клиенты, постоянное соединение, Message-сервис, база — и наращивай подсистемы по мере того, как интервьюер задаёт вопросы. Сначала проведи одно сообщение от Алисы к Бобу, потом усложняй.

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

«Чем мессенджер архитектурно отличается от обычного веб-сервиса „запрос — ответ"?» Образец: «В обычном сервисе инициатива у клиента: он спрашивает — сервер отвечает — связь закрывается. В мессенджере сообщение надо доставить тому, кто прямо сейчас ничего не спрашивает, поэтому сервер должен сам толкать данные на устройство получателя. Для этого нужно постоянное соединение, открытое заранее (WebSocket), а не разовые запросы. Из этого требования и вырастает всё усложнение архитектуры.»

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

«Какие подсистемы навешиваются на базовый скелет и зачем выносить их отдельно?» Образец: «Поверх ядра доставки появляются хранение и шардирование, медиа с CDN, статусы присутствия, fan-out для групп и каналов, георепликация и шифрование. Выношу их отдельно, потому что у каждой свой характер нагрузки и свои компромиссы — например, присутствие можно делать приблизительным и эфемерным, а сообщения терять нельзя. Сваливать всё в одно ядро значит мешать вещи, которые масштабируются по-разному.»


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