Перейти к содержимому

Очистка состояния

По мере прохождения рабочих последовательностей через множество шагов накопленное состояние может сильно разрастись. Очистка состояния автоматически удаляет результаты старых шагов, сохраняя состояние в разумных пределах JSON и оставляя важные данные.

Включение очистки состояния

Вызовите prune_state_after() у построителя рабочей последовательности. Аргумент задает количество последних шагов, результаты которых следует сохранить:

PHP
use Queuety\Queuety;

Queuety::workflow( 'long_pipeline' )
    ->then( StepA::class )
    ->then( StepB::class )
    ->then( StepC::class )
    ->then( StepD::class )
    ->then( StepE::class )
    ->prune_state_after( 2 )
    ->dispatch( [ 'input' => $data ] );

При prune_state_after( 2 ) после завершения шага D из состояния удаляются результаты шагов A и B. Шаги C и D — два последних — сохраняются.

Как работает очистка

Когда очистка состояния включена, Queuety отслеживает, какие ключи каждый шаг добавляет в состояние, в зарезервированном массиве _step_outputs. После перехода к новому шагу удаляются ключи, добавленные шагами, вышедшими за установленный порог давности.

Например, при prune_state_after( 2 ):

Код
After step 0 (StepA): state has keys from StepA + initial payload
After step 1 (StepB): state has keys from StepA + StepB + initial payload
After step 2 (StepC): state has keys from StepA + StepB + StepC + initial payload
  -> prune: StepA output removed (only 2 most recent kept)
After step 3 (StepD): state has keys from StepB + StepC + StepD + initial payload
  -> prune: StepB output removed

Что сохраняется

Queuety никогда не удаляет зарезервированные ключи, начинающиеся с _, например _steps, _queue, _priority, _max_attempts, _on_cancel, _prune_state_after и _step_outputs. Исходные ключи данных, переданные в dispatch(), также сохраняются, поскольку изначально не отслеживаются как результаты шагов. Кроме того, Queuety сохраняет N результатов последних шагов в соответствии с заданным порогом.

Когда использовать

Очистка состояния полезна для рабочих последовательностей со множеством шагов, где каждый шаг создает данные, которые на самом деле не нужны последующим шагам. Типичные примеры — длинные цепочки обработки, где каждому шагу нужны результаты только одного или двух предыдущих, рабочие последовательности ETL, создающие объемные промежуточные структуры, а также рекурсивные или повторяющиеся рабочие последовательности, в которых иначе накапливалось бы избыточное состояние. Если в вашей рабочей последовательности всего несколько шагов или поздние шаги зависят от результатов ранних, очистка, скорее всего, не нужна.

Поведение по умолчанию

По умолчанию очистка состояния выключена. Метод prune_state_after() принимает целочисленный аргумент. Если вызвать его без аргумента, по умолчанию используется значение 2:

PHP
->prune_state_after()     // keeps the 2 most recent step outputs
->prune_state_after( 5 )  // keeps the 5 most recent step outputs