Μετάβαση στο περιεχόμενο

Εργάτες

Οι εργάτες είναι διεργασίες μακράς διάρκειας που ελέγχουν τη βάση δεδομένων για εκκρεμείς εργασίες, τις εκτελούν και προωθούν τις ροές εργασιών. Η εντολή wp queuety work εκτελείται μέσα στο WP-CLI, ενώ η ουρά δεσμεύεται απευθείας από το MySQL μέσω του καλύτερου διαθέσιμου οδηγού βάσης δεδομένων Queuety.

Το πρόσθετο εγκαθιστά επίσης μια προεπιλεγμένη εναλλακτική λύση WordPress cron που εκτελείται μία φορά το λεπτό, για περιβάλλοντα χωρίς πρόσβαση σε κέλυφος. Αυτή η σελίδα καλύπτει τους αποκλειστικούς εργάτες WP-CLI, που αποτελούν τον προτεινόμενο τρόπο ανάπτυξης για υψηλότερη απόδοση.

Εκκίνηση εργάτη

Κέλυφος
wp queuety work

Αυτό ξεκινά έναν εργάτη στην ουρά default. Εκτελείται σε βρόχο: δεσμεύει μια εργασία, την εκτελεί και επαναλαμβάνει τη διαδικασία. Όταν η ουρά είναι κενή, περιμένει QUEUETY_WORKER_SLEEP δευτερόλεπτα (προεπιλογή: 1) πριν ελέγξει ξανά.

Επιλογές

Επιλογή Περιγραφή
--queue=<queue> Queue(s) προς επεξεργασία, χωρισμένες με κόμμα για ορισμό προτεραιότητας (προεπιλογή: default)
--once Επεξεργασία το πολύ μίας εργασίας και έξοδος
--workers=<n> Δημιουργία N διεργασιών εργάτη (απαιτούνται οι επεκτάσεις pcntl και posix)
--min-workers=<n> Ελάχιστος αριθμός εργατών για προσαρμοστική ομάδα. Απαιτείται το --max-workers
--max-workers=<n> Μέγιστος αριθμός εργατών για προσαρμοστική ομάδα
Κέλυφος
# Process a specific queue
wp queuety work --queue=emails

# Process at most one job and exit
wp queuety work --once

# Run 4 concurrent workers
wp queuety work --workers=4

# Scale between 2 and 6 workers as backlog changes
wp queuety work --queue=providers --min-workers=2 --max-workers=6

Προτεραιότητες πολλαπλών ουρών

Ένας εργάτης μπορεί να επεξεργάζεται πολλές ουρές με σειρά προτεραιότητας. Περάστε μια λίστα ονομάτων ουρών, χωρισμένων με κόμμα, στο --queue:

Κέλυφος
wp queuety work --queue=critical,default,low

Ο εργάτης προσπαθεί να δεσμεύσει μια εργασία από κάθε ουρά με τη σειρά που αναφέρεται. Ελέγχει πρώτα την critical. Αν η critical έχει κάποια εργασία, την επεξεργάζεται. Αν η critical είναι κενή, συνεχίζει στην default και μετά στην low. Έτσι, οι ουρές υψηλότερης προτεραιότητας αδειάζουν πάντα πριν από τις χαμηλότερης προτεραιότητας.

Πώς λειτουργεί η σειρά προτεραιότητας

Σε κάθε επανάληψη, ο εργάτης προσπαθεί να δεσμεύσει εργασία από την πρώτη ουρά της λίστας. Αν η ουρά είναι κενή ή σε παύση, συνεχίζει στην επόμενη και προχωρά μέχρι να βρει εργασία ή να εξαντλήσει τη λίστα. Αν δεν βρεθεί εργασία σε καμία ουρά, ο εργάτης περιμένει και ξαναδοκιμάζει. Αυτό είναι ένα αυστηρό μοντέλο προτεραιότητας, που σημαίνει ότι μια σταθερή ροή εργασιών critical θα αφήσει χωρίς εξυπηρέτηση τις default και low. Αν οι ουρές χαμηλότερης προτεραιότητας χρειάζονται εγγυημένη απόδοση, χρησιμοποιήστε αποκλειστικούς εργάτες.

