Przycinanie stanu
W miarę przechodzenia przepływu pracy przez wiele kroków zgromadzony stan może znacznie urosnąć. Przycinanie stanu automatycznie usuwa wyniki starszych kroków, aby JSON ograniczyć rozmiar stanu i zachować ważne dane.
Włączanie przycinania stanu
Wywołaj prune_state_after() w konstruktorze przepływu pracy. Argument określa liczbę ostatnich kroków, których wyniki mają zostać zachowane:
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 ] );
Po użyciu prune_state_after( 2 ), gdy krok D zostanie ukończony, wyniki kroków A i B zostaną usunięte ze stanu. Kroki C i D (dwa najnowsze) zostaną zachowane.
Jak działa przycinanie
Gdy przycinanie stanu jest włączone, Queuety śledzi klucze dodawane przez poszczególne kroki w zarezerwowanej tablicy _step_outputs. Po przejściu do nowego kroku usuwa klucze wprowadzone przez kroki starsze niż ustawiony próg.
Na przykład przy użyciu 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 zostaje zachowane
Queuety nigdy nie przycina zarezerwowanych kluczy zaczynających się od _, takich jak _steps, _queue, _priority, _max_attempts, _on_cancel, _prune_state_after i _step_outputs. Zachowywane są również początkowe klucze ładunku przekazane do dispatch(), ponieważ od początku nie są śledzone jako wyniki kroków. Ponadto Queuety zachowuje N najnowszych wyników kroków, zgodnie z ustawionym progiem.
Kiedy używać
Przycinanie stanu przydaje się w przepływach pracy z wieloma krokami, w których każdy krok tworzy dane, których późniejsze kroki faktycznie nie potrzebują. Typowe przykłady to długie potoki, w których każdy krok potrzebuje tylko jednego lub dwóch poprzednich wyników, przepływy ETL tworzące duże struktury pośrednie oraz przepływy rekurencyjne lub powtarzające się, które w przeciwnym razie gromadziłyby powielające się dane stanu. Jeśli przepływ pracy składa się tylko z kilku kroków lub późniejsze kroki nadal zależą od wcześniejszych wyników, prawdopodobnie w ogóle nie potrzebujesz przycinania.
Domyślne działanie
Przycinanie stanu jest domyślnie wyłączone. Metoda prune_state_after() przyjmuje argument będący liczbą całkowitą. Wywołanie jej bez argumentu ustawia domyślną wartość 2:
->prune_state_after() // keeps the 2 most recent step outputs
->prune_state_after( 5 ) // keeps the 5 most recent step outputs