The summary.
THEY TRADE ONE SIMPLE PROBLEM FOR SEVERAL HARDER ONES
Network calls where there were function calls, distributed failure, operational complexity, consistency problems and difficult debugging.
Start with a well-structured single application. Boundaries are discovered by building, and splitting on the wrong ones is worse than not splitting.
EACH SERVICE OWNS ITS DATA, EXCLUSIVELY
A shared database couples services and defeats the point entirely. No service reads another's tables.
SERVICES THAT MUST ALWAYS DEPLOY TOGETHER ARE ONE SERVICE
As is any change requiring modifications across several. Reconsider the boundary.
EVERY SYNCHRONOUS DEPENDENCY IS A WAY YOUR SERVICE FAILS
Prefer asynchronous messaging where an immediate answer is not required, and always set timeouts, retries with increasing delay, and a circuit breaker.
Ensure operations are safe to repeat — retries happen.
ANYTHING REQUIRING TRANSACTIONAL CONSISTENCY STAYS IN ONE SERVICE
That requirement is a strong argument against splitting at that boundary.
PROPAGATE A CORRELATION IDENTIFIER THROUGH EVERY CALL
Without it, diagnosing a distributed failure is guesswork. And measure the slow end of latency, not the average.