/sysdes

Primary LanguageMermaid

Архитектура мессенджера WhatsApp

Формализованные требования к системе

  1. Глобальное использование без сезонности
  2. Поддержка чатов и личных сообщений
  3. Отправка текста (до 2000 символов) и изображений (до 3шт, макс 500кб каждое)
  4. Поддержка мобильных, декстопных и веб-версий
  5. 200млн уникальных пользователей ежедневно
  6. В среднем 10 отправленных сообщений на пользователя в день
  7. В среднем 20 просмотров сообщений на пользователя в день
  8. Доступность 24/7 с допустимым простоем в несколько часов в год
  9. Отображение статусов онлайн/офлайн и времени последнего посещения
  10. Доставка сообщений за 3 секунды, Push-уведомления для оффлайн пользователей
  11. Кросс-девайсная синхронизация
  12. Отображение непрочитанных сообщений

Расчет нагрузки

  1. Ежедневные активные пользователи (DAU) = 200млн
  2. Отправленные сообщения в день = 200млн * 10 = 2млрд
  3. Просмотры сообщений в день = 200млн * 20 = 4млрд
  4. Пиковая нагрузка (предположительно в 2 раза выше средней)
    • Отправка сообщений = 2млрд * 2 = 4млрд/день, в секунду = 4млрд/86400сек = 46500 в сек
    • Просмотры сообщений = 4млрд * 2 = 8млрд/день, в секунду = 8млрд/86400сек = 925000 в сек

Модель данных

User {
    id
    phone_number
    name
    status
    last_seen
}

Message {
    id
    sender_id
    chat_id
    content
    type (text, image)
    timestamp
    read_by (array of user_ids)
}

Chat {
    id
    type (personal, group)
    participants (array of user_ids)
    last_message_id
}

UserDevice {
    id
    user_id
    device_type (mobile, desktop, web)
    push_token
}

Оценка хранилища

  1. Текстовые сообщения:

    • 2000 символов * 2байта/символ = 4кб/сообщение
    • 2млрд сообщений * 4кб/сообщение = 8ТБ/день
  2. Изображения:

    • 3шт * 500кб/шт = 1.5мб/сообщение
    • 2млрд сообщений (10% от общего количества) * 1.5мб/сообщение = 300ТБ/день
  3. Метаданные сообщений и пользователей:

    • 200млн пользователей * 100 байт/пользователь = 20ГБ/день
    • 2млрд сообщений * 10 байт/сообщение = 20ГБ/день
  4. Итого: (8ТБ/день текстовые) + (300ТБ/день изображения) + (40ГБ/день метаданные) = 348ТБ/день. Годовое потребление: 348ТБ/день * 365дней = 127ПБ/год

Учитывая необходимость в репликации и резервном копировании, рекомендуется увеличить объем хранилища в 2-3 раза.

Верхнеуровневая архитектура

  1. Load balancer (Nginx): распределение входящих трафика
  2. API servers: обработка запросов от клиентов
  3. Websocket server: поддержка real-time обмена сообщениями
  4. Message queue: асинхронная обработка сообщений
  5. Message processing: обработка и сохранение сообщений
  6. User service: управление данными пользователей и их статусами
  7. Chat service: управление чатами и их участниками
  8. Notification service: отправка push-уведомлений
  9. Database cluster:
    • Master Db: для записи
    • Read replicas: для чтения
    • Cache (Redis): кэширование часто запрашиваемых данных
  10. Blob storage: хранение больших объемов данных (изображения)
  11. CDN (Content delivery network): быстрая доставка изображений
  12. Analytics service: сбор и анализ данных для аналитики и мониторинга