Quarkus 反应式与 quarkus 命令式有什么关系吗?

3 java imperative reactive quarkus

你好,我正在阅读以下文章Quarkus 反应式架构

\n

文章开头说

\n
\n

夸库斯是反应性的。它\xe2\x80\x99s 甚至比这更重要:Quarkus 统一了反应式和命令式编程。您甚至不必选择:您可以实现反应式组件和命令式组件,然后将它们组合在同一个应用程序中。

\n
\n

就在文章的中间下方提到

\n
\n

借助代码中的提示(例如 @Blocking 和 @NonBlocking 注释),Quarkus 扩展可以决定应用程序逻辑何时阻塞或非阻塞。

\n
\n

我的问题是我写反应式还是命令式重要吗?例如

\n

反应式方法

\n
    @GET\n    public Uni<List<Fruit>> get() {\n        return sf.withTransaction((s,t) -> s\n                .createNamedQuery("Fruits.findAll", Fruit.class)\n                .getResultList()\n        );\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

命令式方法

\n
    @GET\n    @NonBlocking\n    public List<Fruit> get() {\n        return entityManager.createNamedQuery("Fruits.findAll", Fruit.class)\n                .getResultList();\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

这两个代码片段运行时是否具有相同的反应性优势?

\n

Lad*_*cek 5

假设您的第二个片段使用经典的阻塞 Hibernate ORM,它不会第一个片段(似乎使用 Hibernate Reactive)那样工作。它包含一个阻塞调用,因此您将阻塞事件循环,这是在非阻塞架构中可以做的最糟糕的事情,因为它基本上违背了非阻塞架构可以给您带来的所有好处(请参阅https : //vertx.io/docs/vertx-core/java/#golden_rule)。

如果您的方法是阻塞的,其中包括对其他正在阻塞的库的调用,则您不能假装它们是阻塞的@NonBlocking。如果删除注释@NonBlocking,方法调用将被卸载到线程池,并且事件循环保持空闲以处理其他请求。这有一些开销,而且线程池不是无限的,但我敢说它在绝大多数情况下都能正常工作。