Saugokite užduotis pagal laiką suskaidytoje / prioritetinėje eilėje, indeksuotoje pagal terminą, apklauskite tik užduotis, kurių terminas dabar, ir perduokite jas idempotentiškiems workeriams su at-least-once pristatymu. Niekada neskenuokite 10 mln. eilučių kiekvieną tiką — indeksuokite pagal suveikimo laiką, kad kiekviena apklausa liestų tik tai, kam atėjo terminas.
Architektūra
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
