Distributed Systems

Dynamo: Amazon's highly available key-value store

Key takeaways from Amazon's 2007 Dynamo paper.

Stacked log lines considered harmful

Why logging at every layer of a service produces noise, and how to log only at the handler level while propagating context from below.

Testing unary gRPC services in Go

How to test unary gRPC services in Go - handler logic, interceptors, deadlines, metadata propagation, and rich error details - all in-memory with bufconn.

Is passing user ID through context an antipattern?

Why the middleware-to-handler boundary is a special case for context values.

What belongs in Go's context values?

A simple litmus test for when to use context values in Go.

Wrapping a gRPC client in Go

How to wrap a generated gRPC client behind a clean Go API so users never have to touch protobuf types or connection management directly.

In praise of the etcd codebase

Why the etcd codebase is my go-to reference for building gRPC services in Go.

Tap compare testing for service migration

Master shadow testing for large-scale system migrations. Learn to safely rewrite services by comparing outputs between old and new implementations.

Gateway pattern for external service calls

Separate business logic from external service calls using the Gateway pattern. Apply dependency inversion and interface segregation in Go.

Notes on building event-driven systems

Deep dive into event-driven architecture patterns. Learn publish-subscribe, CQRS, outbox pattern, eventual consistency, and handling microservice coupling.

Protobuffed contracts

Define service contracts with Protocol Buffers for non-gRPC systems. Generate serializers, maintain self-documented APIs, and ensure cross-language compatibility.