Pereiti prie turinio

Įvadas

Queuety yra WordPress papildinys, kuriame veikia sparti užduočių eilė, patvarių darbo eigų variklis ir patvarių būsenų automatų vykdymo aplinka. Darbiniai procesai rezervuoja užduotis tiesiai iš MySQL ir apdoroja jas ilgai veikiančiame WP-CLI procese. Vykdymo aplinkoje PHP, kuri įkelia WordPress ir WP-CLI, reikia turėti arba mysqli, arba pdo_mysql.

Kodėl Queuety?

WordPress neturi tikros foninių užduočių sistemos. wp_cron suveikia tik apsilankius puslapyje. Pagal numatytuosius nustatymus Action Scheduler vykdytojas naudoja WP-Cron ir HTTP užklausas į tą pačią svetainę; kiekviena užklausa apdoroja paketus ne ilgiau kaip 30 sekundžių. 60 sekundžių trunkantis LLM API iškvietimas nutraukiamas dėl PHP 30 sekundžių skirtojo laiko. Neįmanoma paleisti kelių veiksmų procesų, kurie atlaikytų strigtis ir tęstų darbą nuo ten, kur buvo sustoję.

Queuety tai išsprendžia trimis pagrindiniais elementais:

  1. Užduotys foniniam darbui, kurio rezultato nereikia laukti
  2. Darbo eigos patvariems kelių veiksmų procesams su išsaugoma būsena
  3. Būsenų automatai ilgai veikiančių, įvykiais valdomų gyvavimo ciklų būsenoms

Trumpas pavyzdys

Išsiųskite užduotį naudodami šiuolaikinę API:

PHP
use Queuety\Contracts\Job;
use Queuety\Dispatchable;

readonly class SendEmailJob implements Job {
    use Dispatchable;

    public function __construct(
        public string $to,
        public string $subject,
        public string $body,
    ) {}

    public function handle(): void {
        wp_mail( $this->to, $this->subject, $this->body );
    }
}

SendEmailJob::dispatch( 'user@example.com', 'Welcome', 'Hello from Queuety!' );

Arba naudokite klasikinį būdą, nurodydami apdorojimo funkcijos pavadinimą:

PHP
use Queuety\Queuety;

Queuety::dispatch( 'send_email', [ 'to' => 'user@example.com' ] );

Paleiskite patvarią darbo eigą:

PHP
Queuety::workflow( 'generate_report' )
    ->then( FetchDataHandler::class )
    ->then( CallLLMHandler::class )
    ->then( FormatOutputHandler::class )
    ->dispatch( [ 'user_id' => 42 ] );

Modeliuokite ilgai veikiančią sesiją naudodami būsenų automatą:

PHP
use Queuety\Enums\StateMachineStatus;

Queuety::machine( 'agent_session' )
    ->state( 'awaiting_user' )
    ->on( 'user_message', 'planning' )
    ->state( 'planning' )
    ->action( PlanSessionAction::class )
    ->on( 'planned', 'completed' )
    ->state( 'completed', StateMachineStatus::Completed )
    ->dispatch( [ 'thread_id' => 42 ] );

Paleiskite darbuotoją:

Shell
wp queuety work

Jei kuriate agento tipo sistemą, pradėkite nuo Agentų orkestravimas. Čia parodyta, kaip veikia planavimo ir vykdymo srautai, žmogaus atliekamos peržiūros etapai ir laukimas tarp darbo eigų.

Jei sistema valdoma įvykiais ir veikia ilgai, kartu su darbo eigomis pradėkite nuo Būsenų automatai.

Jei reikia integracijos nuo pradžios iki galo pavyzdžių, žr. Pavyzdžiai. Juose dabar yra Neuron pagrįstų šablonų, skirtų teikėjų keitimui, srautiniam perdavimui, pakartotinei peržiūrai naudojant atmintį ir priklausomoms darbo eigoms.

Jei norite, kad darbo eigos prasidėtų nuo WordPress domeno įvykių, pavyzdžiui, save_post, žr. Veiksmų paleidikliai.

Jei norite naudoti duomenų baze pagrįstą vykdymo aplinką už WordPress ribų, žr. Naudojimas atskirai.

