Бэкенд-разработчик Python (Профессиональный уровень)
Курс охватывает углублённое изучение backend-разработки на Python и включает следующие модули:
- Продвинутые паттерны проектирования и принципы SOLID
- Асинхронное программирование (asyncio, aiohttp, asyncpg)
- Работа с реляционными и NoSQL базами данных (PostgreSQL, Redis, MongoDB)
- Разработка RESTful и GraphQL API
- Архитектура микросервисов, DDD, CQRS
- Оркестрация контейнеров: Docker, Kubernetes
- CI/CD: автоматизация тестирования и деплоя (GitLab CI, GitHub Actions)
- Мониторинг и логирование (Prometheus, Grafana, ELK)
- Безопасность: JWT, OAuth2, rate limiting, шифрование
- Тестирование: unit, интеграционные, E2E-тесты (pytest, factory_boy)
- Взаимодействие с очередями сообщений (RabbitMQ, Kafka)
После прохождения курса студент должен уметь:
- Разрабатывать масштабируемые backend-приложения с использованием современных практик
- Проектировать архитектуру сервисов по лучшим промышленным стандартам
- Настройка и управление контейнеризованными приложениями
- Автоматизировать процессы сборки, тестирования и развертывания
- Обеспечивать безопасность, отказоустойчивость и производительность сервисов
После прохождения курса студент должен знать:
- Продвинутые возможности Python и его экосистемы
- Принципы построения высоконагруженных систем
- Специфику работы с сетевыми протоколами, базами данных и внешними API
- Современные подходы к разработке и деплою микросервисов
-
Что такое асинхронное программирование и как оно реализуется в Python?
Асинхронное программирование — это подход, позволяющий выполнять операции ввода-вывода без блокировки основного потока. В Python это реализуется через модули asyncio, async/await, aiohttp, asyncpg. Такой подход улучшает производительность приложений с высокой нагрузкой на I/O. -
Какие паттерны проектирования наиболее часто используются в backend-разработке?
К ним относятся Singleton, Factory, Repository, Strategy, Observer, Adapter, Facade, и другие. Они помогают создавать гибкие, тестируемые и поддерживаемые системы, особенно важные в сложных проектах. -
В чём разница между REST и GraphQL API?
REST — это стандартный стиль взаимодействия через HTTP-методы и ресурсо-ориентированные URL. GraphQL позволяет клиентам запрашивать только нужные данные, объединять несколько запросов в один и точно контролировать структуру ответа. -
Что такое микросервисная архитектура и её преимущества?
Микросервисы — это способ организации приложения как набора мелких, независимых сервисов. Преимущества: изоляция компонентов, независимый деплой, горизонтальное масштабирование, использование разных технологий для разных сервисов. -
Как работает Docker и зачем он используется в backend-разработке?
Docker — это платформа для создания, запуска и управления контейнерами. Он обеспечивает консистентность окружения, упрощает деплой, позволяет легко масштабировать приложения и интегрировать их с CI/CD. -
Что такое Kubernetes и его основные компоненты?
Kubernetes — это оркестратор контейнеров, автоматизирующий развертывание, масштабирование и управление контейнеризованными приложениями. Основные компоненты: Pod, Deployment, Service, Ingress, ConfigMap, Secret. -
Как реализовать CI/CD в Python-проекте?
CI/CD реализуется через автоматизацию тестирования (unit, интеграционные), линтинга, сборки образов, деплоя. Используются инструменты GitLab CI, GitHub Actions, Jenkins, ArgoCD. -
Что такое SOLID и почему они важны в ООП?
SOLID — это 5 принципов объектно-ориентированного дизайна: Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion. Они помогают строить гибкие и поддерживаемые системы. -
Как работать с PostgreSQL в Python?
Используются библиотеки psycopg2, asyncpg (для асинхронности), SQLAlchemy (ORM). Также можно использовать сырые SQL-запросы или ORM-объекты для работы с данными. -
Как организовать работу с Redis в Python-приложении?
Redis используется через библиотеки redis-py или aioredis (для асинхронности). Применяется для кэширования, очередей, хранения временных данных, rate limiting. -
Что такое JWT и как он используется в аутентификации?
JWT (JSON Web Token) — это открытый стандарт для передачи утверждений между сторонами в виде JSON-объекта. Используется для stateless аутентификации: клиент получает токен, который затем отправляет в заголовках каждого запроса. -
Как организовать безопасность веб-приложения на уровне backend?
Среди практик: использование HTTPS, защита от SQLi/XSS, ограничение частоты запросов (rate limiting), валидация входных данных, шифрование чувствительных данных, проверка прав доступа. -
Чем отличается unit-тестирование от интеграционного?
Unit-тестирование проверяет отдельные модули или функции изолированно. Интеграционное тестирование проверяет взаимодействие компонентов друг с другом, включая базы данных, API и внешние сервисы. -
Как использовать pytest в Python-проекте?
Pytest — это фреймворк для написания тестов. Поддерживает параметризованные тесты, фикстуры, плагины (pytest-xdist, pytest-cov, pytest-django и др.). Позволяет писать чистые и выразительные тесты. -
Как построить систему логирования и мониторинга в Python-приложении?
Логирование реализуется через logging, ELK (Elasticsearch, Logstash, Kibana). Мониторинг — через Prometheus, Grafana, Sentry. Это позволяет отслеживать ошибки, метрики, производительность и поведение сервиса в продакшене. -
Что такое message brokers и какие из них популярны в Python?
Message broker — это система обмена сообщениями между компонентами. Популярные: RabbitMQ, Kafka, Redis Streams. Используются для распределённой обработки задач, очередей, event-driven архитектур. -
Как организовать версионирование API?
API можно версионировать через URL (/api/v1/...), заголовки Accept, параметры запроса. Версионирование позволяет сохранять обратную совместимость при изменении интерфейсов. -
Что такое DDD (Domain-Driven Design) и как он применяется в backend-разработке?
DDD — это методология проектирования, ориентированная на бизнес-домен. Она включает понятия: aggregate root, entity, value object, repository, domain service. Используется для сложных систем с богатой логикой. -
Как работает CQRS и когда его стоит применять?
CQRS (Command Query Responsibility Segregation) разделяет чтение и запись на разные модели. Это полезно при высоких нагрузках на чтение, сложных доменах или необходимости денормализации данных. -
Как оптимизировать производительность Python-приложения?
Оптимизация включает: выбор эффективных алгоритмов, использование асинхронности, кэширование, профилирование (cProfile), отказ от GIL через multiprocessing, оптимизация БД-запросов. -
Как реализовать rate limiting в API?
Rate limiting ограничивает количество запросов от клиента за единицу времени. Реализуется через middleware, Redis (хранение счетчиков), библиотеки Flask-Limiter, Django-ratelimit. -
Какие инструменты используются для документирования API в Python?
Swagger/OpenAPI через FastAPI, Flask-Swagger, drf-yasg (для Django REST Framework). Также Postman Collections, ReDoc, автоматическая генерация спецификаций. -
Как работать с ORM в Python и какие есть альтернативы?
SQLAlchemy — самая популярная ORM, также Tortoise ORM (асинхронная), Peewee, Django ORM. ORM позволяет работать с БД через классы и методы вместо SQL. -
Как реализовать авторизацию через OAuth2 в Python?
OAuth2 реализуется через библиотеки Authlib, Flask-Dance, django-oauth-toolkit. Предоставляет механизм "войти через Google/Facebook", использует протокол OAuth2 для обмена токенами. -
Как подготовить Python-приложение к продакшену?
Подготовка включает: использование Gunicorn/Nginx, настройку логирования, мониторинг, тестирование, CI/CD, контейнеризацию (Docker), настройку безопасности (HTTPS, headers), масштабируемость и отказоустойчивость.
-
Какой из перечисленных модулей в Python используется для асинхронного сетевого взаимодействия?
A) threading
B) asyncio
C) multiprocessing
D) subprocess
Ответ: B) asyncio -
Что означает аббревиатура ORM?
A) Object-Relational Mapping
B) Operational Resource Management
C) Online Request Manager
D) Open Relational Model
Ответ: A) Object-Relational Mapping -
Какой HTTP-метод обычно используется для создания нового ресурса на сервере через REST API?
A) GET
B) PUT
C) POST
D) DELETE
Ответ: C) POST -
Какой принцип SOLID подразумевает, что класс должен иметь только одну причину для изменения?
A) Liskov Substitution Principle
B) Single Responsibility Principle
C) Open/Closed Principle
D) Interface Segregation Principle
Ответ: B) Single Responsibility Principle -
Какая библиотека в Python позволяет работать с PostgreSQL в асинхронном режиме?
A) psycopg2
B) SQLAlchemy
C) asyncpg
D) sqlite3
Ответ: C) asyncpg -
Какой инструмент используется для контейнеризации приложений в backend-разработке?
A) Kubernetes
B) Docker
C) Ansible
D) Terraform
Ответ: B) Docker -
Какой тип тестов проверяет поведение отдельной функции или метода в изоляции?
A) Интеграционный тест
B) E2E-тест
C) Unit-тест
D) Smoke-тест
Ответ: C) Unit-тест -
Какой механизм позволяет микросервисам обнаруживать друг друга динамически?
A) Load balancing
B) Circuit breaker
C) Service discovery
D) Reverse proxy
Ответ: C) Service discovery -
Какой паттерн проектирования используется для управления последовательностью шагов в алгоритме?
A) Strategy
B) Template Method
C) Observer
D) Factory
Ответ: B) Template Method -
Какой протокол обеспечивает строгие контракты и эффективную сериализацию данных между микросервисами?
A) JSON-RPC
B) XML
C) gRPC
D) SOAP
Ответ: C) gRPC -
Какой из следующих подходов используется для предотвращения множественных одновременных изменений одного и того же ресурса?
A) Optimistic concurrency control
B) Horizontal scaling
C) Event sourcing
D) Sharding
Ответ: A) Optimistic concurrency control -
Какой заголовок HTTP можно использовать для передачи токена JWT при аутентификации?
A) Authorization
B) WWW-Authenticate
C) Accept
D) Content-Type
Ответ: A) Authorization -
Какой тип кэширования используется для хранения результатов дорогостоящих вычислений?
A) CDN
B) In-memory cache
C) Database cache
D) Application-level cache
Ответ: D) Application-level cache -
Какой механизм позволяет временно прекратить выполнение запросов к недоступному сервису?
A) Retry
B) Timeout
C) Circuit breaker
D) Load balancer
Ответ: C) Circuit breaker -
Какой стандарт используется для описания REST API и автоматической генерации документации?
A) GraphQL
B) OpenAPI
C) RAML
D) Swagger UI
Ответ: B) OpenAPI -
Какой из следующих подходов лучше всего подходит для реализации background задач в Python?
A) Threading
B) Multiprocessing
C) Celery
D) Async/await
Ответ: C) Celery -
Какой из следующих принципов указывает, что класс должен быть открыт для расширения, но закрыт для модификации?
A) Open/Closed Principle
B) Dependency Inversion Principle
C) Interface Segregation Principle
D) Single Responsibility Principle
Ответ: A) Open/Closed Principle -
Какой тип базы данных лучше всего подходит для работы с сильно связанными данными (например, социальные графы)?
A) MongoDB
B) Redis
C) PostgreSQL
D) Neo4j
Ответ: D) Neo4j -
Какой из следующих инструментов используется для автоматического развертывания приложений в production?
A) Prometheus
B) Grafana
C) GitLab CI
D) Sentry
Ответ: C) GitLab CI -
Какой из следующих шаблонов используется для разделения логики чтения и записи в системе?
A) Repository
B) Strategy
C) CQRS
D) Decorator
Ответ: C) CQRS -
Какой тип проверки позволяет убедиться, что система может обрабатывать большое количество запросов?
A) Unit-тестирование
B) Интеграционное тестирование
C) Нагрузочное тестирование
D) Тестирование безопасности
Ответ: C) Нагрузочное тестирование -
Какой механизм используется для хранения чувствительных данных в Kubernetes?
A) ConfigMap
B) Secret
C) Deployment
D) Pod
Ответ: B) Secret -
Какой из следующих подходов позволяет построить отказоустойчивую систему?
A) Monolith architecture
B) Singleton pattern
C) Microservices + circuit breaker
D) MVC
Ответ: C) Microservices + circuit breaker -
Какой из следующих инструментов используется для сбора метрик и мониторинга производительности сервиса?
A) Logstash
B) Elasticsearch
C) Prometheus
D) Fluentd
Ответ: C) Prometheus -
Какой из следующих терминов относится к использованию одного и того же кода для разных типов данных?
A) Полиморфизм
B) Инкапсуляция
C) Наследование
D) Абстракция
Ответ: A) Полиморфизм
-
Какой из следующих паттернов используется для управления состоянием между запросами в stateless системе?
A) Singleton
B) Strategy
C) Token-based session
D) Observer
Ответ: C) Token-based session -
Какой из следующих типов кэширования наиболее эффективен для статических данных, которые редко меняются?
A) In-memory cache
B) CDN
C) Database cache
D) Redis cache
Ответ: B) CDN -
Какой из следующих протоколов обеспечивает мультиплексирование и снижение задержек при обмене данными?
A) HTTP/1.1
B) TCP/IP
C) HTTP/2
D) FTP
Ответ: C) HTTP/2 -
Какой механизм позволяет реализовать отказоустойчивость через откат к предыдущему состоянию системы?
A) Circuit breaker
B) Rollback
C) Retry
D) Fallback
Ответ: B) Rollback -
Какая библиотека в Python используется для работы с асинхронными очередями сообщений?
A) Celery
B) aiokafka
C) RQ
D) Huey
Ответ: B) aiokafka -
Какое из перечисленных утверждений верно относительно GIL в Python?
A) Он блокирует выполнение только многопоточных задач
B) Он не влияет на асинхронные приложения
C) Он существует только в CPython
D) Он полностью отсутствует в PyPy
Ответ: C) Он существует только в CPython -
Какой тип микросервисной архитектуры позволяет использовать разные технологии для разных сервисов?
A) Shared nothing architecture
B) Monolith
C) Layered architecture
D) Event-driven architecture
Ответ: A) Shared nothing architecture -
Какой инструмент используется для автоматической генерации клиентских SDK по OpenAPI спецификации?
A) Swagger Codegen
B) Postman
C) FastAPI
D) Flask
Ответ: A) Swagger Codegen -
Какой подход к тестированию лучше всего подходит для проверки взаимодействия нескольких компонентов системы?
A) Unit-тестирование
B) E2E-тестирование
C) Интеграционное тестирование
D) Smoke-тестирование
Ответ: C) Интеграционное тестирование -
Какой из следующих принципов SOLID указывает, что программы должны зависеть от абстракций, а не от конкретных реализаций?
A) Dependency Inversion Principle
B) Interface Segregation Principle
C) Liskov Substitution Principle
D) Single Responsibility Principle
Ответ: A) Dependency Inversion Principle -
Какой из следующих шаблонов используется для разделения логики домена и инфраструктуры?
A) Repository
B) MVC
C) Factory
D) Decorator
Ответ: A) Repository -
Какой механизм позволяет избежать повторного выполнения одного и того же запроса в распределённой системе?
A) Idempotency key
B) Cache-control
C) Rate limiting
D) Circuit breaker
Ответ: A) Idempotency key -
Какой из следующих методов позволяет сохранить историю изменений объекта в базе данных?
A) Soft delete
B) Row versioning
C) Event sourcing
D) Schema migration
Ответ: C) Event sourcing -
Какой из следующих типов нагрузки лучше всего обрабатывается с помощью асинхронного программирования?
A) CPU-bound
B) Memory-bound
C) I/O-bound
D) Network-bound
Ответ: C) I/O-bound -
Какой из следующих терминов описывает процесс автоматического масштабирования инфраструктуры в зависимости от нагрузки?
A) Auto-scaling
B) Load balancing
C) Orchestration
D) Deployment
Ответ: A) Auto-scaling -
Какой из следующих инструментов используется для хранения конфигураций в Kubernetes?
A) Secret
B) ConfigMap
C) Deployment
D) Service
Ответ: B) ConfigMap -
Какой из следующих типов токенов используется для передачи информации о правах доступа между сервисами?
A) OAuth 2.0 token
B) JWT
C) API Key
D) Все вышеперечисленные
Ответ: D) Все вышеперечисленные -
Какой из следующих подходов используется для построения отказоустойчивых систем с минимальным временем простоя?
A) Active-active
B) Active-passive
C) Standalone
D) Centralized
Ответ: A) Active-active -
Какой из следующих принципов дизайна API гарантирует, что один и тот же запрос всегда возвращает одинаковый результат?
A) Stateful
B) Stateless
C) Idempotent
D) Cacheable
Ответ: C) Idempotent -
Какой из следующих методов сериализации данных является наиболее эффективным по размеру и скорости?
A) JSON
B) XML
C) Protocol Buffers
D) YAML
Ответ: C) Protocol Buffers -
Какой из следующих паттернов используется для временного отключения неработающего сервиса?
A) Retry
B) Timeout
C) Circuit breaker
D) Load balancer
Ответ: C) Circuit breaker -
Какой из следующих инструментов используется для централизованного сбора и анализа логов?
A) Prometheus
B) Grafana
C) Elasticsearch
D) Sentry
Ответ: C) Elasticsearch -
Какой из следующих подходов используется для динамического изменения поведения объекта во время выполнения?
A) Strategy
B) Adapter
C) Decorator
D) Composite
Ответ: C) Decorator -
Какой из следующих методов используется для защиты от SQL-инъекций в Python?
A) Raw SQL queries
B) ORM
C) String formatting
D) Input validation
Ответ: B) ORM -
Какой из следующих терминов описывает процесс создания образа приложения с его зависимостями?
A) Build
B) Compile
C) Dockerization
D) Packaging
Ответ: C) Dockerization
-
Какой из следующих подходов используется для разделения базы данных на горизонтальные части?
A) Replication
B) Sharding
C) Clustering
D) Partitioning
Ответ: B) Sharding -
Какой из следующих механизмов позволяет сервисам обмениваться данными через события?
A) REST API
B) gRPC
C) Event-driven architecture
D) Polling
Ответ: C) Event-driven architecture -
Какой из следующих паттернов проектирования используется для создания объектов без указания конкретного класса?
A) Factory Method
B) Singleton
C) Adapter
D) Strategy
Ответ: A) Factory Method -
Какой тип проверки используется для обеспечения целостности и согласованности данных в распределённой системе?
A) ACID
B) BASE
C) CRDT
D) Paxos
Ответ: A) ACID -
Какой из следующих протоколов используется для обмена событиями между микросервисами с гарантией доставки?
A) AMQP
B) HTTP/2
C) FTP
D) SMTP
Ответ: A) AMQP -
Какой из следующих терминов описывает процесс автоматического восстановления сервиса после сбоя?
A) Self-healing
B) Auto-scaling
C) Rolling update
D) Canary release
Ответ: A) Self-healing -
Какой из следующих принципов указывает, что клиенты не должны зависеть от методов, которые они не используют?
A) Interface Segregation Principle
B) Dependency Inversion Principle
C) Open/Closed Principle
D) Liskov Substitution Principle
Ответ: A) Interface Segregation Principle -
Какой из следующих инструментов используется для работы с асинхронными задачами в Python?
A) Celery
B) RQ
C) Dramatiq
D) Все вышеперечисленные
Ответ: D) Все вышеперечисленные -
Какой из следующих методов позволяет оптимизировать работу с большими объёмами данных в базе данных?
A) Indexing
B) Denormalization
C) Sharding
D) Все вышеперечисленные
Ответ: D) Все вышеперечисленные -
Какой из следующих типов нагрузки лучше всего подходит для обработки с помощью multiprocessing в Python?
A) I/O-bound
B) Network-bound
C) CPU-bound
D) Memory-bound
Ответ: C) CPU-bound -
Какой из следующих подходов используется для построения отказоустойчивых систем с возможностью восстановления состояния?
A) Active-active
B) Backup and restore
C) Failover
D) Все вышеперечисленные
Ответ: D) Все вышеперечисленные -
Какой из следующих терминов описывает подход к разработке, при котором логика домена является центральным элементом системы?
A) Domain-Driven Design
B) Service-Oriented Architecture
C) Clean Architecture
D) Layered Architecture
Ответ: A) Domain-Driven Design -
Какой из следующих шаблонов используется для реализации бизнес-логики через последовательность шагов?
A) Command
B) Chain of Responsibility
C) State
D) Template Method
Ответ: B) Chain of Responsibility -
Какой из следующих типов тестирования используется для проверки поведения всей системы как единого целого?
A) Unit-тестирование
B) Интеграционное тестирование
C) E2E-тестирование
D) Smoke-тестирование
Ответ: C) E2E-тестирование -
Какой из следующих механизмов используется для ограничения количества запросов от одного клиента за определённый период времени?
A) Throttling
B) Circuit breaker
C) Retry
D) Timeout
Ответ: A) Throttling -
Какой из следующих принципов указывает, что производные классы должны быть взаимозаменяемыми с родительскими?
A) Liskov Substitution Principle
B) Interface Segregation Principle
C) Single Responsibility Principle
D) Open/Closed Principle
Ответ: A) Liskov Substitution Principle -
Какой из следующих инструментов используется для реализации service mesh в Kubernetes?
A) Istio
B) Prometheus
C) Grafana
D) Fluentd
Ответ: A) Istio -
Какой из следующих методов используется для сериализации и десериализации данных в Python?
A) JSON
B) Pickle
C) MessagePack
D) Все вышеперечисленные
Ответ: D) Все вышеперечисленные -
Какой из следующих терминов описывает подход, при котором изменения внедряются сначала в небольшую группу пользователей?
A) Blue/green deployment
B) Canary release
C) Rolling update
D) Feature flag
Ответ: B) Canary release -
Какой из следующих методов используется для хранения временных данных в распределённой системе?
A) Redis
B) PostgreSQL
C) MongoDB
D) MySQL
Ответ: A) Redis -
Какой из следующих терминов описывает способность системы продолжать работу даже при частичных сбоях?
A) Fault tolerance
B) High availability
C) Scalability
D) Resilience
Ответ: A) Fault tolerance -
Какой из следующих подходов используется для хранения конфигураций в облачных приложениях?
A) Environment variables
B) ConfigMap
C) Secret
D) Все вышеперечисленные
Ответ: D) Все вышеперечисленные -
Какой из следующих механизмов используется для защиты от XSS-атак в backend-приложениях?
A) SQL injection
B) Input validation
C) CSRF token
D) Content Security Policy
Ответ: D) Content Security Policy -
Какой из следующих терминов описывает подход к проектированию, при котором интерфейсы разделены по ответственности?
A) Interface Segregation Principle
B) Dependency Inversion Principle
C) Open/Closed Principle
D) Liskov Substitution Principle
Ответ: A) Interface Segregation Principle -
Какой из следующих паттернов используется для управления зависимостями между компонентами?
A) Dependency Injection
B) Factory
C) Observer
D) Strategy
Ответ: A) Dependency Injection
Экзаменационный билет №1
Теоретическая часть
- Опишите, в чём заключается принцип Single Responsibility из SOLID и приведите пример его нарушения.
- Что такое асинхронное программирование и как оно реализуется в Python с помощью asyncio?
Ответы на теоретическую часть:
- Принцип Single Responsibility утверждает, что класс (или модуль) должен иметь только одну причину для изменения. Нарушение: если один класс отвечает и за обработку данных, и за их сохранение в БД — он имеет две ответственности.
- Асинхронное программирование позволяет выполнять операции ввода-вывода без блокировки основного потока. В Python это реализуется через
asyncio
ключевые словаasync/await
а также библиотеки вродеaiohttp
иasyncpg
Практическая часть
Реализуйте простой REST API с использованием FastAPI, который принимает POST-запрос по адресу /sum
и возвращает JSON с суммой двух чисел, переданных в теле запроса.
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class SumRequest(BaseModel):
a: float
b: float
@app.post("/sum")
def calculate_sum(request: SumRequest):
return {"result": request.a + request.b}
Экзаменационный билет №2
Теоретическая часть
- Объясните, что такое паттерн Repository и в каких случаях он применяется.
- Как работает механизм GIL в Python и как он влияет на производительность многопоточных приложений?
Ответы на теоретическую часть:
- Паттерн Repository абстрагирует работу с источником данных (например, БД), предоставляя интерфейс для получения и сохранения объектов. Применяется для отделения бизнес-логики от доступа к данным, особенно в DDD.
- GIL (Global Interpreter Lock) ограничивает выполнение одновременно только одного потока в CPython. Это снижает эффективность CPU-bound многопоточных приложений, но не мешает I/O-bound задачам.
Практическая часть
Напишите функцию на Python, которая использует Redis для кэширования результатов вычисления факториала числа. Если значение уже есть в кэше — вернуть его, иначе вычислить и сохранить.
import redis
import functools
redis_client = redis.Redis(host='localhost', port=6379, db=0)
def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1)
def cached_factorial(n):
key = f"factorial:{n}"
result = redis_client.get(key)
if result is not None:
return int(result)
result = factorial(n)
redis_client.setex(key, 3600, str(result)) # хранить 1 час
return result
Экзаменационный билет №3
Теоретическая часть
- В чём отличие между микросервисной и монолитной архитектурой?
- Что такое event sourcing и какие преимущества он даёт?
Ответы на теоретическую часть:
- Микросервисная архитектура разбивает приложение на независимые сервисы, каждая из которых может быть разработана, развернута и масштабирована отдельно. Монолит — это единое приложение, где все компоненты тесно связаны и разворачиваются вместе.
- Event sourcing — это подход, при котором состояние системы представляется как последовательность событий. Преимущества: возможность восстановления состояния на любой момент времени, аудит, анализ изменени
Практическая часть
Напишите Dockerfile для Python-приложения, использующего Flask и находящегося в директории /app
Приложение запускается через gunicorn --bind :8000 app:app
# Используем официальный образ Python
FROM python:3.11-slim
# Устанавливаем рабочую директорию
WORKDIR /app
# Копируем зависимости
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Копируем исходный код
COPY . .
# Открываем порт
EXPOSE 8000
# Команда запуска
CMD ["gunicorn", "--bind", ":8000", "app:app"]
Экзаменационный билет №4
Теоретическая часть
- Дайте определение понятию "CI/CD" и объясните, как эти процессы автоматизируются.
- Что такое Circuit Breaker и как он помогает в микросервисной архитектуре?
Ответы на теоретическую часть:
- CI/CD — это практики Continuous Integration (непрерывной интеграции) и Continuous Delivery/Deployment (непрерывной доставки/развертывания). CI обеспечивает автоматическое тестирование при каждом коммите, CD — автоматический деплой. Автоматизация выполняется через GitLab CI, GitHub Actions, Jenkins и др.
- Circuit Breaker — это шаблон проектирования, который временно прекращает вызовы к недоступному сервису, чтобы избежать cascading failures. Это повышает отказоустойчивость системы.
Практическая часть
Напишите Celery-задачу, которая отправляет email через SMTP. Задача должна принимать адрес получателя и текст сообщения.
from celery import Celery
import smtplib
from email.mime.text import MIMEText
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def send_email_task(to, body):
msg = MIMEText(body)
msg['Subject'] = 'Уведомление'
msg['From'] = 'noreply@example.com'
msg['To'] = to
with smtplib.SMTP('smtp.example.com') as server:
server.login("user", "password")
server.sendmail(msg['From'], [msg['To']], msg.as_string())
Экзаменационный билет №5
Теоретическая часть
- Охарактеризуйте подход к тестированию backend-приложений. Какие виды тестов существуют и когда они применяются?
- Что такое JWT и как он используется в системах авторизации?
Ответы на теоретическую часть:
- Виды тестов: unit-тесты (проверка отдельных функций), интеграционные (взаимодействие компонентов), E2E (полный цикл работы), smoke (быстрая проверка работоспособности). Unit-тесты используются на этапе разработки, E2E — перед релизом.
- JWT (JSON Web Token) — это стандарт для передачи данных между сторонами в виде JSON-объекта. Используется для stateless аутентификации: клиент получает токен после логина и передаёт его в заголовках каждого запроса.
Практическая часть
Реализуйте middleware для проверки наличия API-ключа в заголовке запроса в FastAPI.
from fastapi import FastAPI, HTTPException, Request
app = FastAPI()
API_KEY = "my_secret_key"
@app.middleware("http")
async def api_key_middleware(request: Request, call_next):
auth_header = request.headers.get("X-API-Key")
if auth_header != API_KEY:
raise HTTPException(status_code=403, detail="Forbidden")
response = await call_next(request)
return response
@app.get("/")
def read_root():
return {"message": "Access granted"}
Экзаменационный билет №6
Теоретическая часть
- Объясните, что такое DDD (Domain-Driven Design) и какие основные концепции он включает.
- Что означает термин "event-driven architecture" и в каких случаях она применяется?
Ответы на теоретическую часть:
- DDD — это подход к проектированию сложных систем, ориентированный на бизнес-домен. Основные концепции: Aggregate Root, Entity, Value Object, Repository, Domain Service, Bounded Context. Применяется при разработке масштабируемых, поддерживаемых систем с богатой логикой.
- Event-driven architecture — это архитектура, в которой компоненты взаимодействуют через события. Применяется в микросервисах, системах реального времени, распределённых системах для повышения гибкости и отказоустойчивости.
Практическая часть
Напишите Python-скрипт, который подписывается на очередь RabbitMQ и обрабатывает сообщения, сохраняя их в PostgreSQL.
import pika
import psycopg2
# Подключение к PostgreSQL
conn = psycopg2.connect(
dbname="mydb",
user="user",
password="password",
host="localhost"
)
cursor = conn.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS messages (id SERIAL PRIMARY KEY, body TEXT)")
conn.commit()
# Подключение к RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='task_queue')
def callback(ch, method, properties, body):
print(f"Получено сообщение: {body.decode()}")
cursor.execute("INSERT INTO messages (body) VALUES (%s)", (body.decode(),))
conn.commit()
ch.basic_ack(delivery_tag=method.delivery_tag)
channel.basic_consume(queue='task_queue', on_message_callback=callback)
print('Ожидание сообщений...')
channel.start_consuming()
Экзаменационный билет №7
Теоретическая часть
- В чём заключается принцип Open/Closed из SOLID? Приведите пример его применения.
- Какие преимущества даёт использование Docker в backend-разработке?
Ответы на теоретическую часть:
- Принцип Open/Closed утверждает, что класс должен быть открыт для расширения, но закрыт для модификации. Например, если вы добавляете новый тип отчета в систему, не изменяя существующий код, а через наследование или стратегию.
- Docker обеспечивает изоляцию окружения, воспроизводимость сборки, совместимость между dev и prod, простоту деплоя, интеграцию с CI/CD и возможность масштабирования.
Практическая часть
Реализуйте FastAPI-эндпоинт /login
который принимает username
и password
проверяет их по БД и возвращает JWT токен.
from fastapi import FastAPI, Depends, HTTPException
from pydantic import BaseModel
from passlib.context import CryptContext
from datetime import datetime, timedelta
from typing import Optional
import jwt
app = FastAPI()
SECRET_KEY = "your-secret-key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
# Имитация БД
fake_users_db = {
"admin": {
"username": "admin",
"hashed_password": pwd_context.hash("secret")
}
}
class Token(BaseModel):
access_token: str
token_type: str
class LoginData(BaseModel):
username: str
password: str
def verify_password(plain_password, hashed_password):
return pwd_context.verify(plain_password, hashed_password)
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
to_encode = data.copy()
expire = datetime.utcnow() + (expires_delta or timedelta(minutes=15))
to_encode.update({"exp": expire})
return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
@app.post("/login", response_model=Token)
def login(credentials: LoginData):
user = fake_users_db.get(credentials.username)
if not user or not verify_password(credentials.password, user["hashed_password"]):
raise HTTPException(status_code=401, detail="Invalid credentials")
access_token = create_access_token(data={"sub": credentials.username})
return {"access_token": access_token, "token_type": "bearer"}
Экзаменационный билет №8
Теоретическая часть
- Что такое мониторинг и логирование в backend-приложениях? Какие инструменты используются?
- Что такое шардинг баз данных и в каких случаях он применяется?
Ответы на теоретическую часть:
- Мониторинг — это сбор метрик и анализ состояния системы (CPU, RAM, latency). Логирование — запись событий работы сервиса. Инструменты: Prometheus, Grafana, ELK (Elasticsearch, Logstash, Kibana), Sentry.
- Шардинг — разделение базы данных на горизонтальные части по ключам. Применяется при высокой нагрузке, чтобы повысить производительность и масштабируемость.
Практическая часть
Напишите Python-скрипт, который использует pytest
для тестирования функции вычисления факториала.
# factorial.py
def factorial(n):
if n < 0:
raise ValueError("Факториал определён только для неотрицательных чисел.")
result = 1
for i in range(2, n+1):
result *= i
return result
# test_factorial.py
import pytest
from factorial import factorial
def test_factorial_positive():
assert factorial(5) == 120
assert factorial(3) == 6
def test_factorial_zero():
assert factorial(0) == 1
def test_factorial_negative():
with pytest.raises(ValueError):
factorial(-1)
Экзаменационный билет №9
Теоретическая часть
- Объясните, что такое REST API и какие методы HTTP обычно используются.
- Какие преимущества дает применение type hints в Python?
Ответы на теоретическую часть:
- REST API — это стиль архитектуры, основанный на HTTP-методах: GET (получение), POST (создание), PUT/PATCH (обновление), DELETE (удаление). Он используется для создания stateless API с четкой структурой URL.
- Type hints улучшают читаемость кода, позволяют использовать статические анализаторы (например, mypy), помогают IDE предоставлять автодополнение и предупреждать о потенциальных ошибках.
Практическая часть
Напишите FastAPI-сервис, который предоставляет CRUD-операции над моделью User (id, name, email).
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Optional
app = FastAPI()
class UserCreate(BaseModel):
name: str
email: str
class User(UserCreate):
id: int
users = []
next_id = 1
@app.post("/users/", response_model=User)
def create_user(user: UserCreate):
global next_id
new_user = User(id=next_id, **user.dict())
users.append(new_user)
next_id += 1
return new_user
@app.get("/users/", response_model=List[User])
def get_users():
return users
@app.get("/users/{user_id}", response_model=User)
def get_user(user_id: int):
for user in users:
if user.id == user_id:
return user
raise HTTPException(status_code=404, detail="User not found")
@app.put("/users/{user_id}", response_model=User)
def update_user(user_id: int, updated_user: UserCreate):
for user in users:
if user.id == user_id:
user.name = updated_user.name
user.email = updated_user.email
return user
raise HTTPException(status_code=404, detail="User not found")
@app.delete("/users/{user_id}")
def delete_user(user_id: int):
global users
for i, user in enumerate(users):
if user.id == user_id:
del users[i]
return {"message": "User deleted"}
raise HTTPException(status_code=404, detail="User not found")
Экзаменационный билет №10
Теоретическая часть
- Что такое микросервисная архитектура и какие у неё преимущества и недостатки?
- Дайте характеристику паттерну Strategy и приведите пример использования.
Ответы на теоретическую часть:
- Микросервисная архитектура — это способ организации приложения как набора независимых сервисов. Преимущества: независимый деплой, масштабируемость, технологическая гетерогенность. Недостатки: сложность управления, сетевые задержки, согласованность данных.
- Паттерн Strategy позволяет определять семейство алгоритмов и делать их взаимозаменяемыми. Пример: система расчета доставки — можно выбрать между StandardShipping, ExpressShipping и т.д., не меняя клиентский код.
Практическая часть
Напишите Python-функцию, которая реализует паттерн Strategy для разных видов сортировки (по возрастанию, по убыванию, по длине строки).
class SortStrategy:
def sort(self, data):
raise NotImplementedError()
class AscendingSort(SortStrategy):
def sort(self, data):
return sorted(data)
class DescendingSort(SortStrategy):
def sort(self, data):
return sorted(data, reverse=True)
class LengthSort(SortStrategy):
def sort(self, data):
return sorted(data, key=len)
class Sorter:
def __init__(self, strategy: SortStrategy):
self.strategy = strategy
def execute_sort(self, data):
return self.strategy.sort(data)
# Пример использования
data = ["banana", "apple", "cherry"]
sorter_asc = Sorter(AscendingSort())
sorter_desc = Sorter(DescendingSort())
sorter_len = Sorter(LengthSort())
print(sorter_asc.execute_sort(data)) # ['apple', 'banana', 'cherry']
print(sorter_desc.execute_sort(data)) # ['cherry', 'banana', 'apple']
print(sorter_len.execute_sort(data)) # ['apple', 'banana', 'cherry']
Экзаменационный билет №11
Теоретическая часть
- Что такое Kubernetes и какие основные компоненты входят в его архитектуру?
- Какие виды тестирования применяются в backend-разработке? Охарактеризуйте каждый.
Ответы на теоретическую часть:
- Kubernetes — это платформа для оркестрации контейнеров. Основные компоненты: API Server, etcd (хранилище состояния), Controller Manager, Scheduler, Kubelet, Kube-proxy, Container Runtime.
- Виды тестирования:
- Unit-тестирование — проверка отдельных модулей.
- Интеграционное — взаимодействие между компонентами.
- E2E — полный цикл работы системы.
- Smoke — базовая проверка работоспособности после деплоя.
- Нагрузочное — проверка производительности под нагрузкой
Практическая часть
Напишите Python-функцию, которая использует asyncpg
для получения списка пользователей из PostgreSQL по указанному возрасту.
import asyncpg
import asyncio
async def get_users_by_age(age_threshold):
conn = await asyncpg.connect(
user='user',
password='password',
database='mydb',
host='localhost'
)
query = "SELECT id, name, age FROM users WHERE age > $1"
rows = await conn.fetch(query, age_threshold)
await conn.close()
return rows
# Пример запуска
if __name__ == "__main__":
loop = asyncio.get_event_loop()
result = loop.run_until_complete(get_users_by_age(25))
print(result)
Экзаменационный билет №12
Теоретическая часть
- Дайте определение паттерну Singleton и приведите пример его применения.
- Что такое миграции баз данных и как они реализуются в Python?
Ответы на теоретическую часть:
- Паттерн Singleton гарантирует, что у класса будет только один экземпляр, и предоставляет к нему глобальную точку доступа. Применяется, например, для управления соединением с БД или логированием.
- Миграции — это изменения схемы БД, применяемые по порядку. В Python реализуются через Alembic (для SQLAlchemy) или Django Migrations.
Практическая часть
Реализуйте middleware в FastAPI, который добавляет заголовок X-Response-Time
с временем обработки запроса.
from fastapi import FastAPI
from starlette.middleware import Middleware
from starlette.middleware.base import BaseHTTPMiddleware
from starlette.requests import Request
import time
app = FastAPI()
class ResponseTimeMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
response.headers["X-Response-Time"] = str(process_time)
return response
app.add_middleware(ResponseTimeMiddleware)
@app.get("/")
def read_root():
return {"message": "Hello"}
Экзаменационный билет №13
Теоретическая часть
- Объясните, что такое CQRS и когда он используется.
- Что такое контекстный менеджер в Python и как он реализуется?
Ответы на теоретическую часть:
- CQRS (Command Query Responsibility Segregation) — разделение операций чтения и записи на разные модели. Используется при высоких нагрузках на чтение или сложной бизнес-логике.
- Контекстный менеджер управляет ресурсами (например, файлы, соединения) безопасно и автоматически. Реализуется через
with
и методы__enter__
__exit__
Практическая часть
Напишите Python-скрипт, который создаёт SQLite-базу данных с таблицей users
и заполняет её 10 записями.
import sqlite3
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE
)
""")
sample_data = [
("Alice", "alice@example.com"),
("Bob", "bob@example.com"),
("Charlie", "charlie@example.com"),
("David", "david@example.com"),
("Eve", "eve@example.com"),
("Frank", "frank@example.com"),
("Grace", "grace@example.com"),
("Helen", "helen@example.com"),
("Ian", "ian@example.com"),
("Jack", "jack@example.com")
]
try:
cursor.executemany("INSERT INTO users (name, email) VALUES (?, ?)", sample_data)
conn.commit()
except sqlite3.IntegrityError as e:
print(f"Ошибка уникальности: {e}")
finally:
conn.close()
Экзаменационный билет №14
Теоретическая часть
- В чём заключается принцип Dependency Inversion из SOLID?
- Что такое OpenTelemetry и зачем он нужен в микросервисах?
Ответы на теоретическую часть:
- Принцип Dependency Inversion утверждает, что модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций. Это делает систему гибкой и тестируемой.
- OpenTelemetry — это фреймворк для сбора метрик, логов и трассировки. Используется в микросервисах для распределённого наблюдения и анализа производительности.
Практическая часть
- Реализуйте REST API с использованием Flask, которое принимает POST-запрос
/reverse
с JSON-полемtext
и возвращает перевёрнутую строку.
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/reverse", methods=["POST"])
def reverse_text():
data = request.get_json()
if not data or "text" not in data:
return jsonify({"error": "Missing 'text' field"}), 400
return jsonify({"reversed_text": data["text"][::-1]})
if __name__ == "__main__":
app.run(debug=True)
Экзаменационный билет №15
Теоретическая часть
- Что такое Saga Pattern и в каких случаях он применяется?
- Какие существуют стратегии масштабирования backend-приложений?
Ответы на теоретическую часть:
- Saga Pattern — это шаблон для реализации транзакций в распределённых системах. Применяется вместо ACID-транзакций, где используются compensating transactions для отката изменений.
- Стратегии масштабирования:
- Вертикальное — увеличение мощности сервера.
- Горизонтальное — добавление новых экземпляров сервиса.
Горизонтальное предпочтительнее для отказоустойчивости и эластичности.
Практическая часть
Напишите Dockerfile и docker-compose.yml для запуска FastAPI-приложения с PostgreSQL.
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
# docker-compose.yml
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/mydb
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data/
volumes:
postgres_data:
(1) Кейс: "Медленная работа API в продакшене"
Описание кейса
Вы — начинающий Unity-разработчик, участвуете в разработке 2D-платформера. Ваша задача — реализовать базовое управление игроком: перемещение по горизонтали и прыжок.
Скрипт написан, компоненты добавлены, но при запуске игры персонаж не реагирует на нажатия клавиш A/D или стрелок , хотя код, по мнению студента, должен работать.
Вам нужно выявить возможные ошибки и предложить пути их исправления.
Жалобы пользователей:
- Время отклика эндпоинта стало нестабильным.
- Иногда возвращается ошибка
504 Gateway Timeout
- Мониторинг показывает увеличение времени выполнения SQL-запросов.
Анализ ситуации и выявление проблем
Проблема №1
Нескалируемый уровень БД. Запросы к БД не оптимизированы, используют множественные JOIN'ы без индексов.
Решение:
Проверить EXPLAIN ANALYZE на основные запросы. Добавить индексы на поля date_from
date_to
campaign_id
Переписать JOIN'ы так, чтобы извлекались только необходимые данные.
Проблема №2
Использование синхронного ORM блокирует event loop, даже если FastAPI асинхронный.
Решение:
Перейти на асинхронный доступ к БД через asyncpg
или SQLAlchemy async session
Проблема №3
Отсутствие кэширования часто запрашиваемых отчётов за прошедшие периоды.
Решение:
Внедрить Redis для кэширования результатов частых запросов. Использовать ключ вида report:{date_from}:{date_to}
и TTL
Проблема №4
Неэффективная конфигурация Gunicorn — неверно подобранное количество worker’ов.
Решение:
Настроить количество worker’ов по формуле: number_of_workers = (CPU_CORES * 2) + 1
Убедиться, что тип worker’ов — uvicorn.workers.UvicornWorker
Проблема №5
Проблемы с соединением с БД: возможны утечки соединений или исчерпание лимита.
Решение:
Использовать connection pool с ограниченным количеством соединений. Настроить idle timeout и heartbeat.
Проблема №6
Нет механизма rate limiting. Возможна DDoS-атака или чрезмерное количество параллельных тяжёлых запросов.
Решение:
Реализовать ограничение количества запросов на пользователя/IP. Хранить счетчики в Redis.
Проблема №7
Нет асинхронной обработки тяжёлых отчётов — всё выполняется inline.
Решение:
Использовать Celery или RQ для background-обработки долгих задач. Возвращать статус задачи сразу и выполнять вычисления в фоне.
Обучающие моменты
- Умение анализировать SQL-запросы критично для производительности.
- Асинхронность улучшает пропускную способность сервиса.
- Кэширование снижает нагрузку и ускоряет ответы.
- Правильная настройка окружения (Gunicorn, worker’ы) влияет на стабильность.
- Масштабируемость требует не только горизонтального роста, но и внутренней оптимизации.
- Rate limiting защищает от перегрузки сервиса.
- Тяжёлые задачи лучше выполнять асинхронно.
Дополнительные задания для самостоятельной работы
- Выполнить EXPLAIN ANALYZE всех ключевых SQL-запросов.
- Переписать ORM-запросы на async (asyncpg или SQLAlchemy async).
- Добавить Redis-кэширование результатов запросов.
- Настроить Gunicorn workers под нагрузку.
- Реализовать rate limiting по IP через Redis.
- Создать background-задачу в Celery для формирования отчётов.
- Развернуть окружение через Docker Compose (FastAPI + PostgreSQL + Redis + Celery).
- Настроить мониторинг с Prometheus и Grafana.
(2) Кейс: "Неожидаемое падение микросервиса после обновления"
Описание кейса
Вы работаете в команде, разрабатывающей систему управления заказами для крупного интернет-магазина. Система состоит из нескольких микросервисов, написанных на Python с использованием FastAPI и RabbitMQ для межсервисного взаимодействия.
Недавно вы выпустили новую версию сервиса order-service
которая добавила функционал автоматического применения промокодов при создании заказа. Однако через несколько минут после деплоя начались ошибки: сервис стал нестабильно отвечать, а затем начал возвращать 500 Internal Server Error и вовсе перестал принимать запросы.
Вам поручено разобраться в причинах сбоя, восстановить работу сервиса и предотвратить подобные инциденты в будущем.
Анализ ситуации и выявление проблем
Проблема №1
Ошибка валидации входных данных в новом функционале (промокоды). Возникает NoneType
при обращении к несуществующему промокоду.
Решение:
Добавить проверку на None
использовать типы Optional
безопасный доступ к полям, обработка исключений через try/except.
Проблема №2
Отсутствие unit- и интеграционного тестирования перед выпуском.
Решение:
Покрыть новый код unit- и интеграционными тестами. Использовать pytest и factory_boy для генерации тестовых данных.
Проблема №3
Неверная обработка ошибок в consumer'е RabbitMQ — сообщения помечаются как обработанные даже при сбое.
Решение:
Добавить try/except, отправлять NACK при ошибке или перемещать сообщение в DLQ (Dead Letter Queue) после нескольких попыток.
Проблема №4
Нет health check / readiness probe — сервис считается живым, даже если он не может работать.
Решение:
Добавить эндпоинты /healthz
и /readyz
Настроить readinessProbe в Kubernetes для проверки подключения к БД и RabbitMQ.
Проблема №5
Нет системы автоматического rollback’а — при сбое нет механизма отката на предыдущую версию.
Решение:
Настроить GitOps (например, ArgoCD), использовать аннотации версий в Helm чартах для автоматического отката при ошибках.
Проблема №6
Нет ограничения потребления ресурсов в Kubernetes — сервис быстро исчерпал доступные CPU/память.
Решение:
Указать resources.limits
и resources.requests
в Deployment, чтобы избежать перегрузки узла и обеспечить справедливое распределение ресурсов.
Проблема №7
Нет rate limiting и backpressure на внешние вызовы — сервис не выдержал нагрузки.
Решение:
Использовать middleware для ограничения количества запросов, настроить prefetch count
в RabbitMQ consumer для контроля нагрузки.
Обучающие моменты
- Даже небольшие изменения могут привести к критическим сбоям без должного тестирования.
- Знание работы очередей, ошибок и жизненного цикла контейнеров — ключевой навык.
- Профилактика важнее реактивности: мониторинг, тесты, CI/CD и rollback имеют решающее значение.
Дополнительные задания для самостоятельной работы
-
Покрытие тестами
Напишите unit- и интеграционные тесты для промокодов с помощьюpytest
-
Обработка ошибок в RabbitMQ
Реализуйте NACK, retry и DLQ для сообщений. -
Health check
Добавьте/healthz
и/readyz
эндпоинты и настройте probes в Kubernetes. -
Ограничение ресурсов
Установитеresources.limits
иrequests
в Kubernetes Deployment. -
Автоматический rollback
Настройте откат версии при неудачном деплое (Argo Rollouts / Helm). -
Rate limiting и backpressure
Ограничьте число запросов и настройте prefetch в RabbitMQ. -
Логирование и мониторинг
Подключите ELK и Prometheus + Grafana для анализа состояния сервиса.
Ролевая игра №1: "Выживание в продакшене"
Цель игры:
Научить студентов реагировать на критические инциденты в production-среде, принимать решения под давлением и взаимодействовать в команде как профессиональные backend-инженеры.
Формат игры:
- Тип: Симуляция кризисной ситуации в IT-продакте.
- Продолжительность: 2–3 академических часа.
- Формат: Оффлайн или онлайн (в Zoom/MS Teams).
- Команды: По 4–6 человек.
- Механика: Имитация сбоя в системе + пошаговое принятие решений.
Сеттинг:
Ваша команда — отдел backend-разработки стартапа, который управляет сервисом доставки еды. Сервис работает на Python (FastAPI), PostgreSQL, RabbitMQ, Kubernetes.
Сегодня утром пришло сообщение от службы мониторинга:
Внезапный рост ошибок 500, нагрузка на БД выросла до 100%, пользователи не могут оформлять заказы.
Роли в команде:
Каждый участник получает роль для более глубокого погружения:
-
Team Lead / Tech Lead
Отвечает за координацию, принимает финальные решения. -
Backend Developer (Python/FastAPI)
Анализирует код, ищет баги, проверяет логи, обновляет зависимости. -
DevOps Engineer
Проверяет состояние контейнеров, логи Kubernetes, метрики, сетевые правила. -
Database Engineer
Занимается проблемами с БД: медленные запросы, блокировки, индексы. -
QA / SRE (по желанию)
Следит за тестированием, помогает воспроизводить баги, анализирует мониторинг.
Этапы игры:
Этап 1: Инцидент объявлен
- Команда получает описание проблемы.
- Предоставляются: логи, графики из Prometheus/Grafana, скриншоты мониторинга, фрагменты кода.
Этап 2: Диагностика
- Участники совместно анализируют информацию.
- Выдвигают гипотезы о причинах сбоя.
Этап 3: Приоритизация действий
- Обсуждают возможные пути решения.
- Принимают решение: перезалить сервис? Мигрировать БД? Изменить конфиг?
Этап 4: Реализация решения
- Команда выбирает действия и получает обратную связь от преподавателя (например, "вы выполнили rollback, но проблема не исчезла").
Этап 5: Дебрифинг и выводы
- Разбор действий, что сработало, что нет.
- Обсуждение лучшей практики для предотвращения таких ситуаций.
Обучающие эффекты:
- Научиться быстро диагностировать и реагировать на проблемы в production.
- Получить опыт работы в условиях ограниченного времени и неопределенности.
- Научиться работать в команде, делегировать задачи и принимать решения.
- Практически применить знания о логировании, мониторинге, CI/CD, базах данных, очередях и контейнерах.
Возможные проблемы и вызовы во время игры:
- Недостаточно информации — участники должны задавать вопросы и запрашивать дополнительные данные.
- Ошибочная гипотеза — команда может выбрать неправильное решение, что приведёт к усугублению ситуации.
- Конфликты в команде — хорошая возможность потренировать soft skills и лидерство.
- Время на принятие решений — имитирует реальные условия, когда нужно действовать быстро.
Что предоставляется участникам:
- Фрагменты логов (Traceback, ошибки в БД, таймауты)
- Графики нагрузки (CPU, Memory, DB queries/sec)
- Код сервиса (с намёками на проблему)
- Скриншоты Kubernetes Dashboard
- Конфиги Docker, Deployment, RabbitMQ
Ролевая игра №2: "Запуск нового микросервиса: всё пошло не так"
Цель игры:
Научить студентов проектировать, запускать и интегрировать микросервисы с учётом возможных подводных камней. Развить навыки архитектурного мышления, взаимодействия между сервисами и диагностики проблем на ранних этапах.
Формат игры:
- Тип: Имитация запуска нового микросервиса в существующую систему.
- Продолжительность: 2–3 академических часа.
- Формат: Оффлайн или онлайн.
- Команды: По 4–6 человек.
- Механика: Сценарий "зеленого поля" + последовательное выявление проблем при запуске.
Сеттинг:
Вы — команда backend-разработчиков стартапа, который предоставляет платформу для бронирования мероприятий (конференции, мастер-классы, лекции).
Недавно была начата разработка нового микросервиса notification-service
который должен отправлять email и push-уведомления о событиях (новое бронирование, напоминание, отмена).
Сервис был внедрен и запущен в production. Однако вскоре начались проблемы:
Пользователи не получают уведомления, очередь сообщений растёт, сервис падает каждые несколько минут.
Роли в команде:
-
Tech Lead / Architect
Отвечает за общий подход к интеграции и выбор технологий. -
Backend Developer (Python)
Анализирует код сервиса, проверяет обработку сообщений, логи, ошибки выполнения. -
DevOps Engineer
Проверяет состояние контейнеров, Kubernetes, CI/CD, health check. -
QA / SRE
Воспроизводит ошибки, анализирует мониторинг, проверяет тесты. -
Email Infrastructure Specialist (опционально)
Изучает интеграцию с почтовым API (например, SendGrid), проверяет рейт-лимиты, доставку.
Этапы игры:
Этап 1: Знакомство с задачей
- Команда получает описание сервиса и его цели.
- Предоставляется информация о том, что сервис внедрён, но работает некорректно.
Этап 2: Диагностика проблемы
- Участники изучают:
- Логи сервиса
- Графики нагрузки
- Конфигурации Docker/Kubernetes
- Примеры запросов/сообщений
Этап 3: Выдвижение гипотез
- Возможные причины:
- Неправильная интеграция с очередью (RabbitMQ/Kafka)
- Отсутствие retry logic и обработка ошибок
- Перегрузка внешнего API (например, SendGrid rate limit)
- Нет health check или readiness probe
- Ошибки сериализации/валидации данных
Этап 4: Реализация исправлений
- Команда выбирает действия:
- Добавить retries с backoff
- Настроить prefetch count
- Добавить DLQ
- Исправить сериализацию данных
- Настроить health check и probes
Этап 5: Дебрифинг и выводы
- Разбор действий, что помогло, а что нет.
- Обсуждение лучшей практики для запуска новых сервисов.
Обучающие эффекты:
- Научиться правильно проектировать и интегрировать микросервисы.
- Получить опыт работы с очередями сообщений, обработкой ошибок, retry logic.
- Научиться диагностировать проблемы на уровне сервиса, сети и инфраструктуры.
- Практически применить знания о CI/CD, Kubernetes, мониторинге и логировании.
Возможные проблемы и вызовы во время игры:
- Недостаточно информации — участники должны уметь задавать уточняющие вопросы.
- Ошибка валидации данных — приводит к бесконечному циклу ошибок.
- Rate limiting на внешнем API — требует понимания best practices по работе с third-party сервисами.
- Неправильная обработка сообщений — приводит к потере данных или повторной обработке.
- Время принятия решений — имитирует реальные условия запуска сервиса.
Ролевая игра №3: "DDoS-атака на наш API: как мы спасали систему"
Цель игры:
Научить студентов распознавать признаки DDoS-атаки, принимать меры по защите API, масштабировать сервисы в условиях чрезмерной нагрузки и работать в условиях стресса.
Формат игры:
- Тип: Симуляция кризисной ситуации под высокой нагрузкой.
- Продолжительность: 2–3 академических часа.
- Формат: Оффлайн или онлайн (в Zoom/MS Teams).
- Команды: По 4–6 человек.
- Механика: Имитация массированной атаки с последовательным ухудшением состояния системы.
Сеттинг:
Вы — команда backend-разработчиков и DevOps-инженеров компании, которая предоставляет облачный сервис управления задачами.
Сегодня утром система начала работать некорректно:
Сервис стал медленно отвечать, затем начал возвращать HTTP 503 Service Unavailable. Мониторинг показывает резкий скачок трафика — с ~1000 до более чем 50 000 RPS.
Подозревается DDoS-атака или массовый брутфорс через API авторизации.
Роли в команде:
-
Tech Lead / Incident Commander
Координирует действия, принимает решения, управляет коммуникацией. -
Backend Developer (Python / FastAPI)
Анализирует логи, проверяет middleware, rate limiting, обрабатываемые эндпоинты. -
DevOps Engineer
Изучает метрики Kubernetes, Nginx, Cloudflare, AWS WAF, состояние worker'ов. -
Security Specialist (опционально)
Отвечает за блокировку IP, настройку rate limiting, анализ подозрительного трафика. -
QA / SRE
Проверяет доступность сервиса, помогает воспроизводить сценарии, анализирует логи.
Этапы игры:
Этап 1: Обнаружение аномалии
- Команда получает данные из мониторинга (Prometheus/Grafana), логи, скриншоты alert’ов.
- Предоставляются примеры запросов из логов (подозрительные User-Agent, частые запросы к
/login
)
Этап 2: Диагностика источника нагрузки
- Участники анализируют:
- Логи Nginx / Gunicorn
- Данные из Cloudflare / AWS
- Трафик по эндпоинтам
Этап 3: Реакция на инцидент
- Возможные действия:
- Настройка rate limiting
- Блокировка IP-диапазонов
- Включение WAF-правил
- Масштабирование сервиса в Kubernetes
- Кэширование популярных эндпоинтов
Этап 4: Восстановление работы
- Команда выбирает действия и получает обратную связь.
- Преподаватель моделирует реакцию системы.
Этап 5: Дебрифинг и выводы
- Разбор действий: что помогло, что не сработало.
- Обсуждение практик защиты API, автоматизации и реагирования на инциденты.
Обучающие эффекты:
- Получить опыт диагностики и реагирования на внезапный взрыв нагрузки.
- Научиться различать настоящую DDoS-атаку от обычного пика трафика.
- Практически применить знания о rate limiting, WAF, CDN, масштабировании, мониторинге.
- Развить soft skills: принятие решений под давлением, координация, управление инцидентом.
Возможные проблемы и вызовы во время игры:
- Недостаточно данных для анализа — участники должны уметь запрашивать нужную информацию.
- Выбор неправильного пути — например, попытка scale up без блокировки источника нагрузки.
- Нехватка времени — имитируется реальное давление, когда нужно действовать быстро.
- Конфликты в команде — хорошая возможность потренировать soft skills и лидерство.
Ролевая игра №4: "Как мы потеряли данные после миграции базы"
Цель игры:
Научить студентов правильно планировать и выполнять миграции баз данных, учитывать риски, обеспечивать безопасность данных и восстанавливать информацию в случае сбоя.
Формат игры:
- Тип: Симуляция критической ситуации при работе с БД.
- Продолжительность: 2–3 академических часа.
- Формат: Оффлайн или онлайн (в Zoom/MS Teams).
- Команды: По 4–6 человек.
- Механика: Имитация ошибочной миграции + последующее восстановление данных.
Сеттинг:
Вы — команда backend-разработчиков и DevOps-инженеров стартапа, занимающегося онлайн-образованием.
Сегодня ночью была выполнена запланированная миграция PostgreSQL:
После применения миграции часть пользовательских данных о курсах и прогрессе обучения исчезла.
Восстановление из бэкапа невозможно — последний успешный дамп был сделан неделю назад.
Вам предстоит разобраться, что пошло не так, восстановить как можно больше данных и предотвратить подобные инциденты в будущем.
Роли в команде:
-
Tech Lead / DB Architect
Отвечает за общий подход к восстановлению, принимает решения по данным. -
Backend Developer (Python / FastAPI)
Проверяет логи миграций, ORM-код, работу с БД, возможные ошибки в запросах. -
Database Engineer / DBA
Изучает структуру таблиц, индексы, триггеры, журналы PostgreSQL, возможно — WAL. -
DevOps Engineer
Проверяет CI/CD, автоматизацию миграций, настройки backup’ов, доступность snapshot’ов. -
QA / SRE
Анализирует логи, проверяет тестовые окружения, помогает воспроизводить ситуацию.
Этапы игры:
Этап 1: Инцидент объявлен
- Команда получает описание проблемы.
- Предоставляются: логи миграции, скриншоты из pgAdmin, фрагменты кода Alembic, метрики нагрузки.
Этап 2: Диагностика
- Участники анализируют:
- Логи PostgreSQL
- Миграционные скрипты
- Дампы, если доступны
- Структуру БД до и после
Этап 3: Выдвижение гипотез
- Возможные причины:
- Ошибка в миграции (например, DELETE вместо ALTER)
- Неправильное применение downgrade
- Отсутствие бэкапа перед миграцией
- Нарушение ссылочной целостности
- Неправильное использование транзакций
Этап 4: Попытки восстановления
- Возможные действия:
- Восстановление из логов WAL
- Поиск временных файлов dump'а
- Использование point-in-time recovery
- Восстановление через shadow таблицы или логирование
- Rollback миграции и работа с данными
Этап 5: Дебрифинг и выводы
- Разбор действий: что удалось восстановить, а что нет.
- Обсуждение best practices по работе с миграциями, бэкапами и тестированию изменений в БД.
Обучающие эффекты:
- Научиться работать с миграциями ответственно и осознанно.
- Получить опыт диагностики и восстановления данных после ошибок в БД.
- Практически применить знания о WAL, point-in-time recovery, бэкапах, транзакциях.
- Понять важность тестирования миграций и наличия актуальных резервных копий.
Возможные проблемы и вызовы во время игры:
- Недостаточно информации для анализа — участники должны задавать вопросы.
- Ошибка в понимании миграции — приводит к выбору неверного пути восстановления.
- Отсутствие бэкапов — показывает важность регулярного резервного копирования.
- Время на принятие решений — имитируется давление реального времени.
1. Путь обучения: от основ до профессионала
Ветки:
-
Начальный уровень
- Основы Python
- Синтаксис, типы данных, условные конструкции
- Работа с файлами и исключениями
- Функции, модули, пакеты
- Введение в ООП
- Классы, наследование, инкапсуляция
- Магические методы
- Работа с API
- HTTP-методы, коды ответов
- JSON / XML
- Основы Python
-
Промежуточный уровень
- Работа с базами данных
- SQL, PostgreSQL
- ORM (SQLAlchemy, Django ORM)
- Асинхронный доступ к БД (asyncpg, Tortoise ORM)
- Web-фреймворки
- Flask, FastAPI, Django
- REST API, маршруты, middleware
- Тестирование
- Unit-тесты (pytest)
- Интеграционное тестирование
- Mocking, fixtures
- Работа с базами данных
-
Профессиональный уровень
- Архитектура backend-систем
- REST vs GraphQL
- Микросервисная архитектура
- DDD, CQRS, Event Sourcing
- Производительность и масштабируемость
- Асинхронное программирование (asyncio)
- Background задачи (Celery, RQ)
- Кэширование (Redis, Memcached)
- Инфраструктура и DevOps
- Docker, Kubernetes
- CI/CD (GitLab CI, GitHub Actions)
- Логирование и мониторинг (Prometheus, Grafana, ELK)
- Безопасность
- JWT, OAuth2, API ключи
- Rate limiting, шифрование
- Защита от XSS, CSRF, SQLi
- Архитектура backend-систем
2. Система компонентов backend-приложения
Ветки:
-
Клиентская часть
- Фронтенд (React, Vue)
- Мобильное приложение
- Внешние сервисы (third-party API)
-
Сеть и протоколы
- HTTP/HTTPS
- TCP/IP
- WebSocket
-
Backend
- Web-фреймворки
- FastAPI, Flask, Django
- Обработка запросов
- Роутинг, сериализация, валидация
- Бизнес-логика
- Сервисы, менеджеры, use cases
- Авторизация и аутентификация
- JWT, OAuth2, Session Auth
- Web-фреймворки
-
Хранилища данных
- Реляционные БД (PostgreSQL)
- NoSQL (MongoDB, Redis)
- Message brokers (RabbitMQ, Kafka)
-
Инфраструктура
- Docker, Docker Compose
- Kubernetes
- Load balancer (Nginx)
- CI/CD pipeline
-
Мониторинг и логирование
- Prometheus + Grafana
- ELK Stack
- Sentry / Datadog
3. Инфраструктурная карта backend-разработчика
Ветки:
-
Разработка
- IDE / редактор (PyCharm, VS Code)
- Версионный контроль (Git)
- Управление зависимостями (Poetry, pip-tools)
-
Тестирование
- Unit-тесты
- Интеграционные тесты
- E2E-тесты
- Тестирование производительности
-
Деплой
- Локальное окружение
- Тестовое окружение
- Продакшен окружение
- Автоматизация деплоя
-
Контейнеризация
- Dockerfile
- Docker Compose
- Multi-stage сборка
-
Оркестрация
- Kubernetes
- Pod, Deployment, Service
- Ingress, ConfigMap, Secret
- Helm чарты
- Kubernetes
-
CI/CD
- GitLab CI / GitHub Actions
- Автоматическое тестирование
- Автоматический деплой
- Rollback и Canary release
4. Карта безопасности backend-сервиса
Ветки:
-
Аутентификация
- JWT
- OAuth2
- Session-based auth
-
Авторизация
- RBAC (Role-Based Access Control)
- ABAC
- API ключи
-
Защита данных
- Шифрование (TLS, HTTPS)
- Хэширование паролей (bcrypt, Argon2)
- Data masking
-
Защита от атак
- Rate limiting
- WAF (Web Application Firewall)
- Защита от SQL injection
- Защита от XSS и CSRF
-
Логирование и аудит
- Логирование входов
- Логирование ошибок
- Аудит изменений
-
Безопасность на уровне инфраструктуры
- Network policies
- Secrets management (Vault, Kubernetes Secrets)
- Secure defaults (hardening)
1. "Fluent Python: Clear, Concise, and Effective Programming" — Luciano Ramalho
- Уровень: Средний / профессиональный
- Охватывает: Асинхронность, функциональное программирование, метапрограммирование, работа с типами.
- Полезно для: Понимания глубинных возможностей Python, особенно в backend-разработке.
2. "Designing Data-Intensive Applications" — Martin Kleppmann
- Уровень: Профессиональный
- Охватывает: Архитектура распределённых систем, базы данных, очереди, согласованность, отказоустойчивость.
- Полезно для: Изучения принципов построения масштабируемых backend-систем.
3. "Domain-Driven Design: Tackling Complexity in the Heart of Software" — Eric Evans
- Уровень: Профессиональный
- Охватывает: DDD, Bounded Contexts, Aggregate Roots, Value Objects.
- Полезно для: Построения сложных архитектур и бизнес-логики в backend-приложениях.
4. "Python для сетевых взаимодействий и бэкенда" — Алексей Нестеров (авторский учебник, адаптированный под курс)
- Уровень: Средний / профессиональный
- Охватывает: Работа с FastAPI, асинхронное программирование, REST API, GraphQL, микросервисы, интеграция с БД.
- Полезно для: Системного изучения backend-разработки на Python с практической направленностью.
5. Методические рекомендации: "Практикум по разработке backend-приложений на Python"
- Формат: Учебное пособие с задачами и кейсами
- Содержание:
- Задачи по созданию API
- Упражнения по работе с Docker, Kubernetes
- Кейсы по проектированию микросервисов
- Примеры тестирования и CI/CD
- Лабораторные работы по безопасности и производительности
-
Python Бэкенд: от основ до Middle+
Полный путь от новичка до профессионала с практикой. -
FastAPI: производственные API на Python
Разработка, тестирование и деплой REST и GraphQL API. -
Микросервисы на Python
Построение отказоустойчивых распределённых систем. -
Профессиональная backend-разработка на Python
Архитектура, DDD, мониторинг, безопасность. -
Высоконагруженные системы на Python
Асинхронность, кэширование, шардинг, масштабирование. -
Docker и Kubernetes в backend-разработке
Контейнеризация, оркестрация, CI/CD. -
Асинхронная разработка на Python
asyncio, asyncpg, aiohttp, background задачи. -
Backend Engineering: Python Middle+ уровень
Глубокое погружение в production-ready backend. -
Разработка backend-сервисов с нуля
От идеи до готового продукта с использованием Python. -
CI/CD для Python backend-разработчиков
Автоматизация тестирования, сборки и деплоя. -
Безопасность backend-приложений на Python
JWT, OAuth2, rate limiting, защита от атак. -
Тестирование Python backend-приложений
Unit, интеграционное, E2E-тестирование. -
PostgreSQL и NoSQL в backend на Python
Работа с реляционными и документными базами данных. -
Message Brokers в Python-микросервисах
RabbitMQ, Kafka, очереди, event-driven архитектура. -
Оркестрация контейнеров: Kubernetes и Python
Управление микросервисами в продакшене. -
Логирование и мониторинг в Python backend
ELK, Prometheus, Grafana, Sentry. -
Паттерны проектирования в Python backend
SOLID, DDD, CQRS, Repository, Strategy. -
Создание API на FastAPI
Профессиональная разработка и документирование API. -
Распределённые транзакции в Python
Saga, Event Sourcing, eventual consistency. -
Оптимизация производительности Python backend
Профилирование, caching, асинхронность, индексы. -
DevOps для Python backend-разработчиков
Интеграция с DevOps-процессами, GitLab CI, GitHub Actions. -
REST и GraphQL API: углублённое изучение
Проектирование и реализация эффективных API. -
Автоматизация backend-процессов на Python
Background задачи, Celery, RQ, очереди. -
Domain-Driven Design на Python
Реализация сложной бизнес-логики через DDD. -
Production-готовый Python backend
Все практики для запуска и поддержки сервисов в продакшене.
Нет элементов для просмотра