https://github.com/zkryaev/social_network_system_design
System design project
https://github.com/zkryaev/social_network_system_design
Last synced: 6 months ago
JSON representation
System design project
- Host: GitHub
- URL: https://github.com/zkryaev/social_network_system_design
- Owner: zkryaev
- Created: 2025-09-18T16:16:15.000Z (10 months ago)
- Default Branch: main
- Last Pushed: 2025-11-10T15:49:12.000Z (8 months ago)
- Last Synced: 2025-11-10T17:29:24.755Z (8 months ago)
- Homepage:
- Size: 277 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 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с*
4. *Поиск постов: 2с*
3. *Операция оценки/комментирования/подписки: 1с*
## Верхнеуровневое представление системы
1. Нотация: [C4-Model](https://c4model.com/)
2. Инструмент визуализации [PlantText](https://www.planttext.com/) на основе [PlantUML Doc](https://github.com/plantuml-stdlib/C4-PlantUML)
### **Level 1.** System context diagram

### **Level 2.** Container diagram
#### 1. Post system

#### 2. User system

#### 3. Reactions system

#### 4. Media system

#### 5. 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