Quarkus RESTEasy reactive 在 2.2 版之前是如何工作的?
How Quarkus RESTEasy reactive works before version 2.2?
我们目前使用的是旧版本的 Quarkus,因此我想了解影响并考虑是否应该升级到最新版本。
我了解到,自 2.2 版以来,Quarkus 将根据方法 return 类型 (https://quarkus.io/blog/resteasy-reactive-smart-dispatch/#new-world-new-rules) 在 I/O thread
或 Worker thread
上 运行 方法,意思是blocking/sync 未 returning Uni
/Multi
/CompletionStage
的方法将自动卸载到工作线程,这样它就不会阻塞 I/O线程。
在我们当前使用旧版本 Quarkus 和 RESTEasy Reactive(我认为是 1.12.2)的实现中,对于所有方法 not
returning Uni
/Multi
/CompletionStage
我相信他们会在 I/O 线程上被调用,因为我们没有在他们身上使用 @Blocking
。这些方法包括调用外部 API、访问数据库和访问文件等操作,因此我认为我们应该有责任通过使用响应式库以 non-blocking/async 方式执行这些操作,否则它们将阻止 I/O 线程(鉴于我提到的所有这些方法目前都不是使用反应库实现的)。但是升级到最新版本将解决此问题,因为此类方法将被卸载到工作线程,对吗?
P.S:通过阅读 Quarkus 文档,我了解到最少量的 I/O 线程可以处理许多并发请求。我很好奇默认有多少 I/O 个线程,这是可配置的吗?谢谢!
您假设在 Quarkus 2.2 之前是正确的,RESTEasy Reactive 的默认设置是处理所有方法的事件循环请求,但使用 @Blocking
时除外。
不用说,这意味着您不需要在这些方法中执行任何阻塞 IO(或为此进行任何长时间的 运行 操作)。
Quarkus 使用 2*number_of_cpu_threads 作为它创建的事件循环线程的默认数量
我们目前使用的是旧版本的 Quarkus,因此我想了解影响并考虑是否应该升级到最新版本。
我了解到,自 2.2 版以来,Quarkus 将根据方法 return 类型 (https://quarkus.io/blog/resteasy-reactive-smart-dispatch/#new-world-new-rules) 在 I/O thread
或 Worker thread
上 运行 方法,意思是blocking/sync 未 returning Uni
/Multi
/CompletionStage
的方法将自动卸载到工作线程,这样它就不会阻塞 I/O线程。
在我们当前使用旧版本 Quarkus 和 RESTEasy Reactive(我认为是 1.12.2)的实现中,对于所有方法 not
returning Uni
/Multi
/CompletionStage
我相信他们会在 I/O 线程上被调用,因为我们没有在他们身上使用 @Blocking
。这些方法包括调用外部 API、访问数据库和访问文件等操作,因此我认为我们应该有责任通过使用响应式库以 non-blocking/async 方式执行这些操作,否则它们将阻止 I/O 线程(鉴于我提到的所有这些方法目前都不是使用反应库实现的)。但是升级到最新版本将解决此问题,因为此类方法将被卸载到工作线程,对吗?
P.S:通过阅读 Quarkus 文档,我了解到最少量的 I/O 线程可以处理许多并发请求。我很好奇默认有多少 I/O 个线程,这是可配置的吗?谢谢!
您假设在 Quarkus 2.2 之前是正确的,RESTEasy Reactive 的默认设置是处理所有方法的事件循环请求,但使用 @Blocking
时除外。
不用说,这意味着您不需要在这些方法中执行任何阻塞 IO(或为此进行任何长时间的 运行 操作)。
Quarkus 使用 2*number_of_cpu_threads 作为它创建的事件循环线程的默认数量