Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring MVC (async) vs Spring WebFlux

I'm trying to understand Spring WebFlux. The things I've found so far are reactive at the core, no Servlet API, no thread per request, HTTP 2, server pushes, application/stream+json.

But what is the difference between asynchronous calls in Spring MVC? I mean in Spring MVC when you return Future, DefferedResult and etc you get logic in the request handler (controller method) executed in a separate thread, so you can benefit from saving thread pool resources for dispatching requests as well.

So could you please highlight differences related to that? Why WebFlux is better here?

Thank you for your time very much!

like image 720
Dmitry Senkovich Avatar asked Oct 06 '17 12:10

Dmitry Senkovich


People also ask

Is Spring WebFlux better than Spring MVC?

Regarding scalability, Spring Async gives us better results than synchronous Spring MVC implementation. Spring WebFlux, because of its reactive nature, provides us elasticity and higher availability.

What is difference between Spring WebFlux and MVC?

The main difference between the two frameworks is that spring-mvc is based on thread pools, while spring-webflux is based on event-loop mechanism. Both the models support commonly used annotations such as @Controller . A developer can run a reactive client from a spring-mvc controller to make calls to remote services.

Can I use Spring MVC and WebFlux together?

both infrastructure will compete for the same job (for example, serving static resources, the mappings, etc) mixing both runtime models within the same container is not a good idea and is likely to perform badly or just not work at all.

Is Spring MVC an asynchronous?

Spring MVC async relies on Servlet APIs which only provides async behavior between container threads and request processing threads but not end to end.


2 Answers

The Servlet async model introduces an async boundary between the container threads (1 Servlet request/thread model) and the processing of the request in your application. Processing can happen on a different thread or wait. In the end, you have to dispatch back to a container thread and read/write in a blocking way (InputStream and OutputStream are inherently blocking APIs).

With that model, you need many threads to achieve concurrency (because many of those can be blocked waiting for I/O). This costs resources and it can be a tradeoff, depending on your use case.

With non-blocking code, you only need a few threads to process a lot of requests concurrently. This is a different concurrency model; like any model, there are benefits and tradeoffs coming with it.

For more information about that comparison, this Servlet vs. Reactive stacks talk should be of interest.

like image 86
Brian Clozel Avatar answered Sep 18 '22 14:09

Brian Clozel


Servlet API is blocking I/O which requires 1 thread per HTTP request. Spring MVC async relies on Servlet APIs which only provides async behavior between container threads and request processing threads but not end to end.

Spring WebFlux on the other hand achieves concurrency by a fixed number of threads by using HTTP sockets and pushing chunks of data at a time through the sockets. This mechanism is called event loop, an idea made popular by Node.js. Such an approach is scalable and resilient. Spring 5's spring-webflux uses the event loop approach to provide async behavior.

More can be read from

  • Servlet vs. Reactive
  • Spring Boot performance battle
  • Comparing WebFlux with Spring Web MVC
like image 21
Javed Afroz Avatar answered Sep 18 '22 14:09

Javed Afroz