Shranite opravila v časovno segmentirano (time-bucketed) / prioritetno vrsto, ključeno po času zapadlosti, poizvedujte le opravila, ki zapadejo zdaj, in jih predajte idempotentnim delavcem z at-least-once dostavo. Nikoli ne skenirajte 10M vrstic ob vsakem tiku — indeksirajte po času proženja (fire time), tako da vsaka poizvedba dotakne le tisto, kar zapade.
Arhitektura
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
