Přejít k obsahu

Ochranná opatření workflow

Workflow inspirovaná agenty jsou flexibilní, ale také usnadňují vytváření duplicitních běhů nebo umožňují plánovači zadat víc práce, než bylo zamýšleno. Queuety poskytuje lehká ochranná opatření na úrovni workflow, díky kterým si zachováte flexibilitu i kontrolu.

Další informace o širším modelu prostředků pro přijímání úloh workery a metadata nákladů jednotlivých úloh najdete v části Správa prostředků.

Verze definice workflow

Pomocí version() přiřaďte definici workflow štítek verze na úrovni aplikace:

PHP
Queuety::workflow( 'research_run' )
    ->version( 'research.v2' )
    ->then( PlanResearchStep::class )
    ->then( DraftResearchSummaryStep::class )
    ->dispatch();

Verze se ukládá spolu se stavem workflow, zpřístupňuje se prostřednictvím workflow_status(), vypisuje ji wp queuety workflow status a je součástí exportů workflow.

Queuety také ukládá deterministický definition_hash pro každý běh workflow. Haš se odvozuje ze serializované definice workflow a hodí se, když po nasazení potřebujete zjistit přesnou podobu workflow, kterou právě provádí běžící workflow.

Idempotentní spouštění

Použijte idempotency_key(), když volající mohou opakovat tentýž požadavek:

PHP
Queuety::workflow( 'research_run' )
    ->idempotency_key( 'brief:42:research' )
    ->then( PlanResearchStep::class )
    ->dispatch( [ 'brief_id' => 42 ] );

Pokud workflow spustíte znovu s již použitým klíčem, Queuety vrátí původní ID workflow a nevytvoří duplicitní běh. Klíče jsou společné pro všechny názvy workflow, proto do klíče zahrňte název workflow, pokud by ho mohla sdílet různá workflow.

Hodí se to zejména pro:

  • koncové body API, které klienti nebo brány mohou volat opakovaně
  • konzumenty webhooků, kteří mohou obdržet duplicitní doručení
  • kroky plánovače, které mají vytvořit pouze jeden běh orchestrace pro každou externí entitu

Idempotentní klíče se ukládají v tabulce queuety_workflow_dispatch_keys.

Nastavení rozpočtů workflow

Pomocí rozpočtů workflow můžete ukončit běhy, které překročí plánované limity:

PHP
Queuety::workflow( 'research_run' )
    ->max_transitions( 20 )
    ->max_for_each_items( 12 )
    ->max_state_bytes( 32768 )
    ->max_cost_units( 40 )
    ->max_started_workflows( 8 )
    ->then( PlanResearchStep::class )
    ->for_each( 'tasks', ExecuteResearchTask::class, 'results' )
    ->dispatch();

max_transitions()

Omezuje počet kroků workflow, které se mohou dokončit, než běh selže. Hodí se k ochraně workflow, která se dynamicky větví nebo se mohou vracet do stejné části pomocí _next_step.

max_for_each_items()

Omezuje počet položek zjištěných za běhu, na které se může rozbalit jeden krok for_each(). Hodí se pro systémy planner/executor, kde agent může objevit mnohem více práce ve větvích, než se zamýšlelo.

max_state_bytes()

Omezuje zakódovanou velikost veřejného stavu workflow. Pomáhá zabránit tomu, aby se dlouho běžící workflow rozrostla do velkých bloků, jejichž kontrola, export nebo opakování jsou pomalé.

max_cost_units()

Omezuje celkový počet jednotek nákladů spotřebovaných dokončenými kroky. Jednotky nákladů pocházejí z metadat kroku nebo úlohy, která Queuety načte při zařazení práce do fronty. Běžná uživatelská práce má výchozí hodnotu 1, organizační zástupné kroky, jako jsou prodlevy a čekání, používají 0 a obslužné funkce mohou nastavit vyšší kladnou hodnotu prostřednictvím config() nebo vlastností úlohy. Hodnotu 0 může nastavit pouze cost_units definice kroku.

Hodí se, když se workflow může vracet do stejné části nebo když je práce nákladná způsoby, které samotný počet kroků nezachytí. Plánovač, který opakovaně spouští nákladné volání modelu, se může vejít do limitu max_transitions(), ale přesto překročit zamýšlený nákladový rozpočet.

max_started_workflows()

Omezuje počet workflow nejvyšší úrovně, která může běh spustit prostřednictvím start_workflows() nebo start_agents(). Limit se kontroluje před spuštěním podřízených workflow, takže nadřazené workflow selže, aniž by částečně vytvořilo skupinu překračující rozpočet.

Při překročení rozpočtu Queuety workflow okamžitě ukončí chybou, místo aby opakoval krok. Výjimkou je situace, kdy Queuety::signal() vyřídí čekání a výsledný přechod překročí rozpočet: výjimka se předá volajícímu signal(), vložení signálu se vrátí zpět a workflow dál čeká.

Sledování ochranných limitů

Stav workflow zpřístupňuje:

  • definition_version
  • definition_hash
  • idempotency_key
  • budget

Údaje budget obsahují nastavené limity a aktuální využití, včetně současné velikosti veřejného stavu v bajtech.

Příklad:

PHP
$state = Queuety::workflow_status( $workflow_id );

$state->definition_version; // 'research.v2'
$state->definition_hash;    // '4c7a...'
$state->idempotency_key;    // 'brief:42:research'
$state->budget;             // [ 'max_transitions' => 20, ... ]