Spring Boot WebFlux 端点使用哪个 CoroutineScope

Which CoroutineScope to use for Spring Boot WebFlux endpoint

在 Spring Boot WebFlux 应用程序中,我们有许多端点(REST 和 GraphQL),其中 return 是 MonoFlux 的东西。这些端点调用的代码都是非阻塞的,但我们不想使用反应堆,而是希望使用 Kotlin 协同程序编写所有这些非阻塞代码。我们可以使用 kotlinx.coroutines.reactor.mono() 之类的方法将协程包装在 Mono 中(以及 Flux 结果的相应 flux() 方法)。

不过,为了调用这些方法,我们首先需要一个 CoroutineScope 来包装整个请求(并处理诸如取消主 "entry point" 协程启动的任何子协程之类的事情)。这里似乎有几种选择。例如,我们可以构造一个新的 CoroutineScope 并选择一个调度程序,例如CoroutineScope(Dispatchers.Default).mono {...。或者我们可以构造我们自己的 class 来代表整个 HTTP 请求,并让那个实现 CoroutineScope,如 here 所示 Android Activity.

这个问题中隐含的是选择应该在哪个线程(或线程池)上执行工作。我们可以自己创建一个线程池,但是 Spring Boot WebFlux 已经创建了自己的线程池来在非阻塞环境中处理 HTTP 请求,所以最好尝试留在当前线程(或那个线程池)?如果那是最好的方法,有没有办法进入那个线程池并让协程到运行?

由于在SpringWebFlux中,HTTP交换不是针对特定线程的,GlobalScope.mono(Dispatchers.Unconfined)可能是最好的选择。

请注意,Dispatchers.Unconfined 是一个实验性 API,协程通道 API 将深受 lazy iterable streams. So I would advise you to wait Spring official support for Coroutines 任何生产代码的影响。