The flow control problem
On the one hand, the preceding explanation may have taught us that the central reason to embrace the PUSH model was the optimization of the overall processing time by decreasing the amount of asking to the very minimum. That is why the RxJava 1.x and similar libraries were designed for pushing data, and that is why streaming became a valuable technique for communication between components within a distributed system.
On the other hand, in combination with only the PUSH model, that technique has its limitations. As we might remember from Chapter 1, Why Reactive Spring?, the nature of message-driven communication assumes that as a response to the request, the service may receive an asynchronous, potentially infinite stream of messages. That is the tricky part because if a producer disrespects the consumer's throughput possibility it may affect the overall system stability in ways described in the following two sections.