Choose synchronous calls deliberately
Use synchronous communication when the caller needs an immediate authoritative answer. Keep call chains short, apply timeouts and avoid making one user request depend on an uncontrolled number of downstream services.
Use events for decoupling—not as decoration
Events are valuable when work can complete later, multiple consumers need the same fact, or downstream capacity varies. Each event needs a clear schema, ownership, retry policy and idempotent consumer behavior.
Define consistency per workflow
Financial balances may require strong invariants, while notification delivery can tolerate eventual consistency. A mature design states these requirements explicitly instead of applying one consistency model everywhere.
Design for load and recovery
Horizontal scaling helps only when state, partitions, caches and external dependencies are considered. Performance tests should include downstream slowness, queue buildup and restart recovery—not only ideal request throughput.
Security and compliance
Authentication, authorization, secrets management, encryption, audit records and location or fraud checks belong in the architecture model. They should not appear as an appendix after the system is built.