Prořezávání stavu
Jak workflow prochází mnoha kroky, nahromaděný stav může výrazně narůst. Automatické prořezávání stavu odstraňuje výstupy starých kroků, aby stav JSON zůstal omezený a přitom zachoval důležitá data.
Zapnutí prořezávání stavu
Zavolejte prune_state_after() na builderu workflow. Argument určuje počet posledních kroků, jejichž výstup se má zachovat:
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 ] );
Při prune_state_after( 2 ) se po dokončení kroku D odstraní ze stavu výstupy kroků A a B. Kroky C a D (dva nejnovější) zůstanou zachovány.
Jak prořezávání funguje
Když je prořezávání stavu zapnuté, Queuety sleduje, které klíče každý krok přidá do stavu, a ukládá je do vyhrazeného pole _step_outputs. Po přechodu na nový krok se odstraní klíče přidané kroky staršími, než určuje limit.
Například při 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
Co zůstává zachováno
Queuety nikdy neprořezává vyhrazené klíče začínající na _, například _steps, _queue, _priority, _max_attempts, _on_cancel, _prune_state_after a _step_outputs. Zachovají se také klíče počátečních dat předaných do dispatch(), protože se od začátku nesledují jako výstupy kroků. Kromě toho Queuety ponechá N nejnovějších výstupů kroků podle nastaveného limitu.
Kdy jej použít
Prořezávání stavu je užitečné u workflow s mnoha kroky, kde každý krok vytváří data, která pozdější kroky ve skutečnosti nepotřebují. Typickými příklady jsou dlouhé pipeline, v nichž každý krok potřebuje jen jeden nebo dva předchozí výstupy, ETL workflow vytvářející objemné mezistruktury a rekurzivní nebo opakující se workflow, která by jinak hromadila opakující se stav. Pokud má vaše workflow jen několik kroků nebo pozdější kroky stále závisí na výstupech z počátku, prořezávání nejspíš vůbec nepotřebujete.
Výchozí chování
Prořezávání stavu je ve výchozím nastavení vypnuté. Metoda prune_state_after() přijímá celočíselný argument. Pokud ji zavoláte bez argumentu, použije se výchozí hodnota 2:
->prune_state_after() // keeps the 2 most recent step outputs
->prune_state_after( 5 ) // keeps the 5 most recent step outputs