Χρήση πολλαπλών ουρών στο PHP

Οι μέθοδοι Worker::run() και Worker::flush() δέχονται είτε συμβολοσειρά είτε πίνακα:

PHP
// Comma-separated string
Queuety::worker()->run( 'critical,default,low' );

// Array
Queuety::worker()->run( [ 'critical', 'default', 'low' ] );

// flush() also supports multi-queue
$count = Queuety::worker()->flush( 'critical,default,low' );

Στρατηγικές ανάπτυξης

Οι αποκλειστικοί εργάτες ανά ουρά σάς δίνουν πλήρη έλεγχο στην ταυτόχρονη εκτέλεση και την απομόνωση. Κάθε ουρά αποκτά τη δική της ομάδα εργατών process(es) και δεν μπορεί να μείνει χωρίς εξυπηρέτηση από άλλες ουρές:

Ini
[program:queuety-critical]
command=wp queuety work --queue=critical
numprocs=4

[program:queuety-default]
command=wp queuety work --queue=default
numprocs=2

[program:queuety-low]
command=wp queuety work --queue=low
numprocs=1

Η σειρά προτεραιότητας με έναν εργάτη είναι πιο εύκολη στη διαχείριση και λειτουργεί καλά όταν οι ουρές χαμηλότερης προτεραιότητας μπορούν να ανεχτούν καθυστερήσεις:

Ini
[program:queuety-worker]
command=wp queuety work --queue=critical,default,low
numprocs=2

Μπορείτε επίσης να συνδυάσετε τις δύο προσεγγίσεις: αποκλειστικοί εργάτες για την critical ώστε να εξασφαλίσετε απόδοση, και ένας εργάτης με σειρά προτεραιότητας για όλες τις υπόλοιπες:

Ini
[program:queuety-critical]
command=wp queuety work --queue=critical
numprocs=2

[program:queuety-fallback]
command=wp queuety work --queue=default,low
numprocs=2

Έλεγχος αποδοχής βάσει πόρων

Οι εργάτες κάνουν περισσότερα από το να δεσμεύουν απλώς την επόμενη εκκρεμή εγγραφή. Πριν ξεκινήσει μια δεσμευμένη εργασία, το Queuety μπορεί να εφαρμόσει συνοπτικούς ελέγχους αποδοχής βάσει της ομάδας ταυτόχρονης εκτέλεσης της εργασίας και του πρόσφατου προφίλ εκτέλεσης αυτού του χειριστή.

Για το ευρύτερο μοντέλο, συμπεριλαμβανομένου του τρόπου με τον οποίο συνδέεται με τα μεταδεδομένα εργασιών και τους προϋπολογισμούς ροών εργασιών, ανατρέξτε στη Διαχείριση πόρων.

Μια ομάδα ταυτόχρονης εκτέλεσης θέτει ένα κοινό όριο για πολλούς χειριστές ή κατηγορίες εργασιών. Αν επισημάνετε πολλούς απαιτητικούς παρόχους με την ίδια ομάδα και το ίδιο όριο, ο εργάτης θα αποδεσμεύσει νέες δεσμευμένες εργασίες αντί να τις ξεκινήσει μόλις εξαντληθεί το όριο της ομάδας. Έτσι, οι ανεξάρτητες ουρές δεν υπερφορτώνουν ένα κατάντη σύστημα μόνο και μόνο επειδή υπάρχουν πολλοί αδρανείς εργάτες.

