Posts
All the articles I've posted.
We moved our page cache to R2, then deleted it
4 min readR2 charges 12.5 times more for a write than a read. Rendered HTML that revalidates on a timer is the worst workload for that pricing, and images are the best.
Your error handler is inside the cache
3 min readA thirty-second backend restart became an hour of 404s, because a try/catch inside a "use cache" function cached the failure as a value.
Keep the model call off the request path
3 min readA per-instance throttle limited nothing and blocked the job meant to recover from quota exhaustion. Removing the request path's ability to generate fixed both.
Idempotent writes don't make side effects idempotent
4 min readMaking an offline-first upsert safe to replay took an afternoon. The streak, points, awards and celebration it triggers each needed their own guard.