Αποθηκεύστε τα tasks σε μια time-bucketed / priority queue με κλειδί τον χρόνο εκτέλεσης, κάντε poll μόνο τα tasks που πρέπει να εκτελεστούν τώρα, και δώστε τα σε idempotent workers με at-least-once delivery. Μην κάνετε ποτέ scan 10 εκατομμύρια rows σε κάθε tick — κάντε index με βάση τον χρόνο εκτέλεσης ώστε κάθε poll να αγγίζει μόνο ό,τι είναι due.
Αρχιτεκτονική
API ─▶ Task store (DB/Redis ZSET, score = due_ts) ── 10M tasks, sharded
│
Poller (leader per partition) ── ZPOPMIN due<=now ──▶ Ready queue (Kafka)
│ leader election (etcd/ZK) │
▼ ▼
other pollers idle/standby Worker pool (idempotent)
└─ ack ✔ / retry ✖ ─▶ DLQ
