An open API service indexing awesome lists of open source software.

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

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
![system context](https://github.com/zkryaev/social_network_system_design/blob/main/architecture/diagrams/system_context.svg)

### **Level 2.** Container diagram
#### 1. Post system
![post system](https://github.com/zkryaev/social_network_system_design/blob/main/architecture/diagrams/containers/posts_container.svg)

#### 2. User system
![user system](https://github.com/zkryaev/social_network_system_design/blob/main/architecture/diagrams/containers/users_container.svg)

#### 3. Reactions system
![reactions system](https://github.com/zkryaev/social_network_system_design/blob/main/architecture/diagrams/containers/reactions_container.svg)

#### 4. Media system
![media system](https://github.com/zkryaev/social_network_system_design/blob/main/architecture/diagrams/containers/media_container.svg)

#### 5. Geo system
![geo system](https://github.com/zkryaev/social_network_system_design/blob/main/architecture/diagrams/containers/geo_container.svg)

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

### Расчет 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