Проектирование и разработка распределенных программных систем
Лекции и материалы по курсу распределенных систем в ЧелГУ, группа ПрИ-401.
Лекции
Лекция 1. Введение в распределенные системы
Зачем нужны распределенные системы, какие проблемы они решают и какие проблемы в них появляются.
Ссылки
- Мартин Клеппман. Высоконагруженные приложения. Программирование, масштабирование, поддержка
- Лекции Мартина Клеппмана по распределенным системам в Кембридже
- Distributed systems for fun and profit
- Страх и ненависть в распределённых системах
Лекция 2. Асинхронное программирование
Ссылки
- Highload++ для начинающих
- Анатомия веб-сервиса
- Метафоры асинхронности в документации FastAPI
- Асинхронщина в JS
Лекция 3. Модели данных
Реляционные, документоориентированные, графовые, key-value и колоночные БД.
Ссылки
- NoSQL – коротко о главном
- Мартин Клеппман. Высоконагруженные приложения. Программирование, масштабирование, поддержка. Глава 2
- CQRS documents
Лекция 4. Коммуникация приложений
Ссылки
- Хоп Грегор, Вульф Бобби. Шаблоны интеграции корпоративных приложений
- Сэм Ньюмен. Создание микросервисов, глава 4
Лекция 5. Очереди сообщений
Ссылки
- Принципы и приёмы обработки очередей
- 101 способ приготовления RabbitMQ и немного о pipeline архитектуре
- Очереди и блокировки. Теория и практика
Лекция 6. Горизонтальное масштабирование
Ссылки
- Общая логика масштабирования
- Масштабирование бэкенда
- Горизонтальное масштабирование. Что, зачем, когда и как
- Как мы сделали ровную балансировку нагрузки на фронтенд-кластере
Лекция 7. Кэширование
Ссылки
- Web, кэширование и memcached
- Кэширование данных в web приложениях. Использование memcached
- Использование memcached и Redis в высоконагруженных проектах
Лекция 8. Масштабирование БД
Ссылки
- Мартин Клеппман. Высоконагруженные приложения. Программирование, масштабирование, поддержка. Главы 5, 6
- Шардинг: паттерны и антипаттерны
Практика
Практика 1. Контейнеризация и Docker
Задание
- Написать веб-сервер, который принимает HTTP-запрос и отдает ответ «Hello world»
- Установить Docker
- Написать Dockerfile и запустить веб-сервер в докер-контейнере так, чтобы к нему можно было обратиться с хост-машины
Ссылки
- Установка Docker
- Документация по Docker
- Документация по Dockerfile
- Порядок команд в Dockerfile
- Multi-stage builds для компилируемых языков
Практика 2. Взаимодействие контейнеров
Задание
- Дописать приложение, чтобы оно содержало два эндпоинта
- POST /links — сохраняет ссылку в БД и возвращает ее id
- GET /links/ — отдает ссылку из БД по id
- Добавить контейнер с PostgreSQL и настроить его взаимодействие с приложением
- Настроить запуск обоих контейнеров через Docker Compose
Ссылки
- 12-факторное приложение
- Postgres по Docker Hub
- Сеть в Docker
- Volumes в Docker
- Docker Compose
- Документация по docker-compose.yml
Практика 3. Работа с RabbitMQ
Задание
- Добавить контейнер с RabbitMQ
- В приложении добавить в модель ссылки поле «статус», добавить эндпоинт PUT /links/ для обновления статуса ссылки. При добавлении ссылки отправлять ее в очередь сообщений
- Добавить консьюмер, который слушает очередь сообщений и получает все новые ссылки, делает запрос к ним и сохраняет HTTP-статус ответа через новый эндпоинт приложения.
Ссылки
Практика 4. Балансировка нагрузки через nginx
Задание
- Поднять два отдельных контейнера с API. Каждый из них должен добавлять в ответ собственную метку, чтобы было понятно, какой из контейнеров ответил (например, через HTTP-хедер)
- Поднять контейнер с nginx, который проксирует запросы на API-контейнеры и балансирует нагрузку между ними
Ссылки
Практика 5. Кэширование в Redis
Задание
- Добавить контейнер с Redis
- Добавить в коде консьюмера использование Redis в качестве кэша для ответов от внешних сервисов
Ссылки
Итоговая оценка
Баллы за практические задачи
Дата сдачи | Docker | БД | RabbitMQ | nginx | Redis |
---|---|---|---|---|---|
8 сентября | - | - | - | - | - |
15 сентября | 20 | - | - | - | - |
22 сентября | 20 | 20 | - | - | - |
29 сентября | 20 | 20 | 20 | - | - |
6 октября | 20 | 20 | 20 | 20 | - |
13 октября | 20 | 20 | 20 | 20 | 20 |
20 октября | 20 | 20 | 20 | 20 | 20 |
27 октября | 15 | 20 | 20 | 20 | 20 |
3 ноября | 15 | 15 | 20 | 20 | 20 |
10 ноября | 10 | 15 | 15 | 20 | 20 |
17 ноября | 10 | 10 | 15 | 15 | 20 |
24 ноября | 5 | 10 | 15 | 15 | 15 |
1 декабря | 5 | 10 | 15 | 15 | 15 |
8 декабря | 5 | 10 | 10 | 15 | 15 |
15 декабря | 5 | 5 | 10 | 15 | 15 |
22 декабря | 5 | 5 | 5 | 10 | 15 |
29 декабря | 5 | 5 | 5 | 10 | 15 |
Все практики сданы: +100
Перевод баллов в оценку
От | До | Оценка |
---|---|---|
140 | 160 | 3 |
165 | 180 | 4 |
185 | 200 | 5 |