Przejdź do treści

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:

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 ] );

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 ):

Kod
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:

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