- need complex circuit breaker patterns to deal with API call failures
- overall uptime is affected by direct dependencies on a graph of synchronous calls (you are at the mercy of the other APIs for your own uptime)
- latency can increase as what could be done asynchronously is done synchronously
- developing and testing microservices becomes difficult because of so many dependencies. You start having to develop your own service stubs or evening running the other services.
Microservices are about independently deployable units. When you isolate services via message queues you can create services that have many fewer runtime dependencies which can lead to greater decoupling, greater reliability and easier development/testing. You are less likely to end up with a distributed monolith also.