When two components such as microservices are communicating with each other, the usual communication mechanism is the traditional, synchronous HTTP request, which consists of component A sending a request via HTTP and waiting for component B to respond.
The approach has a wide range of benefits, such as:
Immediate response: the caller blocks until its request gets processed
Immediate error feedback: both components can deal with failures once the failure happens
No extra infrastructure: you need to implement the endpoints, auth, error handling, and so on, but you don't need to configure an external service or platform
The traditional approach has several benefits, but what happens if the component needs to perform a large number of operations? What if it doesn't need to wait until every integration with an external system finishes? What if you don't want the temporal coupling? What about cascading failures, when component A calls component B that calls component C and so on?…