把任务存储在按到期时间为键的时间分桶 / 优先队列中,只轮询当前到期的任务,并以 at-least-once 投递交给幂等的 worker。绝不要每个 tick 都扫描 1000 万行——按触发时间建立 index,使每次轮询只触及到期的任务。
架构
text
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