Pagrindiniai išskirtinumai

  • Spartus vykdymas. Darbuotojai tiesiogiai pasiekia MySQL eilę ir išvengia cron šablono kiekvienai užklausai, dėl kurio sulėtėja foninis darbas WordPress.
  • Patvarios darbo eigos. Kelių veiksmų procesai su išsaugoma būsena atlaiko PHP skirtųjų laikų pabaigą, strigtis ir pakartotinius bandymus. Kiekvieno veiksmo riba yra atskira MySQL operacija.
  • Aiškūs būsenų automatai. Modeliuokite pokalbių sesijas, patvirtinimus ir kitus ilgai trunkančius gyvavimo ciklus naudodami pavadintas būsenas, apsaugotus perėjimus, į eilę įtraukiamus būsenos veiksmus ir patvarią įvykių laiko juostą.
  • Šiuolaikinė užduočių siuntimo API. Savarankiškos užduočių klasės su Dispatchable savybe, tipizuotomis konstruktoriaus savybėmis kaip duomenų turiniu ir klasėje deklaruotomis $tries/$timeout/$backoff. readonly klasėje šioms savybėms negalima nustatyti numatytųjų reikšmių, todėl deklaruokite jas įprastoje klasėje su tik skaitomomis konstruktoriaus savybėmis.
  • Tarpinės programinės įrangos konvejeris. Svogūno sluoksnių principu veikianti tarpinė programinė įranga dažnio ribojimui, išimčių apkrovos ribojimui, unikalioms užduotims ir pasirinktinei logikai. Deklaruojama kiekvienai užduočiai naudojant middleware() metodą.
  • Srautiniai veiksmai. StreamingStep sąsaja pateikia dalis, kurios iškart išsaugomos duomenų bazėje. Pakartotinai vykdant užduotį, pateikiamos anksčiau išsaugotos dalys, todėl srautą galima tęsti nuo ten, kur jis nutrūko. Puikiai tinka LLM atsakymams ir dideliems atsisiuntimams.
  • Prijungiamasis podėlio sluoksnis. CacheFactory automatiškai aptinka APCu arba naudoja atminties podėlį. Pasirinktinės posistemės įgyvendina Contracts\Cache. Viduje naudojama dažnio ribojimo paieškai ir eilės būsenai.
  • Grupavimas ir grandinės. Išsiųskite užduočių grupes su then/catch/finally atgalinio iškvietimo funkcijomis ir eigos stebėjimu arba nuosekliai susiekite užduotis, kad kiekviena lauktų ankstesnės užbaigimo.
  • Patvarios delsos ir laukimas. delay() prideda delsas, atsparias procesų paleidimui iš naujo. wait_for_signal(), wait_for_signals(), wait_for_approval(), wait_for_input() ir wait_for_workflow() leidžia darbo eigoms laukti išorinių įvykių ar kitų darbo eigų, neišlaikant aktyvaus PHP.
  • Dinaminis vykdymas kiekvienam elementui. for_each() išplečia vykdymo metu aptiktas šakų užduotis iš darbo eigos būsenos ir palaiko užbaigimo režimus, kai pavyksta visi veiksmai, pirmasis veiksmas arba kvorumas.
  • Asinchroninis darbo eigų perdavimas. start_workflows() paverčia vykdymo metu aptiktus elementus atskiromis aukščiausio lygio darbo eigomis, kurių galima laukti vėliau.
  • WordPress veiksmų paleidikliai. on_action() susieja pagrindinės sistemos arba papildinių veiksmų kabliukus su patvarių darbo eigų paleidimu, taikant sąlygas ir idempotentiškumą.
  • Patvarūs artefaktai. Saugokite pavadintus darbo eigos rezultatus už pagrindinio būsenos objekto ribų ir įtraukite juos į būsenos, CLI tikrinimo, eksporto ir pakartotinio paleidimo procesus.
  • Darbo eigos apsaugos priemonės. version(), deterministinė apibrėžties maiša, idempotentiniai siuntimo raktai ir darbo eigos biudžetai padeda lengviau tikrinti agento tipo vykdymus ir neleidžia jų netyčia dubliuoti ar tyliai paleisti per ilgai.
  • Išteklių valdymas. Lygiagretumo grupės, sąnaudų vienetai, darbo eigos biudžetai ir darbuotojų priėmimo kontrolė padeda išlaikyti brangias agento tipo užduotis nustatytose ribose.
  • Veiksmų kompensavimas. compensate_with() ir compensate_on_failure() suteikia užbaigtų veiksmų atšaukimo kabliukus, kai darbo eiga atšaukiama arba nepavyksta.
  • Signalai apie veikimą. Ilgai vykdomi veiksmai siunčia signalus, kad užstrigusių užduočių atkūrimo sistema neatimtų aktyvaus darbo.
  • Darbo eigos sekimas. Kiekvienas veiksmo perėjimas įrašomas kartu su įvestimi, išvestimi, ankstesne ir paskesne būsena, kontekstu, artefaktais, dalimis, klaidomis ir laiku. Galimas derinimas atkuriant ankstesnes būsenas naudojant workflow_state_at().
  • Lygiagretūs veiksmai. Vykdykite veiksmus vienu metu ir laukite, kol jie visi bus užbaigti, prieš tęsdami.
  • Sąlyginis šakojimasis. Pagal ankstesnę būseną praleiskite prie nurodytų veiksmų naudodami _next_step.
  • Darbo eigų vykdymas. Paleiskite vidines darbo eigas, kurios grąžina rezultatus į pagrindinę darbo eigą.
  • Prioritetų eilės. Keturi lygiai (žemas, įprastas, aukštas, skubus) naudojant tipams saugias PHP išvardijimo struktūras.
  • Kelių eilių darbuotojai. Vienas darbuotojas apdoroja kelias eiles griežta prioritetų tvarka.
  • Dažnio ribojimas. Kiekvienos apdorojimo funkcijos vykdymo ribos slankiajame lange.
  • Pasikartojančios užduotys. Planavimas pagal intervalus ir cron su konfigūruojamomis persidengimo strategijomis (leisti, praleisti, kaupti buferyje).
  • Darbo eigos atšaukimas. Atšaukite vykdomas darbo eigas ir paleiskite užregistruotas valymo funkcijas.
  • Būsenos apkarpymas. Automatiškai pašalinkite senus veiksmų rezultatus, kad būtų lengviau valdyti didelę darbo eigos būseną.
  • Darbuotojų lygiagretumas. --workers=N išsišakoja į kelis procesus ir automatiškai paleidžia juos iš naujo po strigties.
  • Visapusiškas stebimumas. Duomenų bazės žurnalai, kiekvienos apdorojimo funkcijos metrikos ir įvykių žiniatinklio kabliukai.
  • Testavimo priemonės. QueueFake įrašo išsiųstas užduotis ir paketus, kad juos būtų galima tikrinti atliekant vienetų testus.
  • PHP atributai. #[QueuetyHandler('name')], skirti apdorojimo funkcijoms registruoti be konfigūracijos.

