Урок №9. Production Challenge: надёжная обработка фоновых задач
Вы прошли восемь уроков, в которых исследовали конкурентную обработку задач, транзакции PostgreSQL, блокировки, восстановление после сбоев, идемпотентность и приоритетные очереди.
Теперь предстоит объединить эти знания и применить их к инженерной задаче.
Не просто получить работающий код, а уметь объяснить его поведение, обосновать технические решения и определить ограничения системы.
1. Производственная ситуация
Представьте, что вы разрабатываете backend-сервис для формирования документов.
Клиенты отправляют запросы, а несколько Python-воркеров обрабатывают их в фоновом режиме. Информация о задачах хранится в PostgreSQL.
В системе существуют три категории задач:
- HIGH — срочные задачи;
- MEDIUM — задачи обычного приоритета;
- LOW — задачи, допускающие более длительное ожидание.
Требования постепенно усложнялись:
- несколько воркеров должны безопасно резервировать задачи;
- падение воркера не должно оставлять задачу навсегда зависшей;
- повторные вызовы внешнего API не должны приводить к нежелательным дубликатам;
- задачи нужно распределять по приоритетам;
- воркеры должны уметь резервировать пачки с квотами.
В предыдущих уроках вы по отдельности изучили механизмы для выполнения этих требований. Теперь проверим, можете ли вы применять их самостоятельно.
2. Первая часть — самостоятельное программирование
Во вкладке «Задачи» вас ждёт Python-задание с автоматической проверкой.
Необходимо реализовать функцию формирования пачки задач с учётом:
- приоритетов HIGH, MEDIUM и LOW;
- квот на количество задач;
- недоступных задач;
- времени создания задач;
- механизма fallback;
- максимального размера пачки.
Вы получите описание входных данных и заготовку функции. Сам алгоритм потребуется написать самостоятельно.
Для проверки используются мини-тесты и полные тесты. Мини-тесты помогают проверить основное поведение, а полные тесты дополнительно проверяют пограничные случаи.
3. Вторая часть — инженерное мышление
Корректный алгоритм выбора задач — только часть надёжной системы.
После программирования мы вернёмся к механизмам PostgreSQL и рассмотрим:
- что гарантирует FOR UPDATE SKIP LOCKED;
- где должна завершаться транзакция резервирования;
- что произойдёт при ROLLBACK;
- что произойдёт, если воркер упадёт после COMMIT;
- почему lease и idempotency решают разные проблемы;
- какие гарантии квоты не обеспечивают.
Здесь важно не запомнить правильную формулировку, а уметь построить причинно-следственное объяснение.
4. Как проходить итоговое испытание
- Внимательно изучите условия задачи.
- До написания кода продумайте алгоритм.
- Реализуйте решение самостоятельно.
- Запустите мини-тесты и проанализируйте ошибки.
- Отправьте решение на полную проверку.
- Проверьте, можете ли объяснить каждое техническое решение.
Python-задание моделирует правила формирования пачки. Оно не выполняет настоящие транзакции PostgreSQL и не проверяет реальные блокировки строк. Эти механизмы рассматриваются отдельно в инженерной части итогового урока.
5. Что означает успешное прохождение?
К концу итогового испытания вы должны уметь:
- самостоятельно реализовать корректный алгоритм резервирования пачки;
- обрабатывать пограничные случаи без дублирования задач;
- объяснять конкурентное поведение нескольких воркеров;
- различать резервирование и фактическую обработку задачи;
- описывать последствия сбоев и возможные способы восстановления;
- аргументировать ограничения выбранного решения.
Главный результат этого модуля — способность самостоятельно анализировать и решать задачи конкурентной обработки в Python Backend.
Готовы применить знания?
Перейдите во вкладку «Задачи» и приступайте к самостоятельному решению.