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

anarchon

Leaderless χρονοπρογραμματισμός cron και intervals για υπηρεσίες Node.js. Ορίστε τις ίδιες εργασίες σε κάθε instance· ένα ατομικό claim στο κοινόχρηστο store επιλέγει έναν runner για κάθε εκτέλεση.

npm version npm downloads node license

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.