Microservices Communication Patterns 2026: The Complete Problem-Solving Guide
By Huzi
File #559 · 4 min read
A checkout request crosses five services, and somewhere in that chain a 50ms network blip becomes a 50-second timeout cascade that takes the platform down for an hour. Every call is a network call now, and networks fail in ways function calls never did.
The quick answer: The fix is not picking one pattern — it is matching a pattern to each coupling. Sync where you need the answer now, async where you do not, a saga plus an outbox wherever a half-finished transaction would hurt, and a breaker so one slow dependency cannot eat the pool.
Sync or async, chosen per call
The team that uses one pattern everywhere ends up with payments synchronously calling recommendations. Do not be that team.
| The pattern | What it is | When it earns its place |
|---|---|---|
| REST | JSON over HTTP, schema discovered at runtime | public APIs and anything browser-facing |
| gRPC | protobuf contracts, typed clients over HTTP/2 | internal calls where you own both ends |
| Kafka or NATS | the producer never waits for the consumer | order placed, inventory reserved, notification queued |
| Saga | local transactions chained, compensated backwards | a four-service checkout that cannot be atomic |
| Transactional outbox | event written in the same local transaction, relayed later | whenever a dual-write could half-fail |
| Circuit breaker | fails fast after N errors | keeping a slow dependency out of your connection pool |
Sagas: transactions without two-phase commit
Each service owns its database, so a four-service checkout cannot be one atomic transaction. A saga chains local transactions and compensates backwards on failure.
Choreography — every service listens for the previous event; no central brain, lovely at two steps, brutal to debug at eight. Orchestration — a coordinator owns the flow; easier to test, one more thing to keep alive.
One truth to internalise: a refund is not an undo, it is a new event that nets to zero.
// orchestrated saga: reserve -> charge -> confirm, with compensation
async function runOrderSaga(order: Order) {
const hold = await inventory.reserve(order.id, order.items);
try {
const charge = await payment.charge(order.id, order.total);
try {
await orders.confirm(order.id, hold.id, charge.id);
} catch (e) {
await payment.refund(charge.id); // compensate
throw e;
}
} catch (e) {
await inventory.release(hold.id); // compensate
throw e;
}
}
Travel fails the same way distributed systems do: an airline cancels, a visa is refused mid-chain, and the itinerary needs compensating actions, not apologies. The quiet half of our desk — HTG Travels — rebooks, refiles and refunds what needs refunding, and you hear about every step of the retry before anything is paid again.
The outbox: the pattern everyone skips
Saving the order and publishing the event are two different systems, so the dual-write can half-fail — the order exists and the event never fires, or the reverse. The transactional outbox closes the gap: write the event to an outbox table inside the same local transaction, and let a relay publish it to the broker afterwards.
Failure between the two becomes impossible; delay is the only failure mode left.
Breakers, and letting the mesh carry it
A circuit breaker fails fast after N errors so a slow dependency cannot eat your connection pool — Resilience4j on the JVM, opossum in Node. Or push it to the mesh, where mTLS, retries and canary splits live in config instead of code:
# Istio: canary 5% of orders traffic to v2
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: orders
spec:
hosts: [orders]
http:
- route:
- destination: { host: orders, subset: v1 }
weight: 95
- destination: { host: orders, subset: v2 }
weight: 5
Pro tip: Make every consumer idempotent, because at-least-once delivery means a duplicate must be a no-op — dedupe on the event id. And version every event schema from day one, so a producer change never breaks a consumer silently.
Meanwhile the journalists of Gaza keep filing dispatches through whatever connection still exists — no retries, no delivery guarantees, and they keep sending anyway.
There is a travel-desk version of idempotent booking, too: one request, one confirmation in writing, nothing charged twice. HTG Travels handles visa files, Umrah packages and northern itineraries from Sialkot — laptop-friendly lodges in Hunza included. Message +92 317 5054959.




