gRPC vs REST vs GraphQL: Notes From Three Different Teams' Choices
Each team chose a different API style and each has regrets. An honest retrospective on the trade-offs that emerged in practice rather than in architecture diagrams.
Clean code practices, system design, architecture patterns, and development methodologies
Three cache layers with independent invalidation strategies produce stale data in combinations that are hard to reproduce. A coherency model and the incidents it prevents.
Each team chose a different API style and each has regrets. An honest retrospective on the trade-offs that emerged in practice rather than in architecture diagrams.
Token bucket and sliding window algorithms have different fairness properties under burst traffic. The Redis Lua script that got us from theory to production.
k6's JavaScript API makes it easy to script ramp-up, spike, and soak tests. Realistic traffic patterns — mixed authenticated and anonymous — reveal different bottlenecks than synthetic ones.
Autovacuum's defaults were designed for small databases. A few parameters make a large difference at scale — and the documentation buries the relevant ones.
The default glibc allocator is fine for most workloads. For multi-threaded services with specific allocation patterns, jemalloc, tcmalloc, and mimalloc offer measurable improvements in different areas.
Hystrix is in maintenance mode. Resilience4j and Polly cover the same patterns with active maintenance. A migration guide and a reconsideration of which circuit breaker settings matter.
Dead tuples from MVCC accumulate in indexes differently than in tables. We hit a production stall from index bloat on a 400 GB table. Here is how we diagnosed and fixed it.
Architecture diagrams that live in a wiki fall out of date. PlantUML in the repository with a CI check that renders diagrams keeps them honest — imperfectly, but better than the alternative.
Terraform state drift from manual console changes caused a partial outage during a routine apply. The detection tooling and PR policy that prevents recurrence.
Adding a column with a default is instant in Postgres 11+. Dropping a NOT NULL constraint still locks. A migration sequencing guide for high-traffic tables.
Security work competes with feature delivery on the same roadmap. A structured approach to making the trade-off explicit and defensible to both engineering and product.