Дизайн систем 23/24
Содержание
О курсе
Это страница курса "Дизайн систем" 2023-2024 года (1-2 модуль 4 курса ПМИ).
Занятия проходят по четвергам в 18:10 - 21:00 онлайн, объявления о любых изменениях будут в Telegram-канале.
Преподаватели: Стас Щетинников, Артем Кузнецов, Илья Жигалко, Егор Карпов
Полезные ссылки
Ведомость: https://docs.google.com/spreadsheets/d/1H-_6stGdmCN96wvdsjuY_qcv7LiUlzY_ZSDZ8AvR3AU
Канал курса: https://t.me/+ZikB0F8elb1kOTE6
Чат курса: https://t.me/+0azNletbfBQ1NDRi
Все записи: https://disk.yandex.ru/d/jMjWZTmQP_-GoQ
Лекции и семинары
- 07.09. Основы системного проектирования. [Презентация | Запись] Архитектура. Жизненный цикл архитектуры. Архитектурные драйверы и архитектурно значимые требования (ASR). Проектирование и оценка архитектуры. Waterfall.
- 14.09. Docker [Презентация | Запись] Архитектурные паттерны. CI/CD. VM vs Containers. Конфигурирование приложения. Паттерны деплоя. Service discovery. Health check. Docker.
- 21.09 Функциональная декомпозиция [Презентация | Запись] Модифицируемость и ее оценка. Louse coupling & high cohesion. Строительные блоки. DDD. Модель предметной области.
- 29.09 Взаимодействие сервисов [Презентация | Лекция Семинар] Синхронное и асинхронное API. Паттерны. Оркестрация и хореография. Версионирование. IDL и API first дизайн. Rich vs Data Centric API. REST. gRPC.
- 05.10 Событийная модель и кафка [Презентация | Запись] События. Паттерны проектирования событий. Event sourcing. Stream processing. RabbitMQ. Kafka.
- 12.10 Хранилища, модели хранения данных [Презентация | Запись]
- 19.10 Надежность и отказоустойчивость [Презентация | Запись] Терминология. Нагрузочное тестирование. Rate limiting и throttling. Retry, circuit breaker, load shedding. Надежность пишущей нагрузки. Надежность асинхронного взаимодействия.
- 02.11 Безопасность [Презентация | Запись]
- 09.11 Наблюдаемость и надежность [Запись] Kubernetes. Мониторинг. Алертинг. Service mesh.
- 16.11 Аналитика ETL. MapReduce. Data Warehouse (DWH).
- 23.11 Фронтенд. Мобильные архитектуры [Запись] Архитектура UI. Мобильная платформа. Кросс платформенные приложения. MVC, MVVM, MVI. Тестирование. Дистрибуция. Server Side Rendering. Микрофронтенды.
- 30.11 Масштабирование, Балансировка, API Gateway [Запись]
Домашние задания
1. Docker
Форма для сдачи: https://docs.google.com/forms/d/1c52c2IKsGEqNQb6NdBh07biV_rd3mHS2jcIHBdtbhgE
Дедлайн: 25 октября 23:59
Шаг 1. Создать веб сервис, который доступен в сети на порту 8000 и имеет один http-метод:
GET /health/
RESPONSE: {"status": "OK"}
Можно использовать любой язык программирования и любые фреймворки. Проще всего будет начать с Python и FastAPI, пример его использования был на семинаре по Docker.
Шаг 2. Cобрать локально образ приложения в докер контейнер под архитектуру AMD64.
Шаг 3. (8 баллов) Сохранить код сервиса и Dockerfile в приватный репозиторий на github и добавить в коллабораторы karpp.
Шаг 4. (2 балла) Запушить образ в dockerhub. (Документация)
Примечания
Обратите внимание, что при сборке на M1 при запуске вашего контейнера на стандартных платформах будет ошибка такого вида: standard_init_linux.go:228: exec user process caused: exec format error
. Чтобы избежать этого для сборки нужно указать тип платформы linux/amd64: docker build --platform linux/amd64 -t tag
. Более подробно можно прочитать в статье: https://programmerah.com/how-to-solve-docker-run-error-standard_init_linux-go219-exec-user-process-caused-exec-format-error-39221/.
2. CRUD
Форма для сдачи: https://docs.google.com/forms/d/1YGDpg-odldRJiqW6ZqBb5znJsAfHt2l-3TlQsINajaA
Дедлайн: 8 ноября 23:59
Задание: Сделать RESTful CRUD по созданию, удалению, просмотру и обновлению пользователей. Данные должны сохраняться в базе данных, которую вы можете выбрать на ваше усмотрение и запускать в docker-compose локально. Сервис должен предоставлять API аналогичное данному (такие же методы и такая же структура пользователя).
На данный момент не требуется делать какую-либо аутентификацию, это будет в следующем дз.
В форму нужно сдать ссылку на репозиторий, содержащий код, Dockerfile и docker-compose.yml для запуска сервиса и базы данных.
3. Взаимодействие сервисов
Форма для сдачи: https://docs.google.com/forms/d/1h6qrFM5RuME33CLgh04-XPCGReUcbSqOZkJu5A8uOWU
Дедлайн: 3 декабря 23:59
Задание: Разработать API для интернет-магазина. За основу взять нужно взять ДЗ-2, доработать сервис авторизации и сделать новые сервисы заказа и биллинга.
- Сервис авторизации должен проверять логин и пароль пользователя и выдавать ему токен для обращения к другим сервисам. Во всех дальнейших запросах токен должен передаваться в хедере 'Authorization: Bearer <token>'. Сервис должен удовлетворять базовым требованиям безопасности.
- В сервисе биллинга должна быть возможность положить деньги на аккаунт пользователя, проверить баланс и снять деньги.
- Сервис заказа должен позволять создать заказ, посмотреть предыдущие заказы. При заказе нужно снимать с пользователя деньги, при недостаточном балансе возвращать ошибку и сохранять неуспешный заказ.
Несмотря на то, что все это называется сервисами, вы можете сами выбирать, использовать микросервисную или монолитную архитектуру, одну БД или несколько и тд.
Оценивание
Оценивание состоит из двух частей
- Теоретическая часть (5 баллов) – спроектировать взаимодействие сервисов, отобразить схему картинкой и описанием API.
- Практическая часть (5 баллов) – реализовать спроектированный сервис.
Также нужно приложить bash/python скрипт, тестирующий ваш сервис по следующему сценарию:
- Создать пользователя
- Положить деньги на счет пользователя
- Сделать заказ, на который хватает денег
- Убедиться, что деньги сняли
- Сделать заказ, на который не хватает денег
- Проверить, что заказ сохранился как неуспешный
- Проверить, что баланс не изменился
Примечания
Как и прошлое домашнее задание, это нужно сдать в виде github репозитория, картинки и описания нужно добавить туда же. Это может быть тот же репозиторий с отдельной веткой под ДЗ-3. Все приложение должно запускаться через docker-compose.
4. Распределенные транзакции
Дедлайн: 12 декабря 23:59
Задание: Для интернет-магазина из ДЗ-3 доработать сервисы "Склад", "Доставка". При создании заказа необходимо:
- в сервисе "Склад" зарезервировать конкретный товар на складе
- в сервисе "Доставка" зарезервировать курьера на конкретный слот времени.
- если хотя бы один из пунктов не получилось сделать, необходимо откатить все остальные изменения.
В задании необходимо реализовать механизм распределенных транзакций. Рекомендуется использовать алгоритм двухфазного коммита или паттерн "Сага" (rus, eng)
Оценивание
Оценивание состоит из двух частей
- Теоретическая часть (5 баллов) – отобразить sequence-диаграмой схему взаимодействия сервисов при создании заказа, коротко описать текстом, какой паттерн использовался и почему на ваш взгляд он больше всего подходит
- Практическая часть (5 баллов) – реализовать спроектированный сервис.
ДЗ сдается полностью аналогично предыдущим. Для тестирования нужно добавить такой же скрипт, как и в ДЗ-3, с проверкой статусов в новых сервисах.
5. Архитектурные ката
Дедлайн: 19 декабря 23:59
Задание: Возьмите любой кейс из архитектурных ката и спроектируйте его решение.
В решении необходимо предоставить:
- Пользовательские сценарии
- Общую схему взаимодействия сервисов.
- Для каждого сервиса опишите назначение сервиса и его зону ответственности.
- Опишите контракты взаимодействия сервисов друг с другом.
- Диаграмму контейнеров приложения на основе выбранной модели функциональной декомпозиции
- Декомпозицию слоя данных: какие данные в каких БД хранятся
Решение можно опубликовать в dropbox/яндекс диске/google диске/github/etc.
Итоговая оценка за курс
Итог = min(Округл(0.2 * ДЗ1 + 0.3 * ДЗ2 + 0.5 * ДЗ3 + 0.6 * ДЗ4 + 0.3 * ДЗ5 + 0.3 * Э), 10)
ДЗ –– оценки за домашние задания
Э –– устный экзамен
Округление арифметическое.