Speichere Tasks in einer zeit-gebucketten / Priority Queue, gekeyt nach Fälligkeitszeit, polle nur die jetzt fälligen Tasks und übergib sie idempotenten Workern mit At-least-once-Zustellung. Scanne niemals bei jedem Tick 10 Mio. Rows - indexiere nach Feuerzeit, sodass jeder Poll nur das Fällige berührt.
Architektur
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
