Дизайн систем 23/24

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск

О курсе

Это страница курса "Дизайн систем" 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 скрипт, тестирующий ваш сервис по следующему сценарию:

  1. Создать пользователя
  2. Положить деньги на счет пользователя
  3. Сделать заказ, на который хватает денег
  4. Убедиться, что деньги сняли
  5. Сделать заказ, на который не хватает денег
  6. Проверить, что заказ сохранился как неуспешный
  7. Проверить, что баланс не изменился

Примечания

Как и прошлое домашнее задание, это нужно сдать в виде 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)

ДЗ –– оценки за домашние задания

Э –– устный экзамен

Округление арифметическое.