- Создание поста, с 1 фотографией, описанием и тэгом местоположения;
- Оценка и комментирование поста;
- Подписка на других путешественников, для отслеживание их активности;
- Поиск популярных мест для путешествий, выдача постов связанных с этим местом (тэгом местоположения);
- Просмотр ленты других путешественников, ленты конкретного пользователя, основанной на подписках в обратном хронологическом порядке;
- Аудитория:
- DAU: 10.000.000
- Активность пользователя в среднем:
- Публикует 0,45 постов в день
- Просматривает суммарно 20-30 постов в день из ленты (1 лайк - 1 комментарий):
- Оценивает 5-15 постов (50%)
- Комментирует 3-4,5 постов (15%)
- Читает 10 комментариев
- Подписывается на 0,2 новых путешественника в день
- Смотрит страницу путешественника 5 раз в день
- Выполняет поиск мест для путешествий 3-5 раз в день
- Регион: СНГ
- Особенности приложения:
- Сезонности в приложении: Есть всплески в сезоны отпусков. Множитель: 2
- Доступность: 99.95
- Условия хранения данных: Храним всегда
- Лимиты и ограничения:
- Загружать не более 10 постов в день
- Смотреть, оценивать и комментировать не более 1000 постов в день
- Оставлять не более 1000 комментариев
- Размер изображения: <= 2 Мб
- Текст поста: <= 1000 символов
- Текст комментария: <= 500 символов
- Пост содержит: <= 5 изображений
- Максимальное длина запроса не более 100 символов
- Максимальное количество подписчиков: <= 100_000
- Максимальное количество подписок: <= 10_000
- Временные ограничения:
- Создание поста: 3с
- Получение в ленте 10 постов: 2с
- Поиск постов: 2с
- Операция оценки/комментирования/подписки: 1с
- Нотация: C4-Model
- Инструмент визуализации PlantText на основе PlantUML Doc
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
Поскольку в СНГ превалирующее число языков занимает 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
// Посты получаем пачками до 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