我们必须在WebFlux中编写反应式代码吗?

时间:2018-07-27 15:27:40

标签: java spring spring-webflux project-reactor reactive

我知道反应式控制器应该返回Flux<T>Mono<T>,这意味着它在http处理程序级别是反应式的。

但是,如果我们在具有非反应性代码的控制器中进行外部http调用,而该代码必须等待很长的时间,直到该http调用响应,该怎么办?如果10000个用户同时使用http调用此控制器,会发生什么情况?假设只有一个线程来处理控制器中的代码,那么在IO期间是否会处理更多请求?

如果没有,我们是否必须使用反应性代码(例如,WebClientReactiveRepository)来在数据库上调用外部http API和CRUD?

如果是,该如何实施?因为这只是几行非反应性代码,所以Java如何知道“嘿,它正在等待响应,让我们先处理另一个事件”?

2 个答案:

答案 0 :(得分:1)

禁止在反应式管道中阻塞I / O(例如,反应式控制器方法);如果使用block运算符,这样做可能会导致运行时出现严重问题,甚至导致终端错误。

Reactor提供了基础结构来包装阻塞调用并安排在特定线程上工作的调度。请参阅反应堆参考文档中的How do I wrap a synchronous, blocking call部分。这样做会起作用,但可能会对性能产生负面影响。

答案 1 :(得分:0)

我自己做了一个实验,看起来我们必须在WebFlux中使用反应性代码,以便所有内容都是反应性的,并且性能确实很高