Τα πρόσφατα αρχεία καταγραφής εκτέλεσης τροφοδοτούν επίσης ένα απλό προφίλ αποδοχής. Όταν είναι ενεργοποιημένος ο έλεγχος αποδοχής πόρων, το Queuety εξετάζει τη μέση διάρκεια και τη μέγιστη μνήμη για τον χειριστή που πρόκειται να εκτελέσει. Αν ο τρέχων εργάτης πλησιάζει ήδη το ρυθμισμένο όριο μνήμης, μια ουρά ή ομάδα παρόχων έχει ήδη φτάσει τον σταθμισμένο προϋπολογισμό της, το τρέχον κοντέινερ δεν φαίνεται να έχει αρκετή διαθέσιμη μνήμη για το παρατηρημένο προφίλ του χειριστή ή μια εκτέλεση τύπου --once πλησιάζει το χρονικό της όριο, το Queuety αναβάλλει την εργασία αντί να ξεκινήσει εργασία που είναι απίθανο να ολοκληρωθεί ομαλά.

Ενεργοποιείτε την πολιτική από τον ορισμό της εργασίας και όχι από την εντολή του εργάτη:

PHP
class CallProviderStep implements \Queuety\Step {
    public function handle( array $state ): array {
        // ...
    }

    public function config(): array {
        return [
            'concurrency_group' => 'providers',
            'concurrency_limit' => 3,
            'cost_units' => 5,
        ];
    }
}

Τα ίδια μεταδεδομένα μπορούν να προστεθούν σε αποστελλόμενες κλάσεις εργασιών με δημόσιες ιδιότητες ή σε μεμονωμένη αποστολή μέσω των PendingJob::concurrency_group() και PendingJob::cost_units().

Το προφίλ αποδοχής στην πλευρά του εργάτη ελέγχεται από τις εξής σταθερές:

Σταθερά Περιγραφή
QUEUETY_RESOURCE_ADMISSION Ενεργοποίηση ή απενεργοποίηση ελέγχων αποδοχής βάσει προφίλ
QUEUETY_RESOURCE_PROFILE_WINDOW_MINUTES Το χρονικό διάστημα αναδρομής για τη δημιουργία πρόσφατων προφίλ χειριστών
QUEUETY_RESOURCE_PROFILE_TTL Χρόνος ζωής προσωρινής μνήμης για πρόσφατα προφίλ χειριστών
QUEUETY_RESOURCE_MEMORY_HEADROOM_MB Δεσμευμένο περιθώριο μνήμης πριν από την αποδοχή άλλης εργασίας
QUEUETY_RESOURCE_SYSTEM_MEMORY_AWARENESS Ενεργοποίηση ή απενεργοποίηση ελέγχων μνήμης κοντέινερ ή κεντρικού υπολογιστή βέλτιστης προσπάθειας
QUEUETY_RESOURCE_SYSTEM_MEMORY_HEADROOM_MB Δεσμευμένο περιθώριο μνήμης συστήματος πριν από την αποδοχή άλλης εργασίας
QUEUETY_RESOURCE_QUEUE_COST_BUDGETS Σταθμισμένοι προϋπολογισμοί κόστους με βάση το όνομα ουράς
QUEUETY_RESOURCE_GROUP_COST_BUDGETS Σταθμισμένοι προϋπολογισμοί κόστους με βάση το concurrency_group
QUEUETY_RESOURCE_TIME_HEADROOM_MS Δεσμευμένο χρονικό περιθώριο για εκτελέσεις εργάτη μίας εκτέλεσης

Κύκλος ζωής εργάτη

Ένας εργάτης σταματά ομαλά, αφού ολοκληρώσει την τρέχουσα εργασία, όταν ισχύει οποιαδήποτε από τις παρακάτω συνθήκες:

Συνθήκη Ρύθμιση
Μέγιστος αριθμός εργασιών που υποβλήθηκαν σε επεξεργασία QUEUETY_WORKER_MAX_JOBS (προεπιλογή: 1000)
Υπέρβαση μέγιστης μνήμης QUEUETY_WORKER_MAX_MEMORY (προεπιλογή: 128 MB)

