タスクを実行予定時刻をキーとするタイムバケット化 / 優先度キューに保存し、今実行すべきタスクだけをポーリングし、at-least-once配信で冪等なworkerに渡します。ティックごとに1000万行をスキャンしてはいけません。実行時刻でインデックスを張り、各ポーリングが期限到来分のみに触れるようにします。
アーキテクチャ
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
