Χωρίς εκλογή leader
Δεν εκλέγεται τίποτα. Μία ατομική κλήση στο store αποφασίζει ποιος εκτελεί κάθε φορά, και μια τυχαία καθυστέρηση (jitter) κατανέμει το φορτίο μεταξύ των instances.
import { RedisBackend, Scheduler } from 'anarchon';
const scheduler = new Scheduler({ backend: new RedisBackend({ redis: 'redis://localhost:6379' }) });
scheduler .every('sync', '10s', async (ctx) => { /* ... */ }) .cron('digest', '0 8 * * 1-5', async (ctx) => { /* ... */ }, { timezone: 'Europe/Athens' });
await scheduler.start();Τρέξτε αυτόν τον κώδικα σε τρία instances, και ένα instance εκτελεί το “sync” κάθε 10 δευτερόλεπτα, όχι και τα τρία.
flowchart LR
subgraph service["Η υπηρεσία σας, 3 instances"]
A["Instance A"]
B["Instance B"]
C["Instance C"]
end
S[("Redis, Valkey,<br/>PostgreSQL ή SQLite")]
A -- "claim την εκτέλεση 12:00:10" --> S
B -- "claim την εκτέλεση 12:00:10" --> S
C -- "claim την εκτέλεση 12:00:10" --> S
S -- "won" --> B
S -. "taken" .-> A
S -. "taken" .-> C
Χωρίς εκλογή leader
Δεν εκλέγεται τίποτα. Μία ατομική κλήση στο store αποφασίζει ποιος εκτελεί κάθε φορά, και μια τυχαία καθυστέρηση (jitter) κατανέμει το φορτίο μεταξύ των instances.
Ανάκαμψη όταν αποτύχει ο runner
Σε Redis, Valkey, PostgreSQL και SQLite ο νικητής ανανεώνει μια μίσθωση (lease) όσο εκτελείται η εργασία. Αν καταρρεύσει ή παγώσει, ένα άλλο instance ξεκινά την εκτέλεση από την αρχή ως νέα προσπάθεια, επομένως οι handlers πρέπει να αντέχουν επαναλήψεις. Το RabbitMQ και το NATS επιλέγουν μόνο τον νικητή.
Οι μακριές εργασίες δεν συσσωρεύονται
Στα lease backends, η επόμενη εκτέλεση μιας εργασίας παραλείπεται όσο η τρέχουσα κρατά ενεργή μίσθωση. Ένας παγωμένος runner μπορεί να επικαλυφθεί για λίγο με το instance που τον αντικατέστησε.
Ανάκτηση μετά από downtime
Στα lease backends, η πιο πρόσφατη εκτέλεση που έπρεπε να τρέξει ενώ όλα τα instances ήταν εκτός λειτουργίας εκτελείται μόλις επανέλθει το πρώτο, αν έπρεπε να τρέξει εντός του catchUpMs (5 λεπτά από προεπιλογή). Οι παλαιότερες εκτελέσεις δεν επαναλαμβάνονται.
Το anarchon δεν εγγυάται exactly-once παρενέργειες. Η σελίδα Εγγυήσεις και όρια αναφέρει τι ισχύει σε κάθε backend.