Πώς να τρέχετε εργασίες παρασκηνίου σε web εφαρμογή: Ουρές, χρονοπρογραμματιστές και cron
Για να τρέξετε εργασίες παρασκηνίου σε web εφαρμογή, χωρίστε πρώτα τη δουλειά σε δύο είδη. Εργασίες που ενεργοποιούνται (στείλε καλωσορίσματος email, επεξεργάσου ένα upload) μπορούν να αποθηκευτούν σε ουρά εργασιών, συχνά έναν πίνακα της βάσης σας, και να τις χειρίζεται ένας worker με επαναλήψεις. Προγραμματισμένες εργασίες (μια νυχτερινή αναφορά, υπενθυμίσεις κάθε 15 λεπτά) χρειάζονται κάτι που ενεργοποιείται σε χρονοδιάγραμμα: το cron της φιλοξενίας ή έναν εξωτερικό χρονοπρογραμματιστή που καλεί ένα προστατευμένο endpoint της εφαρμογής σας. Κάντε πάντα τις εργασίες ασφαλείς να τρέξουν δύο φορές, καταγράφετε τις αποτυχίες και μην βασίζεστε ποτέ σε χρονιστή μέσα σε server που μπορεί να κοιμηθεί ή να κάνει επανεκκίνηση.
Αυτός ο οδηγός εξηγεί τις επιλογές, πότε ταιριάζει η καθεμία, και πώς να τις ρυθμίσετε με έναν AI app builder, ακόμα και σε φιλοξενίες που μηδενίζουν.
Τι μετράει ως εργασία παρασκηνίου
Οτιδήποτε είναι αργό, αναξιόπιστο ή δεν χρειάζεται για την άμεση απάντηση του χρήστη:
- Αποστολή email, ειδοποιήσεων και αποδείξεων
- Αλλαγή μεγέθους εικόνων, επεξεργασία βίντεο, δημιουργία PDF
- Κλήσεις σε αργά εξωτερικά API, συμπεριλαμβανομένων μοντέλων AI για μεγάλες εργασίες
- Εισαγωγή ή συγχρονισμός δεδομένων από άλλο σύστημα
- Νυχτερινός καθαρισμός, αναφορές και υπενθυμίσεις
Να το κάνετε μέσα στο αίτημα κάνει τις σελίδες αργές και εύθραυστες: αν ο πάροχος email είναι εκτός λειτουργίας, η εγγραφή του χρήστη αποτυγχάνει. Η μεταφορά στο παρασκήνιο σημαίνει ότι ο χρήστης παίρνει άμεση απάντηση και η εργασία μπορεί να ξαναδοκιμαστεί.
Οι επιλογές
| Επιλογή | Πώς λειτουργεί | Πλεονεκτήματα | Μειονεκτήματα |
|---|---|---|---|
| Εκτέλεση και ξέχασέ το στην ίδια διαδικασία | Απαντάτε, και μετά συνεχίζετε τη δουλειά στον server | Καμία ρύθμιση | Χάνεται αν σταματήσει ο server· καμία επανάληψη |
Χρονιστής μέσα στη διαδικασία (setInterval, setTimeout) | Ένας χρονιστής στον τρέχοντα server | Τετριμμένο | Δεν τρέχει όταν κοιμάται· διπλά με πολλά αντίγραφα |
| Ουρά βασισμένη σε βάση | Εργασίες αποθηκευμένες ως γραμμές· ένας worker τις παίρνει και τις τρέχει | Χρησιμοποιεί τη βάση που ήδη έχετε· ανθεκτική· εύκολη στον έλεγχο | Χτίζετε εσείς τις επαναλήψεις και το κλείδωμα· χρειάζεται κάτι που τρέχει τον worker |
| Αποκλειστική ουρά (με Redis ή διαχειριζόμενη) | Υπηρεσία ουράς συν workers | Ώριμα χαρακτηριστικά επαναλήψεων και χρονοδρομολόγησης | Άλλη υπηρεσία να τρέχει και να πληρώνεται |
| Φιλοξενούμενη υπηρεσία εργασιών ή ροών | Τρίτος καλεί τα endpoints σας με επαναλήψεις και χρονοδιαγράμματα | Χρονοδρομολόγηση και επαναλήψεις γίνονται για εσάς | Εξάρτηση από προμηθευτή· άλλος λογαριασμός και κλειδί |
| Εξωτερικός χρονοπρογραμματιστής που καλεί endpoint | Ένας χρονιστής αλλού στέλνει αίτημα HTTP σε χρονοδιάγραμμα | Δουλεύει σε κάθε φιλοξενία, και σε μηδενισμό | Ελάχιστα διαστήματα και καθυστερήσεις· προστατέψτε το endpoint |
| Ενσωματωμένο cron της φιλοξενίας | Η πλατφόρμα τρέχει μια εντολή σε χρονοδιάγραμμα | Απλό εκεί που υπάρχει | Δεν το προσφέρει κάθε φιλοξενία |
Δεν υπάρχει μία σωστή απάντηση. Μια μικρή εφαρμογή συχνά χρειάζεται μόνο μια ουρά βάσης συν έναν εξωτερικό χρονοπρογραμματιστή.
Γιατί οι φιλοξενίες που μηδενίζουν αλλάζουν την εικόνα
Πολλές σύγχρονες φιλοξενίες βάζουν την εφαρμογή σας για ύπνο όταν κανείς δεν τη χρησιμοποιεί και την ξυπνούν στο επόμενο αίτημα. Αυτό εξοικονομεί χρήματα, αλλά ένας κοιμισμένος server δεν τρέχει κώδικα: οι χρονιστές δεν ενεργοποιούνται και οι workers δεν ελέγχουν. Σε αυτές τις φιλοξενίες, η προγραμματισμένη δουλειά πρέπει να ξεκινά με εισερχόμενο αίτημα, και η πιο εύκολη πηγή του αιτήματος είναι ένας εξωτερικός χρονοπρογραμματιστής. Κάθε κλήση ξυπνά την εφαρμογή (και συχνά τη βάση της), άρα η κλήση κάθε λεπτό κοστίζει περισσότερο από κάθε 15 λεπτά. Επιλέξτε το πιο αραιό χρονοδιάγραμμα που καλύπτει την ανάγκη.
Μοτίβο 1: Ουρά εργασιών βάσης
Για εργασίες που ενεργοποιούνται:
- Δημιουργήστε πίνακα
jobs: τύπος, payload (JSON), κατάσταση (pending,running,done,failed), attempts, run_after, last_error, χρονικές σημάνσεις. - Όταν συμβαίνει κάτι, εισάγετε μια γραμμή εργασίας στην ίδια συναλλαγή με την αλλαγή που το προκάλεσε, ώστε να επιτύχουν ή να αποτύχουν μαζί.
- Ένας worker παίρνει τις εργασίες που είναι έτοιμες, τις σημειώνει
running, κάνει τη δουλειά και τις σημειώνειdone. - Σε αποτυχία, αυξήστε το
attempts, βάλτεrun_afterαργότερα (για παράδειγμα 1, 5 και μετά 30 λεπτά) και αποθηκεύστε το σφάλμα. Μετά από ένα μέγιστο όριο, σημειώστε την ωςfailedκαι ειδοποιήστε κάποιον.
Αν περισσότεροι από ένας worker μπορεί να τρέχουν ταυτόχρονα, οι εργασίες πρέπει να παίρνονται με ασφάλεια. Στο Postgres, το SELECT ... FOR UPDATE SKIP LOCKED επιτρέπει σε κάθε worker να παίρνει διαφορετικές γραμμές χωρίς σύγκρουση.
Τι τρέχει τον worker; Σε server που είναι πάντα ανοιχτός, ένας βρόχος σε ξεχωριστή διαδικασία. Σε φιλοξενία που μηδενίζει, το προγραμματισμένο endpoint του Μοτίβου 2 μπορεί να επεξεργαστεί μια παρτίδα εργασιών που έχουν έλθει σε κάθε κλήση.
Μοτίβο 2: Εξωτερικός χρονοπρογραμματιστής που καλεί την εφαρμογή σας
Για προγραμματισμένες εργασίες:
- Προσθέστε ένα endpoint όπως
POST /api/cron/send-reminders. - Προστατέψτε το: ζητήστε μυστικό token σε header, αποθηκευμένο ως μυστικό και στις δύο πλευρές, και απορρίψτε οτιδήποτε άλλο.
- Κάντε το idempotent: η εκτέλεσή του δύο φορές μέσα στο ίδιο λεπτό δεν πρέπει να στείλει δύο υπενθυμίσεις. Καταγράφετε τι στάλθηκε.
- Κρατήστε κάθε κλήση σύντομη: επεξεργαστείτε μια παρτίδα (ας πούμε 100 στοιχεία) και αφήστε την επόμενη κλήση να πάρει τα υπόλοιπα.
- Βάλτε έναν χρονοπρογραμματιστή να το καλεί.
Επιλογές χρονοπρογραμματιστή:
- Προγραμματισμένα workflows του GitHub Actions. Δωρεάν μέσα στα όρια χρήσης του GitHub. Από τον Σεπτέμβριο του 2026, η τεκμηρίωση του GitHub λέει ότι το συντομότερο διάστημα είναι μία φορά κάθε 5 λεπτά, οι εκτελέσεις μπορεί να καθυστερήσουν τις ώρες αιχμής (ιδιαίτερα στην αρχή κάθε ώρας), τα προγράμματα χρησιμοποιούν UTC από προεπιλογή, και τα προγραμματισμένα workflows σε δημόσιο αποθετήριο απενεργοποιούνται μετά από 60 μέρες χωρίς δραστηριότητα στο αποθετήριο.
- Υπηρεσίες cron στο cloud. Υπάρχουν πολλές υπηρεσίες που έχουν ως μοναδικό σκοπό να καλούν ένα URL σε χρονοδιάγραμμα. Ελέγξτε την αξιοπιστία, το ελάχιστο διάστημα και τις ειδοποιήσεις πριν εξαρτηθείτε από μία.
- Ο χρονοπρογραμματιστής του παρόχου cloud σας. Αν ήδη χρησιμοποιείτε μεγάλο πάροχο cloud, έχει διαχειριζόμενο χρονοπρογραμματιστή που μπορεί να καλεί HTTPS endpoint.
- Φιλοξενούμενη υπηρεσία εργασιών ή ροών. Αυτές συνδυάζουν χρονοδρομολόγηση, ουρές και επαναλήψεις, και καλούν τα endpoints σας για κάθε βήμα. Συγκρίνετε τιμές και όρια στη σελίδα κάθε προμηθευτή.
Μοτίβο 3: Αφήστε τον πάροχο να το κάνει
Μερικές φορές η καλύτερη εργασία παρασκηνίου είναι καμία:
- Πληρωμές. Το Stripe ξαναδοκιμάζει αποτυχημένες πληρωμές συνδρομών και στέλνει webhooks· αντιδράτε εσείς αντί να κάνετε polling. Δείτε τι είναι ένα webhook.
- Email. Οι πάροχοι βάζουν σε ουρά και ξαναδοκιμάζουν την παράδοση αφού τους παραδώσετε το μήνυμα.
- Μαζική δουλειά AI. Το OpenAI και το Anthropic προσφέρουν batch APIs για μη επείγοντα αιτήματα που υποβάλλετε και παραλαμβάνετε αργότερα.
Προτροπές για τον AI builder σας
Για ουρά:
Πρόσθεσε ουρά εργασιών παρασκηνίου χρησιμοποιώντας έναν πίνακα
jobsστη βάση μας (τύπος, payload JSON, κατάσταση, attempts, run_after, last_error). Όταν ένας χρήστης κάνει εγγραφή, εισήγαγε μια εργασία send_welcome_email στην ίδια συναλλαγή αντί να στείλεις inline. Πρόσθεσε μια συνάρτηση processJobs(limit) που παίρνει τις έτοιμες εργασίες με SELECT ... FOR UPDATE SKIP LOCKED, τις τρέχει και ξαναδοκιμάζει αποτυχίες μετά από 1, 5 και 30 λεπτά, σημειώνοντάς τες ως failed μετά από 4 προσπάθειες.
Για προγραμματισμένη ενεργοποίηση:
Πρόσθεσε POST /api/cron/tick προστατευμένο με bearer token από το μυστικό CRON_SECRET· απέρριψε κάθε αίτημα χωρίς αυτό. Κάθε κλήση τρέχει processJobs(100) και στέλνει υπενθυμίσεις κρατήσεων που λήγουν στις επόμενες 24 ώρες και δεν έχουν σταλεί ακόμα, καταγράφοντας τις υπενθυμίσεις που στάλθηκαν ώστε τίποτα να μη σταλεί δύο φορές. Επέστρεψε μια περίληψη JSON για ό,τι έτρεξε. Μετά γράψε ένα workflow του GitHub Actions που καλεί αυτό το endpoint κάθε 15 λεπτά, διαβάζοντας το URL και το token από τα μυστικά του αποθετηρίου.
Συνηθισμένα λάθη
- Να βασίζεστε σε
setInterval. Σταματά σιωπηλά όταν ο server κοιμάται ή κάνει επανεκκίνηση, και διπλασιάζεται όταν τρέχουν δύο αντίγραφα. - Ένα απροστάτευτο endpoint cron. Όποιος το βρει μπορεί να ενεργοποιήσει τις εργασίες σας, ή τον λογαριασμό email σας.
- Εργασίες που δεν είναι idempotent. Οι επαναλήψεις και οι διπλές κλήσεις του χρονοπρογραμματιστή θα συμβούν. Σχεδιάστε για αυτές.
- Καμία ορατότητα αποτυχιών. Μια εργασία που αποτυγχάνει σιωπηλά για μια εβδομάδα είναι χειρότερη από μία που αποτυγχάνει φανερά. Καταγράφετε σφάλματα και ειδοποιείτε για επαναλαμβανόμενες αποτυχίες.
- Μεγάλες εκτελέσεις σε ένα αίτημα. Τα αιτήματα λήγουν. Επεξεργαστείτε σε παρτίδες.
- Πολύ συχνός προγραμματισμός. Κάθε κλήση σε φιλοξενία που μηδενίζει ξυπνά και χρεώνει την εφαρμογή. Ταιριάξτε το διάστημα με την πραγματική ανάγκη.
- Ζώνες ώρας. Το «9π.μ.» σημαίνει διαφορετικά πράγματα για τον χρονοπρογραμματιστή σας (συχνά UTC) και για τους χρήστες σας. Αποθηκεύστε τις ώρες σε UTC και μετατρέψτε τις ανά χρήστη.
- Μυστικά μέσα στο αρχείο του workflow. Κρατήστε τα tokens στο κατάστημα μυστικών του χρονοπρογραμματιστή. Δείτε πώς να κρατάτε ασφαλή τα κλειδιά API.
Λίστα ελέγχου
- Η αργή δουλειά έχει μετακινηθεί έξω από τα αιτήματα των χρηστών
- Οι εργασίες αποθηκεύονται ανθεκτικά, όχι μόνο στη μνήμη
- Επαναλήψεις με αυξανόμενες καθυστερήσεις και μέγιστο όριο
- Κάθε εργασία είναι ασφαλής να τρέξει δύο φορές
- Το προγραμματισμένο endpoint προστατεύεται με μυστικό token
- Κάθε εκτέλεση επεξεργάζεται περιορισμένη παρτίδα
- Οι αποτυχημένες εργασίες είναι ορατές, με ειδοποιήσεις
- Το διάστημα του προγράμματος επιλέχθηκε λαμβάνοντας υπόψη το κόστος φιλοξενίας
- Οι ώρες αποθηκεύονται σε UTC
Εργασίες παρασκηνίου στο Mythex
Η τεκμηρίωση του Mythex δεν περιγράφει προγραμματισμένες ή cron εργασίες, και οι δημοσιευμένες εφαρμογές και οι βάσεις τους κοιμούνται όταν είναι αδρανείς και ξυπνούν στο επόμενο αίτημα (δείτε Hosting limits). Γι' αυτό μην βασίζεστε σε χρονιστές μέσα στην εφαρμογή σας. Η προσέγγιση που δουλεύει είναι αυτή που περιγράφηκε παραπάνω: ζητήστε από τον agent έναν πίνακα εργασιών και ένα προστατευμένο με token endpoint, και μετά δείξτε έναν εξωτερικό χρονοπρογραμματιστή στο δημοσιευμένο URL σας. Αποθηκεύστε το token ως μυστικό του έργου, και θυμηθείτε ότι κάθε ξύπνημα ξοδεύει credits για τον χρόνο που η εφαρμογή και η βάση είναι ξύπνιες, άρα διαλέξτε λογικό διάστημα. Αν η εφαρμογή σας χρειάζεται backend API για αυτό, η συνταγή REST API backend είναι αφετηρία, και το πώς να φτιάξετε REST API καλύπτει τον σχεδιασμό των endpoints. Αν τα always-on workers ή τα bots είναι ο πυρήνας του προϊόντος σας, μια φιλοξενία φτιαγμένη για μόνιμες διεργασίες μπορεί να σας ταιριάζει καλύτερα.
Ερωτήσεις
Τι είναι μια εργασία παρασκηνίου;
Μια εργασία παρασκηνίου είναι δουλειά που κάνει η εφαρμογή έξω από το αίτημα για το οποίο περιμένει ο χρήστης, όπως αποστολή email, αλλαγή μεγέθους εικόνων, δημιουργία αναφορών ή συγχρονισμός δεδομένων. Ο χρήστης παίρνει γρήγορη απάντηση, η εργασία τρέχει χωριστά και μπορεί να ξαναδοκιμαστεί αν αποτύχει.
Πώς τρέχω προγραμματισμένη εργασία αν η φιλοξενία μου δεν έχει cron;
Προσθέστε ένα προστατευμένο endpoint που κάνει τη δουλειά, και μετά βάλτε έναν εξωτερικό χρονοπρογραμματιστή να το καλεί σε χρονοδιάγραμμα. Οι επιλογές περιλαμβάνουν ένα προγραμματισμένο workflow του GitHub Actions, μια υπηρεσία cron στο cloud ή τον χρονοπρογραμματιστή του παρόχου cloud σας. Προστατέψτε το endpoint με μυστικό token.
Μπορώ να χρησιμοποιήσω setInterval ή setTimeout για προγραμματισμένες εργασίες;
Μόνο για μικρές, μη σημαντικές εργασίες σε server που τρέχει πάντα. Αν ο server κάνει επανεκκίνηση, μηδενίζεται ή τρέχουν πολλά αντίγραφά του, οι χρονιστές χάνονται ή τρέχουν περισσότερες από μία φορά. Αποθηκεύστε τις προγραμματισμένες εργασίες σε βάση δεδομένων ή χρησιμοποιήστε χρονοπρογραμματιστή.
Υποστηρίζει το Mythex εργασίες cron;
Η τεκμηρίωση του Mythex δεν περιγράφει προγραμματισμένες ή cron εργασίες, και οι δημοσιευμένες εφαρμογές κοιμούνται όταν είναι αδρανείς. Η αξιόπιστη προσέγγιση είναι ένας εξωτερικός χρονοπρογραμματιστής που καλεί ένα προστατευμένο endpoint της εφαρμογής σας, το οποίο ξυπνά την εφαρμογή και εκτελεί τη δουλειά.