我们必须在 WebFlux 中编写响应式代码吗?
Do we have to write reactive code inside WebFlux?
我知道反应式控制器应该 return Flux<T>
或 Mono<T>
,这意味着它在 http 处理程序级别上是反应式的。
但是如果我们在控制器中使用非反应性代码进行外部http调用,这必须等待很长时间IO在那个http调用响应之前,如果10000个用户同时使用http调用这个controller会怎样?假设只有 one 线程来处理控制器内部的代码,那么在 IO 期间会处理 more 请求吗?
如果不是,我们是否必须使用WebClient
和ReactiveRepository
等响应式代码来调用外部httpAPI和CRUD数据库?
如果是,如何实施?因为它只是几行非反应性代码,所以 Java 怎么知道 "hey, it's waiting for response, let's handle another event first"?
我自己做了一个实验,看起来我们必须在 WebFlux 中使用响应式代码,这样一切都是响应式的,性能非常高
禁止在反应式管道(例如反应式控制器方法)中进行阻塞 I/O;如果使用 block
运算符,这样做可能会导致运行时出现严重问题,甚至出现终端错误。
Reactor 提供基础结构来包装阻塞调用并安排在特定线程上工作。请参阅反应器参考文档中的 How do I wrap a synchronous, blocking call 部分。这样做会奏效,但可能会对性能产生负面影响。
我知道反应式控制器应该 return Flux<T>
或 Mono<T>
,这意味着它在 http 处理程序级别上是反应式的。
但是如果我们在控制器中使用非反应性代码进行外部http调用,这必须等待很长时间IO在那个http调用响应之前,如果10000个用户同时使用http调用这个controller会怎样?假设只有 one 线程来处理控制器内部的代码,那么在 IO 期间会处理 more 请求吗?
如果不是,我们是否必须使用WebClient
和ReactiveRepository
等响应式代码来调用外部httpAPI和CRUD数据库?
如果是,如何实施?因为它只是几行非反应性代码,所以 Java 怎么知道 "hey, it's waiting for response, let's handle another event first"?
我自己做了一个实验,看起来我们必须在 WebFlux 中使用响应式代码,这样一切都是响应式的,性能非常高
禁止在反应式管道(例如反应式控制器方法)中进行阻塞 I/O;如果使用 block
运算符,这样做可能会导致运行时出现严重问题,甚至出现终端错误。
Reactor 提供基础结构来包装阻塞调用并安排在特定线程上工作。请参阅反应器参考文档中的 How do I wrap a synchronous, blocking call 部分。这样做会奏效,但可能会对性能产生负面影响。