Собеседование по проектированию систем: спроектируйте WhatsApp

«Спроектируйте WhatsApp» проверяет доставку в реальном времени в огромных масштабах, долговременное хранение сообщений, присутствие (онлайн/был в сети), а также проблему управления соединениями — удержание сотен миллионов устройств на связи. Как всегда, интервьюер хочет увидеть ваше рассуждение и компромиссы, а не копию настоящей системы.

Двигайтесь методично: уточните требования, оцените масштаб, спроектируйте путь соединения и доставки, решите, как хранить сообщения, а затем разберите групповые чаты и сложные случаи, такие как доставка в офлайне и упорядочивание. Разбор ниже следует этому пути.

1. Уточнение требований

Сначала зафиксируйте объём задачи. Основа — это обмен сообщениями один на один с надёжной доставкой; уточните, входят ли в объём этого собеседования групповые чаты, медиа и сквозное шифрование.

  • Функциональные: отправка/получение сообщений, подтверждения доставки и прочтения, присутствие онлайн, групповые чаты, доставка в офлайне, когда получатель отключён.
  • Нефункциональные: низкая задержка, высокая доступность, долговечность (без потери сообщений), упорядоченность внутри переписки.
  • Нужно уточнить: сквозное шифрование и обработку медиа — упомяните их и явно решите, входят ли они в объём задачи.

2. Оценка масштаба

Зафиксируйте цифры, которые направляют проектирование. Предположим ~2 млрд пользователей и десятки миллиардов сообщений в день; это сотни тысяч сообщений в секунду в пике и сотни миллионов одновременно подключённых устройств — управление соединениями становится проблемой первого порядка.

3. Путь соединения и доставки

Обмену сообщениями нужно постоянное соединение, а не опрос по схеме запрос/ответ. Устройства держат открытый WebSocket к серверу-шлюзу. Центральный компонент должен знать, какой шлюз в данный момент удерживает соединение каждого пользователя, чтобы сообщение можно было направить на правильный сервер.

  • Шлюз WebSocket: поддерживает активные соединения устройств, обрабатывает отправку/получение.
  • Реестр сессий/присутствия: сопоставляет пользователя с текущим сервером-шлюзом (например, в Redis), обновляется при подключении/отключении.
  • Маршрутизация сообщений: шлюз отправителя находит шлюз получателя и пересылает сообщение; если получатель офлайн, сообщение помещается в очередь.

4. Хранение сообщений и доставка в офлайне

Сообщения должны сохраняться даже при отключённом получателе. Храните каждое сообщение надёжно и отслеживайте статус доставки для каждого получателя; доставляйте немедленно, если получатель онлайн, в противном случае сохраняйте и пересылайте при повторном подключении (store-and-forward).

Паттерн доступа с преобладанием записи, с ключом по переписке, больше подходит для хранилища с широкими столбцами, такого как Cassandra (высокая пропускная способность записи, горизонтальное масштабирование), чем для единой реляционной БД. Как только доставка сообщения подтверждена для всех получателей, его можно удалить или дать ему устареть, поскольку WhatsApp не хранит доставленные сообщения на сервере бесконечно.

5. Групповые чаты

Групповые сообщения — это разветвление (fan-out): одна отправка превращается в N доставок. Для типичных размеров групп разветвление при записи (fan-out-on-write, то есть отправка в путь доставки каждого участника) простое и быстрое для чтения. Отметьте компромисс — очень большие группы делают разветвление при записи дорогим, поэтому огромные широковещательные группы представляют собой отдельную задачу проектирования.

6. Компромиссы, которые нужно озвучить

Завершите, назвав напряжённые моменты: упорядочивание (номера последовательности по переписке против глобального порядка), консистентность против доступности для подтверждений (итоговая консистентность подходит для «был в сети», более строгая — для доставки), и разветвление при записи против разветвления при чтении для групп. Явное озвучивание этого делает ответ уровня senior.

Потренируйтесь в проектировании системы WhatsApp с помощью в реальном времени

Ассистент для собеседований по проектированию систем от Natively может помочь вам сохранять структуру во время живого собеседования — предлагая следующее измерение для рассмотрения и показывая компромиссы в реальном времени, всё на вашем собственном устройстве.

Установите на свой компьютер.

Ассистент для живых разговоров. Работает локально, ничего не отправляет наружу.

macOS 12+ · Windows 10/11

© 2026 Natively AI Private Limited

Исходный код доступен по Natively Personal Use Source License v1.0 · Геолокация по IP: DB-IP