Skip to content
This repository was archived by the owner on Nov 14, 2025. It is now read-only.

zkryaev/social_network_system_design

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

34 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Cоциальная сеть для путешественников [DONE ✔️]

Функциональные требования

  1. Создание поста, с 1 фотографией, описанием и тэгом местоположения;
  2. Оценка и комментирование поста;
  3. Подписка на других путешественников, для отслеживание их активности;
  4. Поиск популярных мест для путешествий, выдача постов связанных с этим местом (тэгом местоположения);
  5. Просмотр ленты других путешественников, ленты конкретного пользователя, основанной на подписках в обратном хронологическом порядке;

Нефункциональные требования

  • Аудитория:
    1. DAU: 10.000.000
    2. Активность пользователя в среднем:
      • Публикует 0,45 постов в день
      • Просматривает суммарно 20-30 постов в день из ленты (1 лайк - 1 комментарий):
        1. Оценивает 5-15 постов (50%)
        2. Комментирует 3-4,5 постов (15%)
        3. Читает 10 комментариев
      • Подписывается на 0,2 новых путешественника в день
      • Смотрит страницу путешественника 5 раз в день
      • Выполняет поиск мест для путешествий 3-5 раз в день
    3. Регион: СНГ
  • Особенности приложения:
    1. Сезонности в приложении: Есть всплески в сезоны отпусков. Множитель: 2
    2. Доступность: 99.95
    3. Условия хранения данных: Храним всегда
    4. Лимиты и ограничения:
      1. Загружать не более 10 постов в день
      2. Смотреть, оценивать и комментировать не более 1000 постов в день
      3. Оставлять не более 1000 комментариев
      4. Размер изображения: <= 2 Мб
      5. Текст поста: <= 1000 символов
      6. Текст комментария: <= 500 символов
      7. Пост содержит: <= 5 изображений
      8. Максимальное длина запроса не более 100 символов
      9. Максимальное количество подписчиков: <= 100_000
      10. Максимальное количество подписок: <= 10_000
    5. Временные ограничения:
      1. Создание поста: 3с
      2. Получение в ленте 10 постов: 2с
      3. Поиск постов: 2с
      4. Операция оценки/комментирования/подписки: 1с

Верхнеуровневое представление системы

  1. Нотация: C4-Model
  2. Инструмент визуализации PlantText на основе PlantUML Doc

Level 1. System context diagram

system context

Level 2. Container diagram

1. Post system

post system

2. User system

user system

3. Reactions system

reactions system

4. Media system

media system

5. Geo system

geo system

Оценка нагрузки

Расчет RPS

DAY = 86400

Посты

  • RPS(write) = DAU * 0.45 * / DAY = 52
  • RPS(read) = DAU * 30 / DAY = 3472

Комментарии

  • RPS(write) = DAU * 4.5 / DAY = 520

  • RPS(read) = DAU * 10 / DAY = 1157

Лайки

Читает лайков столько же сколько посмотрел постов

  • RPS(write) = DAU * 15 / DAY = 1736

Подписка

  • RPS(write) = DAU * 0.2 / DAY = 23
  • RPS(read) = DAU * 5 / DAY = 579 // пусть в среднем столько же, сколько просмотров профилей

Просмотр страниц путешественников

  • RPS = DAU * 5 / DAY = 579

Поиск

  • RPS = DAU * 5 / DAY = 579

Расчет трафика

Write

Поскольку в СНГ превалирующее число языков занимает 2 байта в utf-8, поэтому считаю так: число символов * 2 байта

CreatePost [~2Kb] {
    id (8)
    user_id (8) 
    text ~ 2Kb (1000 * 2B)
    geo_tag_id (8) // например [Россия, Байкал] = 20141251
    created_at (8)
}

UploadImage [~3Mb] {
  post_id
  user_id
  image ~ 3 Mb
}

Like [40B] {
    id
    user_id
    post_author_id
    post_id
    created_at
}

Comment [~1Kb] {
    id
    user_id
    author_id
    post_id 
    title  ~ 1Kb (500 * 2B)
    created_at
}

Subcribe [32B] {
    id
    user_id
    target_id
    created_at
}

Результаты трафика Запись:

Posts = 52 * 2Kb = 104 Kb/s

Image = 52 * (5 изображений на пост) * 3Mb = 780 Mb/s

Comments = 520 * 1Kb = 520 Kb/s

Likes = 1736 * 40B = 70 Kb/s

Subscribes = 23 * 32B = 736 B/s

Read

// Посты получаем пачками до 10 штук
FetchPosts [2Kb*10 = 20Kb] {
    id
    user_id
    posts: [
        post [~2Kb]: {
            post_id
            author_id
            likes_amount
            geo_tag_id
            created_at
            text ~ 2Kb
            image_url ~ 30B // -> GetImage, если пользователь тыкнет по изображению отдаем уже фулл качество
            image_preview_url ~ 30B // кропнутая версия изображения
        }
        еще 9...
    ]
    cursor
    total
}

GetLikes [24B] {
    id
    post_id
    total
}

GetComments [10Kb] {
    id
    post_id
    comments: [
        "example", ~ 1Kb
        ...
    ]
    cursor
    total
}

GetProfile [~20,7Kb] {
  id
  user_id
  profile_id
  name ~ 50B
  last_name ~ 50B
  profile_img_url ~ 30B
  description ~ 500B
  posts: FetchPosts [20Kb]
}

GetSubcribes [104B] {
    user_id 
    targets [10]target_id ~ 10*8 = 80B
    page
    total
}

// Есть список тегов, пользователь вводит условно Байкал и ему выпадает этот тег,
// он его выбирает и получает посты связанные с этим тегом

Search [240B] {
  id
  user_id
  title ~ 200B
  geo_tag_id
  cursor
  total
}

GetImage [~3Mb] {
    image ~ 3Mb
}

Результаты трафика Чтение:

Posts = 3472 * 20Kb ~ 69 Mb/s

Images = 3472 * (5 изображений на пост) * 3Mb ~ 52 Gb/s

Comments = 1157 * 10Kb ~ 12Mb/s

Likes = 1157 * 24B ~ 28Kb/s

Profile = 579 * 4.5Mb ~ 12 Mb/s

Subscribes = 579 * 104B ~ 60Kb/s

Search = 579 * 240B = 139 Kb/s

Расчет одновременных соединений

  • Connections = 10 000 000 * 0.1 = 1 000 000

Releases

No releases published

Packages

 
 
 

Contributors