Simpan tugasan dalam time-bucketed / priority queue berkunci mengikut masa jatuh tempo, poll hanya tugasan yang jatuh tempo sekarang, dan serahkannya kepada worker idempotent dengan penghantaran at-least-once. Jangan sekali-kali imbas 10J baris setiap tik — index mengikut masa cetusan supaya setiap poll hanya menyentuh apa yang jatuh tempo.
Seni bina
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
