$ sudo teach IT

Урок №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. Как проходить итоговое испытание

  1. Внимательно изучите условия задачи.
  2. До написания кода продумайте алгоритм.
  3. Реализуйте решение самостоятельно.
  4. Запустите мини-тесты и проанализируйте ошибки.
  5. Отправьте решение на полную проверку.
  6. Проверьте, можете ли объяснить каждое техническое решение.
Важно: границы проверки

Python-задание моделирует правила формирования пачки. Оно не выполняет настоящие транзакции PostgreSQL и не проверяет реальные блокировки строк. Эти механизмы рассматриваются отдельно в инженерной части итогового урока.

5. Что означает успешное прохождение?

К концу итогового испытания вы должны уметь:

  • самостоятельно реализовать корректный алгоритм резервирования пачки;
  • обрабатывать пограничные случаи без дублирования задач;
  • объяснять конкурентное поведение нескольких воркеров;
  • различать резервирование и фактическую обработку задачи;
  • описывать последствия сбоев и возможные способы восстановления;
  • аргументировать ограничения выбранного решения.

Главный результат этого модуля — способность самостоятельно анализировать и решать задачи конкурентной обработки в Python Backend.


Готовы применить знания?

Перейдите во вкладку «Задачи» и приступайте к самостоятельному решению.