เก็บ task ไว้ใน time-bucketed / priority queue ที่ใช้เวลาครบกำหนดเป็น key, poll เฉพาะ task ที่ครบกำหนด ตอนนี้ แล้วส่งให้ worker ที่ idempotent ด้วยการส่งแบบ at-least-once อย่าสแกน 10M row ทุก tick — ทำ index ตาม fire time เพื่อให้แต่ละ poll แตะเฉพาะสิ่งที่ครบกำหนด
สถาปัตยกรรม
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
