Перейти до основного вмісту
Версія: 2.0

Обмеження workflow

Вимога детермінованості класів workflow означає, що клас workflow не має залежати від зовнішнього стану чи сервісів, які можуть змінюватися з часом. Тому клас workflow не має виконувати операцій, що покладаються на поточну дату й час, поточного користувача, зовнішні мережеві ресурси або інші джерела стану, який може змінитися.

Ось приклади того, чого не слід робити всередині класу workflow:

  • Не використовуйте Carbon::now() для поточної дати й часу, бо кожен виклик може повертати інший результат. Використовуйте Workflow\V2\Workflow::now() або допоміжну функцію Workflow\V2\now(), які повертають час workflow, безпечний для відтворення.
  • Не використовуйте Auth::user() для поточного користувача, бо результат залежить від того, хто зараз увійшов у систему. Передавайте користувача як вхідні дані workflow під час запуску.
  • Не робіть мережевих запитів до зовнішніх ресурсів, бо вони можуть бути повільними або недоступними в різні моменти. Передавайте потрібні дані до workflow під час запуску або отримуйте їх через activity.
  • Не використовуйте генератори випадкових чисел чи інші джерела випадковості без побічного ефекту, бо кожен виклик дає інший результат. Передавайте потрібну випадковість як вхідні дані workflow під час запуску.

Перевірки під час запуску застосунку​

Коли класи workflow зареєстровані в workflows.v2.types.workflows, пакет під час запуску застосунку перевіряє їх на очевидні виклики, небезпечні для відтворення (Carbon::now(), Auth::user(), DB::, Http::, random_int() та подібні), і повідомляє результати відповідно до workflows.v2.guardrails.boot:

РежимПоведінка
warn (типовий)Записує попередження для кожного виявленого випадку. Не блокує запуск застосунку.
silentПовністю пропускає перевірку під час запуску.
throwВикидає LogicException на першому виявленому випадку. Корисно для CI.
// config/workflows.php
'v2' => [
'guardrails' => [
'boot' => env('DW_V2_GUARDRAILS_BOOT', 'warn'),
],
],

Задайте DW_V2_GUARDRAILS_BOOT=throw у CI, щоб нові небезпечні для відтворення виклики спричиняли невдачу збірки. У production залишайте warn, щоб прихований випадок не блокував розгортання.

У межах першого випуску перевірка під час запуску — єдиний блокувальний захист режиму workflow. Середовище виконання не повторює діагностику детермінованості під час отримання завдання workflow. Для 2.0 це свідоме відкладення: перевірка під час запуску виявляє проблеми локально зареєстрованих PHP workflow до розгортання, а Waterline показує зміну відбитка визначення для тривалих запусків, не перетворюючи отримання завдань між збірками на нове джерело збоїв розгортання.

Запуски без знімка відбитка також дотримуються обережної політики першого випуску. Якщо запуск доходить до нової гілки getVersion(), а його історія WorkflowStarted передує знімку відбитка, середовище залишає його на WorkflowStub::DEFAULT_VERSION замість припущення, що поточне визначення безпечне. Дивіться версіонування.