Дополнительно
Этапы проектирования системы
- Сбор требований
- REST API (взаимодействие систем)
ДЗ
Первая часть
Необходимо спроектировать мессенджер WhatsApp самостоятельно (даже если вы еще ничего не знаете или если ваш дизайн будет состоять из одного сервера и БД - это будет НОРМАЛЬНО)
Показывать этот дизайн никому не нужно, он будет лишь только у вас - после каждого занятия вы будете возвращаться к этому дизайну - смотреть на то, что было сделано неправильно и изменять, исходя из полученных знаний на уроках (а в конце курса, я покажу - как бы я спроектировал подобную систему).
Требования к системе:
- Сезонности у системы нет;
- Системой будут пользоваться по всему миру;
- Приложение будет показывать непрочитанные сообщения;
- Приложение будет поддерживать чаты и личные сообщения;
- Отправлять можно только текст и картинки в сообщениях;
- Максимальный размер изображения в сообщении = 1МБ;
- Максимальное кол-во изображений в сообщении = 3;
- Максимальный размер текста в сообщении = 2000 символов;
- Клиентами будут мобильные, десктопные и WEB приложения;
- 200 000 000 уникальных пользователей заходят в приложение каждый день;
- Каждый пользователь в среднем отправляет 10 сообщений в день;
- Каждый пользователь в среднем просматривает сообщения 20 раз в день;
- Система должна работать 24 на 7 (допустимо 4 часа и 23 минуты простоя в год);
- Приложение должно показывать статусы онлайн/оффлайн пользователей, а также когда пользователь был последний раз в сети;
- Сообщение до получателя должно успевать доходить за 3 секунды (если пользователя нет в сети - ему должно прийти Push уведомление на мобильный телефон);
- Приложение должно поддерживать кросс-девайсную синхронизацию (если у вас это приложение открыто на телефоне и ноутбуке, и например вы прочитали сообщение на телефоне, то сообщение должно отобразиться прочитанным и на ноутбуке);
Дополнительно:
- Фронтенд проектировать не нужно (концентрируемся только на бэкенде)
- Аутентификацию проектировать не нужно (представим, что эта часть системы уже кем-то реализована)
Для дизайна можно пользоваться инструментами Lucidchart или Miro - там достаточно богатый функционал и в будущем вам будет просто туда вносить изменения. В дизайне хотелось бы видеть:
- Расчет нагрузки и потребления памяти у основных операций.
- Модель данных (описать основные сущности в БД и как они взаимосвязаны);
- API (расписывать REST или GraphQL не нужно - просто словами опишите основные операции над вашей системой);
- Верхнеуровневое проектирование основных компонентов системы и их отношений с другими компонентами системы;
Желаем удачи в дизайне WhatsApp! (после курса будет очень любопытно понаблюдать за собственным прогрессом)
Вторая часть
Итоговый проект
Все домашние задания вас постепенно приближали к созданию итогового проекта по проектированию социальной сети ВКонтакте.
Хотелось бы, чтобы у вас в итоге получился весомый репозиторий, с полноценной архитектурой приложения, чтобы в будущем вы могли это продемонстрировать на собеседованиях или рассказать об этом своему работодателю.
Функциональные требования - их необходимо взять из первого домашнего задания по проектирования API (все те операции из API необходимо будет воплотить в будущей архитектуре).
Нефункциональные требования - у вас есть бизнес заказчик со следующей информацией о DAU и активностях пользователей. Остальные нефункциональные требования по доступности, согласованности, лимитах и всем остальном вам нужно определить самостоятельно, исходя из вашего опыта.
Верхнеуровневый дизайн - необходимо сделать верхнеуровневый дизайн с использованием C4 model (не спускаемся ниже второго уровня - только system и container diagram) и C4-PlantUML (можно пользоваться PlantUML Online Editor, чтобы не приходилось ставить ничего дополнительного на ваш компьютер)
В репозитории необходимо сделать презентабельную README.md с описанием системы и требований, верхнеуровневым дизайном, а также с основыми расчетами. Хотелось бы, чтобы у вас в итоге получилось что-то похожее на это (индивидуальность приветствуется).
Дополнительные материалы
КНИГИ:
- Высоконагруженные приложения. Программирование, масштабирование, поддержка
- Site Reliability Engineering. Надежность и безотказность как в Google
- System Design. Подготовка к сложному интервью
- Микросервисы. Паттерны разработки и рефакторинга
- Распределенные системы
ВИДЕО-КУРСЫ:
РЕКОМЕНДУЕМЫЕ СТАТЬИ:
- Graceful degradation
- Теория шардирования
- Consistent против Rendezvous
- Как работают реляционные базы данных
- У семи программистов адрес без дома
- Гид по заголовкам кэширования HTTP для начинающих
- Как сэкономить миллион долларов на базе данных на высоконагруженном проекте
- Архитектура in-memory СУБД
- Архитектура Mail.ru Cloud Storage
- Паттерн Outbox