Очистка состояния
По мере прохождения рабочих последовательностей через множество шагов накопленное состояние может сильно разрастись. Очистка состояния автоматически удаляет результаты старых шагов, сохраняя состояние в разумных пределах JSON и оставляя важные данные.
Включение очистки состояния
Вызовите prune_state_after() у построителя рабочей последовательности. Аргумент задает количество последних шагов, результаты которых следует сохранить:
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:
->prune_state_after() // keeps the 2 most recent step outputs
->prune_state_after( 5 ) // keeps the 5 most recent step outputs