Εισαγωγή
Το Queuety είναι ένα πρόσθετο WordPress που παρέχει γρήγορη ουρά εργασιών, μηχανή ροών εργασίας με διαρκή αποθήκευση και περιβάλλον εκτέλεσης μηχανής καταστάσεων με διαρκή αποθήκευση. Οι workers αναλαμβάνουν εργασίες απευθείας από το MySQL και τις επεξεργάζονται μέσα σε διεργασία WP-CLI μεγάλης διάρκειας. Το περιβάλλον εκτέλεσης PHP που φορτώνει τα WordPress και WP-CLI χρειάζεται είτε το mysqli είτε το pdo_mysql.
Γιατί το Queuety;
Το WordPress δεν διαθέτει πραγματικό σύστημα εργασιών στο παρασκήνιο. Το wp_cron ενεργοποιείται μόνο όταν υπάρχουν επισκέψεις σε σελίδες. Ο προεπιλεγμένος εκτελεστής του Action Scheduler βασίζεται στο WP-Cron και σε αιτήματα loopback HTTP, επεξεργαζόμενος κάθε φορά δέσμες για έως 30 δευτερόλεπτα. Μια κλήση API LLM που διαρκεί 60 δευτερόλεπτα τερματίζεται από το χρονικό όριο των 30 δευτερολέπτων του PHP. Δεν υπάρχει τρόπος εκτέλεσης διαδικασιών πολλών βημάτων που να επιβιώνουν από διακοπές λειτουργίας και να συνεχίζουν από εκεί που σταμάτησαν.
Το Queuety το αντιμετωπίζει αυτό με τρία βασικά στοιχεία:
- Εργασίες για εργασία στο παρασκήνιο χωρίς αναμονή αποτελέσματος
- Ροές εργασίας για διαρκείς διαδικασίες πολλών βημάτων με μόνιμη κατάσταση
- Μηχανές καταστάσεων για κύκλους ζωής μεγάλης διάρκειας που καθοδηγούνται από συμβάντα
Γρήγορο παράδειγμα
Αποστείλετε μια εργασία χρησιμοποιώντας τη σύγχρονη κλάση API:
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!' );
Ή χρησιμοποιήστε την κλασική προσέγγιση με όνομα χειριστή:
use Queuety\Queuety;
Queuety::dispatch( 'send_email', [ 'to' => 'user@example.com' ] );
Εκτελέστε μια ροή εργασίας με διαρκή αποθήκευση:
Queuety::workflow( 'generate_report' )
->then( FetchDataHandler::class )
->then( CallLLMHandler::class )
->then( FormatOutputHandler::class )
->dispatch( [ 'user_id' => 42 ] );
Μοντελοποιήστε μια συνεδρία μεγάλης διάρκειας με μηχανή καταστάσεων:
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 ] );
Εκκινήστε έναν worker:
wp queuety work
Αν δημιουργείτε σύστημα τύπου agent, ξεκινήστε με την ενότητα Ενορχήστρωση agent. Δείχνει πώς συνδυάζονται οι ροές planner/executor, τα σημεία ελέγχου από άνθρωπο και οι αναμονές μεταξύ ροών εργασίας.
Αν το σύστημα καθοδηγείται από συμβάντα και έχει μεγάλο κύκλο ζωής, ξεκινήστε με τις Μηχανές καταστάσεων μαζί με τις ροές εργασίας.
Αν θέλετε παραδείγματα ολοκληρωμένης ενσωμάτωσης, δείτε τα Παραδείγματα, που περιλαμβάνουν πλέον μοτίβα βασισμένα σε Neuron για εναλλαγή παρόχων, ροή δεδομένων, επαναλήψεις ελέγχου με υποστήριξη μνήμης και εξαρτημένες ροές εργασίας.
Αν θέλετε οι ροές εργασίας να ξεκινούν από συμβάντα τομέα του WordPress, όπως το save_post, δείτε τους Ενεργοποιητές ενεργειών.
Αν θέλετε να χρησιμοποιήσετε το περιβάλλον εκτέλεσης που βασίζεται στη βάση δεδομένων εκτός του WordPress, δείτε την ενότητα Αυτόνομη χρήση.
Βασικά χαρακτηριστικά
- Γρήγορη εκτέλεση. Οι workers έχουν άμεση πρόσβαση στην ουρά MySQL και αποφεύγουν το μοτίβο cron ανά αίτημα, που επιβραδύνει την εργασία στο παρασκήνιο στο WordPress.
- Ροές εργασίας με διαρκή αποθήκευση. Διαδικασίες πολλών βημάτων με μόνιμη κατάσταση που επιβιώνουν από χρονικά όρια PHP, διακοπές λειτουργίας και επαναλήψεις. Κάθε όριο βήματος είναι ατομική συναλλαγή MySQL.
- Ρητές μηχανές καταστάσεων. Μοντελοποιήστε συνεδρίες συνομιλίας, εγκρίσεις και άλλους κύκλους ζωής μεγάλης διάρκειας με ονομασμένες καταστάσεις, μεταβάσεις με φρουρούς, ενέργειες εισόδου σε κατάσταση που μπαίνουν στην ουρά και διαρκή χρονολόγια συμβάντων.
- Σύγχρονο API αποστολής API. Αυτοτελείς κλάσεις εργασιών με το trait
Dispatchable, τυποποιημένες ιδιότητες κατασκευαστή ως φορτίο και$tries/$timeout/$backoffδηλωμένα στην κλάση. Μια κλάσηreadonlyδεν μπορεί να ορίσει προεπιλεγμένες τιμές για αυτές τις ιδιότητες, γι’ αυτό δηλώστε τις σε κανονική κλάση με ιδιότητες κατασκευαστή που προωθούνται ως readonly. - Αγωγός ενδιάμεσου λογισμικού. Ενδιάμεσο λογισμικό τύπου κρεμμυδιού για περιορισμό ρυθμού, περιορισμό συχνότητας εξαιρέσεων, μοναδικές εργασίες και προσαρμοσμένη λογική. Δηλώνεται ανά εργασία μέσω μιας μεθόδου
middleware(). - Βήματα ροής δεδομένων. Η διεπαφή
StreamingStepαποδίδει τμήματα που αποθηκεύονται αμέσως στη βάση δεδομένων. Σε περίπτωση επανάληψης, παρέχονται τα ήδη αποθηκευμένα τμήματα, ώστε η ροή να συνεχιστεί από εκεί που σταμάτησε. Ιδανικό για αποκρίσεις LLM και μεγάλες λήψεις. - Επεκτάσιμη βαθμίδα cache. Το
CacheFactoryεντοπίζει αυτόματα το APCu ή χρησιμοποιεί εφεδρικά cache στη μνήμη. Τα προσαρμοσμένα συστήματα αποθήκευσης υλοποιούν τοContracts\Cache. Χρησιμοποιείται εσωτερικά για αναζητήσεις περιορισμού ρυθμού και κατάσταση ουράς. - Ομαδοποίηση και αλυσιδωτή εκτέλεση. Αποστείλετε ομάδες εργασιών με συναρτήσεις επανάκλησης
then/catch/finallyκαι παρακολούθηση προόδου ή συνδέστε εργασίες διαδοχικά, ώστε καθεμία να εξαρτάται από την ολοκλήρωση της προηγούμενης. - Διαρκείς καθυστερήσεις και αναμονές. Το
delay()προσθέτει καθυστερήσεις που επιβιώνουν από επανεκκινήσεις διεργασιών. Ταwait_for_signal(),wait_for_signals(),wait_for_approval(),wait_for_input()καιwait_for_workflow()επιτρέπουν στις ροές εργασίας να σταματούν για εξωτερικά συμβάντα ή άλλες ροές εργασίας χωρίς να διατηρούν ενεργό το PHP. - Δυναμικός βρόχος for-each. Το
for_each()επεκτείνει εργασία διακλάδωσης που ανακαλύπτεται κατά την εκτέλεση, με βάση την κατάσταση της ροής εργασίας, και υποστηρίζει λειτουργίες ολοκλήρωσης όλα-επιτυχή, πρώτο-επιτυχές και απαρτία. - Ασύγχρονες μεταβιβάσεις ροών εργασίας. Το
start_workflows()μετατρέπει στοιχεία που ανακαλύπτονται κατά την εκτέλεση σε ανεξάρτητες ροές εργασίας ανώτατου επιπέδου, στις οποίες μπορείτε να περιμένετε αργότερα. - Ενεργοποιητές ενεργειών WordPress. Το
on_action()αντιστοιχίζει hooks ενεργειών του πυρήνα ή πρόσθετων σε αποστολές διαρκών ροών εργασίας με ελέγχους προϋποθέσεων και ιδιοδυναμία. - Διαρκή τεχνουργήματα. Αποθηκεύστε ονομασμένα αποτελέσματα ροών εργασίας έξω από την κύρια συλλογή κατάστασης και διατηρήστε τα κατά την επιθεώρηση κατάστασης, την επιθεώρηση CLI, την εξαγωγή και την επανάληψη.
- Δικλίδες ασφαλείας ροών εργασίας. Το
version(), ένα ντετερμινιστικό hash ορισμού, κλειδιά αποστολής με ιδιοδυναμία και προϋπολογισμοί ροών εργασίας διευκολύνουν την επιθεώρηση εκτελέσεων τύπου agent και αποτρέπουν καλύτερα τη διπλή εκτέλεση ή την ανεξέλεγκτη συνέχισή τους. - Διαχείριση πόρων. Ομάδες ταυτόχρονης εκτέλεσης, μονάδες κόστους, προϋπολογισμοί ροών εργασίας και αποδοχή εργασιών από worker βοηθούν να παραμένει η δαπανηρή εργασία τύπου agent εντός καθορισμένων ορίων.
- Αντιστάθμιση βημάτων. Τα
compensate_with()καιcompensate_on_failure()παρέχουν hooks επαναφοράς για ολοκληρωμένα βήματα όταν οι ροές εργασίας ακυρώνονται ή αποτυγχάνουν. - Σήματα ζωής. Τα βήματα μεγάλης διάρκειας στέλνουν σήματα ζωής, ώστε το σύστημα ανάκτησης παλιών εργασιών να μην αναλαμβάνει ενεργή εργασία.
- Ανίχνευση ροών εργασίας. Κάθε μετάβαση βήματος καταγράφεται μαζί με την είσοδο, την έξοδο, την κατάσταση πριν και μετά, το περιβάλλον, τα τεχνουργήματα, τα τμήματα ροής, τα σφάλματα και τον εντοπισμό σφαλμάτων με μετάβαση στον χρόνο μέσω του
workflow_state_at(). - Παράλληλα βήματα. Εκτελέστε βήματα ταυτόχρονα και περιμένετε να ολοκληρωθούν όλα πριν συνεχίσετε.
- Διακλάδωση υπό όρους. Μεταβείτε σε ονομασμένα βήματα βάσει προηγούμενης κατάστασης με το
_next_step. - Εκτέλεση ροών εργασίας. Ξεκινήστε θυγατρικές ροές εργασίας που επιστρέφουν αποτελέσματα στη γονική.
- Ουρές προτεραιότητας. Τέσσερα επίπεδα (Low, Normal, High, Urgent) μέσω τυποποιημένων enum PHP.
- Workers πολλών ουρών. Επεξεργαστείτε πολλές ουρές με αυστηρή σειρά προτεραιότητας σε έναν worker.
- Περιορισμός ρυθμού. Όρια εκτέλεσης ανά χειριστή με κυλιόμενο παράθυρο.
- Επαναλαμβανόμενες εργασίες. Προγραμματισμός βάσει διαστημάτων και cron με διαμορφώσιμες πολιτικές επικάλυψης (Allow, Skip, Buffer).
- Ακύρωση ροών εργασίας. Ακυρώστε εκτελούμενες ροές εργασίας και ενεργοποιήστε καταχωρισμένους χειριστές καθαρισμού.
- Περιορισμός κατάστασης. Αφαιρείτε αυτόματα παλιές εξόδους βημάτων, ώστε η κατάσταση μεγάλων ροών εργασίας να παραμένει διαχειρίσιμη.
- Ταυτόχρονη εκτέλεση worker. Το
--workers=Nδημιουργεί πολλαπλές διεργασίες με αυτόματη επανεκκίνηση σε περίπτωση κατάρρευσης. - Πλήρης παρατηρησιμότητα. Καταγραφή στη βάση δεδομένων, μετρικές ανά χειριστή και webhook συμβάντων.
- Βοηθητικά εργαλεία δοκιμών. Το
QueueFakeκαταγράφει τις αποσταλμένες εργασίες και δέσμες για επιβεβαιώσεις σε δοκιμές μονάδων. - Γνωρίσματα PHP. Το
#[QueuetyHandler('name')]για καταχώριση χειριστών χωρίς ρυθμίσεις.
Πώς λειτουργεί
Οι workers εκτελούνται μέσα σε διεργασία WP-CLI μεγάλης διάρκειας και αναλαμβάνουν εργασίες απευθείας από το MySQL. Οι γραμμές ουράς, η κατάσταση ροών εργασίας, τα αρχεία καταγραφής, οι δέσμες, τα σήματα και τα τμήματα ροής δεδομένων αποθηκεύονται στο MySQL, επομένως οι επανεκκινήσεις worker δεν χάνουν την κατάσταση ενορχήστρωσης.
Οι ροές εργασίας χωρίζουν τις εργασίες μεγάλης διάρκειας σε βήματα. Κάθε βήμα αποθηκεύει την έξοδό του σε κοινή συλλογή κατάστασης στη βάση δεδομένων. Αν το PHP τερματιστεί στη μέση ενός βήματος, ο worker επαναλαμβάνει αυτό το βήμα με ανέπαφη όλη την προηγούμενη κατάσταση. Το όριο του βήματος είναι μία συναλλαγή MySQL: η ενημέρωση κατάστασης, η ολοκλήρωση της εργασίας και η προσθήκη του επόμενου βήματος στην ουρά γίνονται όλα ατομικά.
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
Απαιτήσεις
- PHP 8.2 ή νεότερη έκδοση
- WordPress 6.4 ή νεότερη έκδοση
- MySQL 8.0+ ή MariaDB 10.6+, επειδή οι workers αναλαμβάνουν εργασίες με το
SELECT ... FOR UPDATE SKIP LOCKED mysqliήpdo_mysqlστο περιβάλλον εκτέλεσης PHP που φορτώνει τα WordPress και WP-CLI- WP-CLI για εκτέλεση αποκλειστικών workers με το
wp queuety work - Οι επεκτάσεις PHP
pcntlκαιposixγια ομάδες διεργασιών worker (--workers,--min-workers,--max-workers)
Για εγκατάσταση, δείτε την ενότητα Γρήγορη εκκίνηση.