Kaip tai veikia

Darbininkai veikia ilgai gyvuojančiame WP-CLI procese ir ima užduotis tiesiai iš MySQL. Eilės įrašai, darbo eigos būsena, žurnalai, paketai, signalai ir srautinio perdavimo dalys saugomos MySQL, todėl paleidus darbininkus iš naujo neprarandama orkestravimo būsena.

Darbo eigos ilgai trunkantį darbą suskaido į žingsnius. Kiekvieno žingsnio išvestis išsaugoma bendrame būsenos rinkinyje duomenų bazėje. Jei PHP nutrūksta žingsnio viduryje, darbininkas pakartoja tą žingsnį, išsaugodamas visą ankstesnę būseną. Žingsnio riba yra viena MySQL operacija: būsenos atnaujinimas, užduoties užbaigimas ir kito žingsnio įtraukimas į eilę įvyksta atomiškai.

Kodas
Workflow: generate_report (3 steps)

Step 0: fetch_data     -> state: {user_data: {...}}
Step 1: call_llm       -> PHP dies -> retry -> state: {user_data: {...}, llm_response: "..."}
Step 2: format_output  -> state: {user_data: {...}, llm_response: "...", report_url: "/reports/42.pdf"}

Workflow: completed

Reikalavimai

  • PHP 8.2 arba naujesnė
  • WordPress 6.4 arba naujesnė
  • MySQL 8.0+ arba MariaDB 10.6+, nes darbininkai užduotis ima naudodami SELECT ... FOR UPDATE SKIP LOCKED
  • mysqli arba pdo_mysql vykdymo aplinkoje PHP, kuri įkelia WordPress ir WP-CLI
  • WP-CLI, kad būtų galima paleisti atskirus darbininkus su wp queuety work
  • Plėtiniai pcntl ir posix darbininkų grupėms (--workers, --min-workers, --max-workers) PHP

Diegimo instrukcijas rasite skiltyje Darbo pradžia.