Как создавать детерминированные рабочие процессы с возможностью возобновления после сбоя на Python без полноценного мехаPython

Программы на Python
Ответить
Anonymous
 Как создавать детерминированные рабочие процессы с возможностью возобновления после сбоя на Python без полноценного меха

Сообщение Anonymous »

Я создаю серверную программу для выполнения рабочих процессов, где каждое задание представляет собой последовательность шагов (сочетание чистых вычислений и побочных эффектов, таких как вызовы HTTP, запись в БД, загрузка файлов). Если процесс аварийно завершает работу на середине этапа, задание должно возобновиться корректно; повторные попытки должны быть безопасными (идемпотентными); и мне нужна пошаговая наблюдаемость (количество попыток, последняя ошибка). Я не хочу использовать Temporal/Airflow/и т. д., но я также не хочу изобретать что-то неявно сломанное.
Основная проблема — представление. Если я пишу рабочие процессы как обычные функции Python, я не могу возобновить работу в середине функции. Если я моделирую все как гигантский автомат с перечислениями и if/ while, оно быстро становится нечитабельным после ветвления и повторных попыток.
Вот примерно то, что я имею в виду под тем, что я хочу, но не могу безопасно возобновить:

Код: Выделить всё

def workflow(ctx):
user = fetch_user(ctx.user_id)
if user.is_premium:
charge(user)
else:
enqueue_trial_email(user)

result = call_external_api(user)
persist_result(result)
Как только это где-то выходит из строя, я теряюсь на месте, если не кодирую состояние вручную везде.
Я экспериментировал с сохранением указателя current_step и аргументов:

Код: Выделить всё

def step_charge(ctx):
charge(ctx.user)

def step_email(ctx):
enqueue_trial_email(ctx.user)
а затем управляю им с помощью бегуна, который продвигает шаги транзакционно, но как только я добавляю ветвление, циклы или условные повторы, поток управления становится уродливым и хрупким.
Какой шаблон на самом деле работает в Python? Рассматриваете ли вы рабочие процессы как журналы шагов, доступные только для добавления, и воспроизводите ли вы их? Сохранить как указатель шага, так и историю выполнения? Структурировать каждый шаг как команду с явными входами/выходами и полагаться на ключи идемпотентности + транзакции БД? Есть ли чистый способ выразить ветвление и циклирование без создания огромного ручного конечного автомата?
Я ищу прагматичную архитектуру, которую можно отлаживать и воспроизводить по мере роста числа рабочих процессов и режимов сбоя, а не теоретический ответ, если нет конкретной причины.

Подробнее здесь: https://stackoverflow.com/questions/798 ... t-a-full-w
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»