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

Continue As New

Шаблон Continue As New дає активному workflow змогу перезапустити себе з новими аргументами. Він корисний, коли потрібно:

  • Запобігти необмеженому зростанню історії workflow.
  • Моделювати цикли або рекурсивні workflow.
  • Розділити тривалі workflow на менші керовані виконання зі збереженням безперервності.

Використання continueAsNew​

Щоб почати workflow як новий запуск, викличте допоміжну функцію continueAsNew(...) усередині методу handle() workflow. continueAsNew() є повноцінним переходом між запусками.

use function Workflow\V2\activity;
use function Workflow\V2\continueAsNew;
use Workflow\V2\Workflow;

class CounterWorkflow extends Workflow
{
public function handle(int $count = 0, int $max = 3)
{
$result = activity(CountActivity::class, $count);

if ($count >= $max) {
return [
'count' => $result,
'workflow_id' => $this->workflowId(),
'run_id' => $this->runId(),
];
}

return continueAsNew($count + 1, $max);
}
}

У цьому прикладі:

  • Workflow виконує activity на кожній ітерації.
  • Якщо максимального лічильника ще не досягнуто, він продовжується новим запуском зі збільшеними аргументами.
  • Остаточний результат повертається лише після завершення циклу.

Під час continue-as-new:

  • ID екземпляра залишається сталим у всьому ланцюжку, а WorkflowStub::runId() переходить до найновішого запуску.
  • Продовжений запуск закривається як completed / continued, а наступний одразу починається з новим ID запуску.
  • Signal, query, update та команди оператора завжди знаходять найновіший стійкий запуск цього екземпляра. Код, який їх викликає, не має відстежувати ID запусків на межах continue-as-new.

Тривалі цикли можуть звільнятися від накопиченої історії без створення нового публічного ID workflow за кожного переходу запуску.

Бюджет історії​

Код workflow може перевіряти поточну довжину історії та прапорець рекомендації continue-as-new через явний контекст runtime. Це дає тривалим циклам змогу свідомо передавати виконання до досягнення граничного бюджету історії.

use function Workflow\V2\activity;
use function Workflow\V2\continueAsNew;
use Workflow\V2\Workflow;

class PollingWorkflow extends Workflow
{
public function handle(int $iteration = 0)
{
$result = activity(PollActivity::class);

if ($this->shouldContinueAsNew()) {
return continueAsNew($iteration + 1);
}

return ['result' => $result, 'iteration' => $iteration];
}
}

Доступні методи​

МетодТип результатуОпис
$this->historyLength()intКількість подій історії поточного запуску
$this->historySize()intЗагальний розмір подій історії в байтах
$this->shouldContinueAsNew()booltrue, коли запуск перевищує налаштований бюджет кількості подій або розміру в байтах

Налаштування​

Пороги рекомендації continue-as-new можна налаштувати:

// config/workflows.php
'v2' => [
'history_budget' => [
'continue_as_new_event_threshold' => 10000,
'continue_as_new_size_bytes_threshold' => 5242880, // 5 MB
],
],

shouldContinueAsNew() повертає true після перетину будь-якого порога. Стислі представлення запусків також відстежують history_event_count, history_size_bytes та continue_as_new_recommended, щоб Waterline міг позначати тривалі запуски в загальних представленнях.

Перенесення метаданих​

Під час continue-as-new новий запуск автоматично успадковує метадані попереднього:

МетаданіПравила перенесення
Атрибути пошукуПереноситься повна об’єднана мапа, включно з оновленнями під час запуску
MemoПереноситься повна об’єднана мапа, включно з оновленнями під час запуску
Позначки видимостіПереносяться без змін, задаються один раз на початку
Бізнес-ключПереноситься без змін
Маркер сумісностіПереноситься, щоб новий запуск призначався тій самій збірці worker
Позиція курсора повідомленьПереноситься, щоб новий запуск знав, які вхідні повідомлення вже спожито через Потоки повідомлень

Новий запуск починається з успадкованих метаданих і може продовжувати оновлення атрибутів пошуку й memo. Тому тривалий workflow опитування може накопичувати метадані між поколіннями, не втрачаючи стан під час звільнення від історії.

use function Workflow\V2\{activity, continueAsNew, upsertMemo, upsertSearchAttributes};
use Workflow\V2\Workflow;

class PollingWorkflow extends Workflow
{
public function handle(int $iteration = 0)
{
$result = activity(PollActivity::class);

upsertSearchAttributes(['iteration' => (string) $iteration, 'status' => 'polling']);
upsertMemo(['last_result' => $result, 'iteration' => $iteration]);

if ($this->shouldContinueAsNew()) {
// The new run inherits all search attributes and memo
return continueAsNew($iteration + 1);
}

return ['result' => $result, 'iteration' => $iteration];
}
}

Для тривалих циклів введення користувачем або роботи асистента обирайте повноцінний фасад $this->inbox() / $this->outbox() Потоків повідомлень. Очікувані повідомлення потоку й позиція курсора переходять до продовженого запуску, а спожиті повідомлення залишаються в початковому запуску як свідчення історії.