Numbered arrow / data-flow reference
01 · client → config — passes data
02 · config → db — persist definitions
03 · db → relay — indexed upcoming runs
04 · db → dispatch — bounded fallback if Redis fails
05 · relay → redis — passes data
06 · redis → dispatch — due IDs
07 · dispatch → claim — only Lua winner proceeds
08 · claim → db — atomic claim
09 · claim → outbox — passes data
10 · outbox → queue — passes data
11 · queue → workers — passes data
12 · workers → db — status, lease
13 · workers → logs — passes data
14 · workers → monitor — passes data
End-to-end: Client → Job Management API → PostgreSQL → Relay (5-minute lookahead) → Redis sorted sets → Task Execution Service (Lua reservation) → PostgreSQL atomic claim + outbox → queue → leased workers → completion history.
Correctness: One occurrence = unique (jobId, scheduledAt, version). A Redis reservation reduces contenders but never replaces the authoritative PostgreSQL claim. Claim and outbox insert commit together. The outbox relay may publish twice; consumers must deduplicate attempts.
Worker crash: RUNNING lease + heartbeat → expiry → recovery worker atomically acquires a newer attempt → same idempotency key to external provider → durable COMPLETED, then queue ACK. Never claim true exactly-once arbitrary side effects.
Redis outage: bounded indexed DB scan of due occurrences, then refill only eligible future SCHEDULED occurrences; throttle warmup to protect PostgreSQL.
Cancellation: update PostgreSQL config version/status; event invalidates Redis; DB claim validates version/status atomically. Running jobs use cooperative cancellation.
Capacity: 10M new jobs/day × 100KB ≈ 1TB raw/day; 100M active ≈ 10TB raw. 10M midnight jobs within +5s requires ≈2M starts/s (40× normal 50K peak). Prioritize durability, relax punctuality under overload.
Revision gap: Strong worker-crash reasoning during deep dive (9/10), but final summary forgot lease recovery and durable outbox. Rehearse both without prompts. Overall 7.5/10, borderline Lean Hire (Senior), Staff not yet proven.