Μετά τη διακοπή, ο εργάτης τερματίζεται κανονικά. Σε περιβάλλον παραγωγής, ένας διαχειριστής διεργασιών τον επανεκκινεί αυτόματα.

Τα σήματα δεν διαχειρίζονται ακόμη ομαλά (#4). Μια μεμονωμένη διεργασία wp queuety work δεν εγκαθιστά χειριστή σημάτων, επομένως τα SIGTERM ή SIGINT (Ctrl+C) την τερματίζουν αμέσως, ακόμη και στη μέση μιας εργασίας. Η εργασία παραμένει σε κατάσταση processing μέχρι η ανάκτηση παρωχημένων εργασιών να την επαναφέρει μετά από QUEUETY_STALE_TIMEOUT δευτερόλεπτα, επομένως βεβαιωθείτε ότι οι χειριστές μπορούν να επαναλάβουν με ασφάλεια την εργασία. Μια ομάδα εργατών προωθεί το SIGTERM στις θυγατρικές διεργασίες της, αλλά εκείνες δεν αντιδρούν σε αυτό, επομένως η ομάδα συνεχίζει να εκτελείται μέχρι να σταματήσουν για έναν από τους παραπάνω λόγους. Όταν χρειάζεται να σταματήσετε μια ομάδα, ορίστε στον διαχειριστή διεργασιών χρόνο αναμονής τερματισμού, μετά τον οποίο θα στείλει το SIGKILL.

Ταυτόχρονη εκτέλεση με πολλούς εργάτες

Η σημαία --workers=N δημιουργεί N θυγατρικές διεργασίες με χρήση του pcntl_fork(). Κάθε θυγατρική δημιουργεί τη δική της σύνδεση βάσης δεδομένων και επεξεργάζεται εργασίες ανεξάρτητα. Η γονική διεργασία παρακολουθεί τις θυγατρικές και επανεκκινεί όσες καταρρεύσουν.

Κέλυφος
wp queuety work --queue=default --workers=4

Απαιτήσεις: Πρέπει να έχουν εγκατασταθεί οι επεκτάσεις pcntl και posix PHP (χωρίς το pcntl η εντολή αποτυγχάνει με το μήνυμα "pcntl extension is required for --workers=N."), ενώ κάθε θυγατρική χρησιμοποιεί τη δική της σύνδεση βάσης δεδομένων, επομένως η ρύθμιση MySQL max_connections πρέπει να επαρκεί για την ομάδα. Οι προσαρμοστικές ομάδες (--min-workers/--max-workers) έχουν τις ίδιες απαιτήσεις.

Προσαρμοστικές ομάδες εργατών

Οι προσαρμοστικές ομάδες διατηρούν έναν ελάχιστο αριθμό έτοιμων εργατών και, στη συνέχεια, αυξομειώνουν τον αριθμό τους εντός ενός ρυθμισμένου εύρους:

Κέλυφος
wp queuety work --queue=providers --min-workers=2 --max-workers=6

Η γονική διεργασία παρακολουθεί τον εκκρεμή όγκο εργασιών που μπορούν να δεσμευτούν στο επιλεγμένο σύνολο ουρών και προσαρμόζει ανάλογα τον αριθμό των θυγατρικών, μέχρι το ρυθμισμένο μέγιστο. Όταν η ουρά ησυχάζει, η ομάδα περιμένει για το διάστημα χάριτος αδράνειας πριν μειώσει τον αριθμό των εργατών, ώστε οι σύντομες αιχμές να μην προκαλούν άσκοπες αλλαγές στη λίστα διεργασιών.

Η αύξηση της κλίμακας παραμένει συντηρητική. Όταν το Queuety μπορεί να διαβάσει δεδομένα τηλεμετρίας μνήμης του κοντέινερ ή του κεντρικού υπολογιστή, αρνείται να προσθέσει θυγατρικές αν δεν υπάρχει αρκετή διαθέσιμη μνήμη για το πλήρες αποτύπωμα ενός ακόμη εργάτη.

Ο βρόχος κλιμάκωσης στην πλευρά της γονικής διεργασίας ελέγχεται από τις εξής ρυθμίσεις:

Σταθερά Περιγραφή
QUEUETY_WORKER_POOL_SCALE_INTERVAL Πόσο συχνά η γονική διεργασία συγχρονίζει το μέγεθος της ομάδας
QUEUETY_WORKER_POOL_IDLE_GRACE Για πόσο πρέπει να παραμείνει ήσυχος ο εκκρεμής όγκος εργασιών πριν μειωθεί η κλίμακα

Ανάκτηση παρωχημένων εργασιών

Αν ένας εργάτης καταρρεύσει ενώ επεξεργάζεται μια εργασία, η εργασία παραμένει σε κατάσταση processing. Ένας εργάτης μακράς διάρκειας ελέγχει περίπου μία φορά το λεπτό για εργασίες που βρίσκονται σε κατάσταση processing για περισσότερο από QUEUETY_STALE_TIMEOUT δευτερόλεπτα. Μια παρωχημένη εργασία που έχει ακόμη προσπάθειες διαθέσιμες επαναλαμβάνεται μετά την καθυστέρηση μεταξύ προσπαθειών· αν έχουν εξαντληθεί όλες οι προσπάθειες, θάβεται και η ροή εργασιών της επισημαίνεται ως αποτυχημένη. Οι εργάτες --once και η εναλλακτική λύση WP-Cron δεν εκτελούν αυτόν τον έλεγχο.

Ανακτήστε παρωχημένες εργασίες με μη αυτόματο τρόπο:

Κέλυφος
wp queuety recover

Λειτουργία εκκαθάρισης

Επεξεργασία όλων των εκκρεμών εργασιών και έξοδος. Χρήσιμο για δοκιμές ή εφάπαξ μαζική επεξεργασία:

Κέλυφος
wp queuety flush
wp queuety flush --queue=emails

Ανάπτυξη σε περιβάλλον παραγωγής

Για περιβάλλον παραγωγής, χρησιμοποιήστε έναν διαχειριστή διεργασιών για να διατηρείτε τους εργάτες σε λειτουργία. Ακολουθούν δύο συνήθεις προσεγγίσεις.

Supervisord

Ini
[program:queuety-default]
command=wp queuety work --queue=default
directory=/var/www/html
autostart=true
autorestart=true
numprocs=2
process_name=%(program_name)s_%(process_num)02d
stdout_logfile=/var/log/queuety-default.log
stderr_logfile=/var/log/queuety-default-error.log

[program:queuety-emails]
command=wp queuety work --queue=emails
directory=/var/www/html
autostart=true
autorestart=true
numprocs=1
stdout_logfile=/var/log/queuety-emails.log
stderr_logfile=/var/log/queuety-emails-error.log

Systemd

Ini
[Unit]
Description=Queuety Worker (default queue)
After=mysql.service

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/html
ExecStart=/usr/local/bin/wp queuety work --queue=default
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Ενεργοποίηση και εκκίνηση:

Κέλυφος
sudo systemctl enable queuety-worker
sudo systemctl start queuety-worker

Συμβουλές ανάπτυξης

Εκτελέστε ξεχωριστούς εργάτες για ξεχωριστές ουρές όταν χρειάζεστε ισχυρότερη απομόνωση. Χρησιμοποιήστε το --workers=N όταν ο φόρτος εργασίας περιορίζεται από την CPU και προτιμήστε εργάτες που επιβλέπονται ξεχωριστά όταν ο φόρτος εργασίας αφορά κυρίως I/O. Ορίστε το QUEUETY_WORKER_MAX_JOBS αν θέλετε περιοδικές επανεκκινήσεις για αποδέσμευση μνήμης και παρακολουθείτε τον αριθμό buried μέσω των webhooks ή των μετρήσεων.