我知道反应式控制器应该返回Flux<T>
或Mono<T>
,这意味着它在http处理程序级别是反应式的。
但是,如果我们在具有非反应性代码的控制器中进行外部http调用,而该代码必须等待很长的时间,直到该http调用响应,该怎么办?如果10000个用户同时使用http调用此控制器,会发生什么情况?假设只有一个线程来处理控制器中的代码,那么在IO期间是否会处理更多请求?
如果没有,我们是否必须使用反应性代码(例如,WebClient
和ReactiveRepository
)来在数据库上调用外部http API和CRUD?
如果是,该如何实施?因为这只是几行非反应性代码,所以Java如何知道“嘿,它正在等待响应,让我们先处理另一个事件”?
答案 0 :(得分:1)
禁止在反应式管道中阻塞I / O(例如,反应式控制器方法);如果使用block
运算符,这样做可能会导致运行时出现严重问题,甚至导致终端错误。
Reactor提供了基础结构来包装阻塞调用并安排在特定线程上工作的调度。请参阅反应堆参考文档中的How do I wrap a synchronous, blocking call部分。这样做会起作用,但可能会对性能产生负面影响。
答案 1 :(得分:0)
我自己做了一个实验,看起来我们必须在WebFlux中使用反应性代码,以便所有内容都是反应性的,并且性能确实很高