API Gateway
A single, hardened entry point for your microservices: centralize routing, auth, TLS, and rate limiting so clients stay simple and services stay focused.
Every pattern includes the case against using it. Start there.
A single, hardened entry point for your microservices: centralize routing, auth, TLS, and rate limiting so clients stay simple and services stay focused.
Stop cascading failures from taking down your system. How the Circuit Breaker pattern trades slow timeouts for fast, honest failure — with a correct TypeScript implementation.
The first resilience pattern everyone writes and the one most often written wrong: why naive retries amplify outages, and how backoff, jitter, budgets, and idempotency turn a retry into a safe one.
How services find each other when instances come and go. Client-side vs. server-side discovery, the registry as source of truth, and why health checking is the hard part — with a correct TypeScript client-side resolver.
Let a control loop add and remove capacity in response to live demand — so you pay for load you actually have, not load you might one day see, and the system rides out spikes without a human awake to notice.
Run two identical production environments, deploy to the idle one, and cut over by flipping a router — so release and rollback are a single instant switch, and the database migration is the part that actually bites.
Ship a new version to a small slice of real traffic, compare it against a baseline on live signals, and promote or roll back on evidence — progressive delivery where the release decision is made by data, not by nerve.
Spreading traffic across replicas is easy; choosing well under real conditions is not. Algorithms, L4 vs L7, health checks, session affinity, and why the best-informed strategy often fails worst.
Hand the provider your code and the event that triggers it: they run it on demand, bill per invocation, and scale to zero when idle — so you own the business logic and none of the servers under it.
Lazy-load data into a cache the application controls, keep the database as source of truth, and treat invalidation as the hard part — the stampede and the stale-write race — with a correct TypeScript loader.
Command Query Responsibility Segregation splits the write and read sides of a system so each can be modeled, scaled, and optimized independently — without inheriting Event Sourcing.
The default data-access pattern as a deliberate choice, not an absence of one: what one shared model buys you, the four failure modes that eventually break it, and the signals you have outgrown it.
Store state as an append-only log of immutable events, not a mutable row. Rebuild any past state, get audit for free, and pay for it in query and versioning complexity.
The textbook protocol for atomic commit across multiple resources: how prepare-then-commit works, why a coordinator crash can block participants indefinitely, and where 2PC is still the right answer.
Put a durable buffer between the work and the workers: producers enqueue a task and move on, a pool of competing consumers pulls each task once, and the queue absorbs the spike neither side could survive alone.
The publish/subscribe pattern decouples producers from consumers through a broker, enabling fan-out messaging, independent scaling, and resilient async integration.
How to hold a business transaction together across services when there is no distributed lock to save you: compensation, orchestration vs choreography, and semantic locks.