Skip to content

Distributed systems class at Chelyabinsk State University, 2020–2021

Notifications You must be signed in to change notification settings

igor-shevchenko/csu-distsys-2020

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

31 Commits
 
 
 
 

Repository files navigation

Проектирование и разработка распределенных программных систем

Лекции и материалы по курсу распределенных систем в ЧелГУ, группа ПрИ-401.

Первый семестр

Лекции

Лекция 1. Введение в распределенные системы

Презентация

Ссылки

  1. Мартин Клеппман. Высоконагруженные приложения. Программирование, масштабирование, поддержка
  2. Distributed systems for fun and profit
  3. Страх и ненависть в распределённых системах

Лекция 2. Асинхронное программирование

Презентация

Ссылки

  1. Highload++ для начинающих
  2. Анатомия веб-сервиса

Лекция 3. Модели данных

Презентация

Ссылки

  1. NoSQL – коротко о главном
  2. Мартин Клеппман. Высоконагруженные приложения. Программирование, масштабирование, поддержка. Глава 2

Лекция 4. Коммуникация приложений

Презентация

Ссылки

  1. Хоп Грегор, Вульф Бобби. Шаблоны интеграции корпоративных приложений
  2. Сэм Ньюмен. Создание микросервисов, глава 4

Лекция 5. Очереди сообщений

Презентация

Ссылки

  1. Принципы и приёмы обработки очередей
  2. 101 способ приготовления RabbitMQ и немного о pipeline архитектуре
  3. Очереди и блокировки. Теория и практика

Лекция 6. Горизонтальное масштабирование

Презентация

Ссылки

  1. Общая логика масштабирования
  2. Масштабирование бэкенда
  3. Горизонтальное масштабирование. Что, зачем, когда и как
  4. Как мы сделали ровную балансировку нагрузки на фронтенд-кластере

Лекция 7. Кэширование

Презентация

Ссылки

  1. Web, кэширование и memcached
  2. Кэширование данных в web приложениях. Использование memcached
  3. Использование memcached и Redis в высоконагруженных проектах

Лекция 8. Масштабирование БД

Презентация

Ссылки

  1. Мартин Клеппман. Высоконагруженные приложения. Программирование, масштабирование, поддержка. Главы 5, 6
  2. Шардинг: паттерны и антипаттерны

Практика

Практика 1. Контейнеризация и Docker

Презентация

Задание

  1. Написать веб-сервер, который принимает HTTP-запрос и отдает ответ «Hello world»
  2. Установить Docker
  3. Написать Dockerfile и запустить веб-сервер в докер-контейнере так, чтобы к нему можно было обратиться с хост-машины

Ссылки

  1. Установка Docker
  2. Документация по Docker
  3. Документация по Dockerfile

Практика 2. Взаимодействие контейнеров

Презентация

Задание

  1. Дописать приложение, чтобы оно содержало два эндпоинта
  • POST /links — сохраняет ссылку в БД и возвращает ее id
  • GET /links/ — отдает ссылку из БД по id
  1. Добавить контейнер с PostgreSQL и настроить его взаимодействие с приложением
  2. Настроить запуск обоих контейнеров через Docker Compose

Ссылки

  1. Postgres по Docker Hub
  2. Сеть в Docker
  3. Volumes в Docker
  4. Docker Compose
  5. Документация по docker-compose.yml

Практика 3. Работа с RabbitMQ

Презентация

Задание

  1. Добавить контейнер с RabbitMQ
  2. В приложении добавить в модель ссылки поле «статус», добавить эндпоинт PUT /links/ для обновления статуса ссылки. При добавлении ссылки отправлять ее в очередь сообщений
  3. Добавить консьюмер, который слушает очередь сообщений и получает все новые ссылки, делает запрос к ним и сохраняет HTTP-статус ответа через новый эндпоинт приложения.

Ссылки

  1. RabbitMQ на Docker Hub
  2. Тьюториал по RabbitMQ
  3. Healthchecks в docker-compose

Практика 4. Балансировка нагрузки через nginx

Презентация

Задание

  1. Поднять два отдельных контейнера с API. Каждый из них должен добавлять в ответ собственную метку, чтобы было понятно, какой из контейнеров ответил (например, через HTTP-хедер)
  2. Поднять контейнер с nginx, который проксирует запросы на API-контейнеры и балансирует нагрузку между ними

