Your OrderService saves to Postgres and publishes to Kafka — two systems, no shared transaction. There is no safe order to do them in. The outbox pattern makes the write atomic and lets the broker catch up. Here's how, with the relay tradeoffs and the guarantees you actually get.
A slow request crosses five microservices and you have five log streams that don't talk to each other. This is how OpenTelemetry traces turn 'somewhere it's slow' into 'the inventory service's DB call took 1.74s on this exact request' — including context propagation, sampling, and the gotchas that split your trace in two.
Placing an order touches four services and four databases. There's no @Transactional block stretched across all of them. So what happens when payment succeeds but inventory is empty? Here's the saga pattern, its two flavors, and the hard truths nobody warns you about.
Stop the thirty-PR CVE fire drill. How to centralize dependency versions across a microservice fleet using a Maven BOM or Gradle version catalog.
How to migrate a Spring Boot microservice fleet from Java 8 to Java 17 without downtime — the four layers, the order, the land mines, and the metric.
How to package global exception handling as a Spring Boot starter for a microservice fleet — RFC 7807 responses, no leaked stack traces, one dependency.