Archives
All the articles I've archived.
-
Putting Workron on Kubernetes: The Integration Bug Unit Tests Couldn't Reach
Deploying Workron to a local Kubernetes cluster as the first real integration test, and the JSON tag mismatch the cluster surfaced in five minutes.
-
Draining the Gang: Coordinated Preemption with Checkpoint/Resume
Updated:Closing the stuck-gang gap: a coordinated drain path where one task's failure pulls its siblings down cleanly, with a retry-budget refund and opaque checkpoints that survive the round-trip.
-
All or Nothing: Gang Scheduling in Workron
Adding gang scheduling to Workron: a reserved state, an admission cycle that places N tasks simultaneously, and why running siblings are left untouched when one task fails.
-
Making the Invisible Visible: Structured Logging, Metrics, and Request Tracing
Replacing log.Printf with slog, adding Prometheus metrics, and building request ID tracing. How observability turned Workron from a system that works into one that explains itself.
-
From SQLite to PostgreSQL: Unlocking Concurrent Job Claiming with SKIP LOCKED
Why I went back on my own decision to stop at SQLite, what FOR UPDATE SKIP LOCKED actually does, and how context.Context propagation turned a one-file change into a twenty-file refactor.
-
DAG Dependencies: Teaching a Job Scheduler to Wait
Adding job dependencies to Workron — a new status, a cycle detection algorithm that guards against a problem that can't happen yet, and a SQL trick for querying into JSON arrays.
-
Surviving the Crash: Adding SQLite Persistence Without Touching Business Logic
Swapping Workron's in-memory store for SQLite, and the interface design that made it a one-file change outside the store package.
-
Splitting and Surviving Failures: HTTP Workers and Heartbeat Detection in Go
Updated:Splitting Workron into separate binaries, then solving the harder problem: detecting when a worker dies mid-job without telling anyone.
-
Building the Concurrent Monolith: Atomic Job Claiming in Go
Updated:How to build a job queue where multiple goroutines compete for work without stepping on each other, mutex-protected maps, atomic claiming, and retry logic.
-
Before the Code: Designing a Distributed Job Scheduler in Go
Updated:Architectural decisions, trade-offs, and the blueprint behind building a job scheduler from scratch.