Ссылки

  1. nginx на Docker Hub
  2. Документация по nginx
  3. Балансировка нагрузки в nginx

Практика 5. Кэширование в Redis

Презентация

Задание

  1. Добавить контейнер с Redis
  2. Добавить в коде консьюмера использование Redis в качестве кэша для ответов от внешних сервисов

Ссылки

  1. Redis на Docker Hub
  2. Документация по Redis (введение)

Вопросы к экзамену

  1. Распределенные системы: какие проблемы они решают и какие новые проблемы возникают в них
  2. Асинхронное программирование
  3. Модели данных: реляционная модель
  4. Модели данных: документная модель
  5. Модели данных: графовая модель
  6. Модели данных: колоночные БД
  7. Взаимодействие компонентов распределенной системы с помощью общей БД
  8. Взаимодействие компонентов распределенной системы с помощью удаленного вызова
  9. Взаимодействие компонентов распределенной системы с помощью обмена сообщениями
  10. Очереди сообщений: протокол AMQP
  11. Горизонтальное и вертикальное масштабирование
  12. Принципы разработки горизонтально масштабируемых бэкендов
  13. Балансировщики нагрузки
  14. Кэширование данных
  15. Индексы в БД
  16. Денормализация данных в БД
  17. Репликация данных в БД: для чего она нужна и как реализуется
  18. Репликация данных в БД: проблемы репликации и как они решаются
  19. Шардинг данных в БД

Второй семестр

Лекции

Лекция 9. Микросервисы

Презентация

Ссылки

  1. Сэм Ньюмен. Создание микросервисов
  2. Александр Бындю. От микросервисного монолита к оркестратору
  3. Паттерны с microservices.io: монолитная архитектура, микросервисная архитектура, API gateway, Client-side service discovery, Server-side service discovery

Лекция 10. DDD

Презентация

Код примера

Литература

  1. Эрик Эванс. Предметно-ориентированное проектирование (DDD). Структуризация сложных программных систем
  2. Domain Driven Design Quickly — краткое содержание книги Эрика Эванса
  3. Harry Percival, Bob Gregory. Architecture Patterns with Python
  4. Лекция по DDD на ulearn.me

Лекция 11. Паттерны работы с БД

Презентация

Литература

  1. Джимми Богард про агрегаты
  2. Мартин Фаулер про CQS
  3. Грег Янг. CQRS Documents
  4. Уди Дахан. Clarified CQRS
  5. Александр Бындю. CQRS на практике

Лекция 12. Аутентификация и авторизация

Презентация

Литература

  1. Сэм Ньюмен. Создание микросервисов
  2. JSON Web Tokens

Лекция 13. Паттерны стабильности

Презентация

Литература

  1. Майкл Нейгард. Release it! Проектирование и дизайн ПО для тех, кому не всё равно
  2. SRE Book
  3. Graceful degradation. Доклад Яндекс.Такси

Лекция 14. Мониторинг

Презентация

Литература

  1. Сэм Ньюмен. Создание микросервисов
  2. SRE Book

Практика

Разработка интернет-магазина на микросервисах.

Практика 6. Админка для микросервисного интернет-магазина

Презентация

Практика 7. Каталог

Презентация

Практика 8. Аутентификация и авторизация

Презентация

Практика 9. Корзина

Презентация

Практика 10. Заказы

Презентация

Вопросы к экзамену

  1. Микросервисы и монолиты: для чего нужна микросервисная архитектура
  2. Микросервисы: как разбивать систему на микросервисы и как организовать их взаимодействие
  3. Моделирование преметной области по DDD
  4. Слоистая архитектура в DDD
  5. CQS и CQRS
  6. Event sourcing
  7. Аутентификация с помощью JWT-токенов
  8. Антипаттерны стабильности
  9. Паттерны стабильности
  10. Логирование
  11. Мониторинг
  12. Алертинг

Оценка

Итоговая оценка складывается из двух частей: 50 баллов за практику (10 за каждое задание) и 50 баллов за экзамен. Баллы переводятся в оценку по следующей схеме:

  • 0–54 баллов: 2
  • 55–69 баллов: 3
  • 70–84 баллов: 4
  • 85+ баллов: 5

About

Distributed systems class at Chelyabinsk State University, 2020–2021

Resources

Stars

Watchers

Forks