Кооперативне скасування
Server 2.5.0 додає кооперативне скасування через протокол 1.20. Потрібні worker, що явно вмикають цю можливість. Перед використанням перевірте виявлення runtime та підтримку можливості SDK.
Запит очищення
Використовуйте requestCancellation() у PHP SDK, request_cancellation()
у Python чи Rust або маршрут Server request-cancellation. Run залишається
активним, поки код workflow обробляє запит і виконує очищення. Успішне
очищення завершує run зі статусом Cancelled.
POST /api/workflows/{workflowId}/runs/{runId}/request-cancellation
X-Durable-Workflow-Control-Plane-Version: 2
Authorization: Bearer <operator-token>
X-Namespace: <namespace>
Content-Type: application/json
{"reason":"Order withdrawn","cleanup_timeout_seconds":30}
Обраний run має залишатися поточним. Перший прийнятий запит повертає HTTP 202. Повторний повертає HTTP 200 з початковою ідентичністю запиту й дедлайном. Зміна тайм-ауту в повторному запиті не продовжує бюджет очищення.
Незмінний контекст скасування містить ID запиту й кореня, причину,
ініціатора, джерело, початковий час запиту, дедлайн і впорядковану лінію
походження. Код workflow отримує його на записаній межі доставки.
Раніше завершені виклики відтворюються звичайним replay. Детерміновані
помічники deadline() і remaining() дозволяють очищенню ухвалювати
ті самі рішення після перезапуску.
Наявний cancel() негайно закриває run і не відновлює очищення workflow.
terminate() також закриває його негайно з результатом Terminated.
Оберіть політики операцій
| Політика | Дочірній workflow | Віддалена activity | Локальна activity |
|---|---|---|---|
| TryCancel | Запросити очищення дочірнього workflow і продовжити очищення батьківського | Запросити зупинку callback і продовжити очищення workflow | Зупинити callback під наглядом і продовжити очищення |
| WaitCancellationCompleted | Дочекатися записаного термінального результату дочірнього workflow | Дочекатися стійкого підтвердження зупинки початкового callback | Приєднатися до стійкого підтвердження зупинки початкового callback |
| Abandon | Залишити дочірній workflow незалежним | Залишити activity незалежною в межах її початкового скінченного загального тайм-ауту | Відхиляється до допуску |
Закриття батьківського workflow має окрему політику. RequestCancellation
надсилає кооперативний запит із початковою лінією походження скасування
та обмеженим дедлайном. RequestCancel зберігає стару поведінку негайного
скасування.
Кожен дочірній workflow із підтримкою кооперації успадковує кореневу ідентичність запиту й бюджет очищення. Він може отримати коротший дедлайн, але не збільшити бюджет. Покинута операція має незалежний час життя та не входить до спільного очікування очищення.
Нагляд і відновлення
Кооперативні worker спостерігають скасування незалежно від heartbeat activity застосунку. PHP використовує процеси callback під наглядом. Python здійснює нагляд за async і синхронними callback. Rust здійснює нагляд за async futures callback. Від’єднана робота та зовнішні служби потребують власної поведінки скасування й ідемпотентності.
Очищення може використати захист від скасування для стійких activity, timer і викликів дочірніх workflow. Захист зберігає початковий дедлайн. Якщо worker гине, заміна відтворює ту саму межу доставки та завершені виклики очищення перед продовженням. Спливання дедлайну чи припинення відкликає решту повноважень виконання.
Стара спроба activity не може опублікувати результат після відсікання. Уже прийняті зовнішні побічні ефекти все одно потребують ідемпотентності або звіряння на рівні застосунку.
Перегляд каскаду
Діагностика run містить cancellation_cascade із кореневим запитом,
run-учасниками, спробами activity, політиками, підтвердженнями зупинки,
дедлайнами й результатами очищення. CLI та Waterline показують те саме.
Життєвий цикл розрізняє requested, delivered, cleaning_up, cancelled,
deadline_expired і terminated. Неповне подання вказує, що не вдалося
перевірити, замість трактувати відсутнє підтвердження як доказ успіху.
Запит для несумісного активного worker claim повертає явну відмову можливості без запису часткового скасування. Оновлення реєстрації не оновлює вже виданий claim.
Межі випуску
Запити для всього run, політики дочірніх workflow та activity, обмежене захищене очищення, відновлення й перегляд каскаду складають підтримуваний випуск. Незалежно скасовувані області операцій залишаються вимкненим попереднім варіантом у вихідному коді та позначені experimental у довіднику протоколу.
Точні форми запитів, підтверджень і можливостей наведені в специфікації протоколу worker. Мовні посібники написання workflow розміщені на сайтах SDK PHP, Python і Rust.