Traditional Java applications use thread pools for simultaneous I/O operations (such as a REST call). Each request consumes a thread freed at the end of the processing only. So, whenever the thread pool is empty, new requests are blocked waiting for an available thread. This programming paradigm is called imperative or blocking.
What is reactive programming?
It is a programming paradigm based on the data transmission from one or more sources called Publishers to other elements called Subscribers in an asynchronous, non-blocking, and functional way. Streams combined with the Observable design pattern process all types of data.
How to use it?
RxJava or Project Reactor - used in Spring WebFlux - are two common choices to implement Reactive programming.
- Precise, concise, and cleaner code
- Non-blocking asynchronous requests
- Mainly increases resource usage on multi-core and multi-CPU hardware
- Increase developer productivity
- Reactive systems come with improved scalability and resilience
- Uses more memory to store data streams most of the time
- Increased cost of debugging
- Steep learning curve
- Lack of quality and easy-to-read resources
- Often confused to be equivalent to functional reactive programming
I think the reactive paradigm is a great choice when the application satisfies the following two conditions:
- reactive libraries are available for all the external services called
- must be able to support a high number of simultaneous connections