Idempotent consumers, without the ceremony
What actually happens when the same message arrives twice, and the smallest set of changes that makes a consumer safe to retry.
Notes from building backend systems: what I designed, what broke, and the reasoning I wish I had written down the first time.
Topics
Not tutorials. Working notes: what I tried, what it cost, and what I would tell myself before starting.
Agents, LLMs, RAG and AI architecture — what I build, test and break.
Distributed systems, databases, messaging, caching and scaling.
Working references from Java, Spring, PostgreSQL, Kafka, Redis and Kubernetes.
Full write-ups from problem to trade-offs, with the diagrams to match.
Latest
Newest first. Some are finished thoughts, others are still moving.
What actually happens when the same message arrives twice, and the smallest set of changes that makes a consumer safe to retry.
I assumed the model would use the tools sensibly. It did not. What changed once I started designing tools the way I design an API: narrower inputs, typed arguments, and error messages written for the model rather than for me.
Three index changes that looked obvious in review and cost more than they saved once real traffic arrived.
The smallest useful implementation, the two parameters that matter, and how wrong the false-positive rate gets when you guess them.
Two words used interchangeably in meetings, and the operational difference that makes them not the same thing at all.
Cache-aside looked simple until two writers raced. What I changed, and what I would measure before adding a cache next time.
Not a benchmark. A comparison of the questions each one makes you answer: about ordering, replay, consumers and who owns the offset.
Executors, CompletableFuture and virtual threads — written down so I stop rediscovering the same three pitfalls.
Less about the hype, more about a specific kind of repetitive work I would like a program to take off my hands.
A month of letting an assistant write most of the first draft: where it saved hours, and where it cost me a weekend.
Two weeks on a deadlock that turned out to be a lock-ordering mistake in code I had reviewed twice.
Next
I am always up for a conversation about architecture, trade-offs, or a bug that refuses to die.
Start a conversation