Spring React 和 quarkus React 之间的性能差异

Jay*_*iya 6 cloud graalvm spring-webflux quarkus

低内存和高性能本机容器是未来。使用传统框架的 Java 很难像 golang/rust 那样实现较低级别的占用空间和高性能。

但最近 Java 的创新结合了 graalvm 和响应式范式,显示出非常令人印象深刻的结果。

因此,问题在于了解 Spring boot 与 Quarkus 的反应式引擎有何不同。我们是否有任何理由应该采用 quarkus Native/jvm 或者等待 Spring Native 变得稳定并期望相同的性能优势?有人可以根据实验和事实来谈谈吗?

Jay*_*iya 14

使用 quarkus 进行了一些实际操作,包括 Resteasy React、Kafka Streams、Kafka Producer 等,以评估性能。

\n

让我们谈谈最大的根本区别,因为有很多区别。Quarkus 不仅仅是一种框架方法。它是一种以反应方式解决问题的平台方法。现在让我们看看一个值得信赖的公共基准网站,即 -> https://www.techempower.com/benchmarks/。让我们比较基于 Reactive Spring 的 JDBC 应用程序和基于 Reactive Quarkus 的应用程序。两者都使用 postgres 数据库。

\n

注意:数字越大越好。

\n

Spring WebFlux 与 Pgclient 性能

\n

Quarkus 与 Pgclient 性能

\n

尽管两者都是反应性的,但还是有 10 倍的差异。

\n

为什么?让我们深入了解细节。

\n

正如我所说,quarkus 不仅仅是一个框架方法。为了确保您获得像 golang 这样的性能和内存占用,所有著名的数据库驱动程序都与 vertx 事件循环线程池垂直集成(这就是 quarkus 在下面使用的)。

\n
\n

基本上整个异步定义是由 quarkus 重写的,基本上不使用任何其他隐藏线程池。一切都与 vertx 事件池垂直集成。

\n
\n

其他简单地将请求移交给另一个线程池的框架/库将永远无法实现类似的性能和内存利用率。

\n

请记住,在 java 中,不要使用另一个线程池/线程非常重要,因为每个线程的最小堆栈大小为 1 mb,并且上下文切换时会产生负面性能开销。

\n

另外,请记住 Apache Spark、flink 等分布式计算框架仅使用 2 倍数量的线程,其中 x 是应用程序中分配的 cpu 核心数。甚至 Java Fork/Join api 也以同样的方式工作。

\n
\n

这意味着 quarkus 不是使用大量线程,而是通过坚持核心与线程比率的强大基础来带来相同的性能。

\n
\n

第二个最大的区别是

\n
\n

quarkus 中的所有注释都不使用反射,反射的性能与 spring 一样声誉不佳,尤其是在使用 graalvm 的本机模式下。

\n
\n

请参考: https: //dzone.com/articles/think-twice-before-using-reflection了解原因?

\n
\n

第三个根本区别是 quarkus 的本机模式与本机模式下的 spring 相比令人难以置信的启动时间和内存\n开销。

\n
\n

这是为什么?下面发生了什么?

\n

Quarkus 背后的中心思想是在构建时执行传统框架在运行时执行的操作:配置解析、类路径扫描、基于类加载的功能切换等。

\n

Quarkus Native 应用程序仅包含 pom 文件中提到的大量类中运行时使用的类。如何以及为何?

\n

Quarkus 中的流程:\n在传统框架中,执行初始应用程序部署所需的所有类在应用程序\xe2\x80\x99 的生命周期中都会挂起,即使它们只使用一次。使用 Quarkus,它们甚至不会加载到生产 JVM 中!

\n

在构建时处理期间,它准备应用程序使用的所有组件的初始化。

\n

结果:\n由于所有元数据处理都已完成,因此可以减少内存使用量并缩短启动时间。

\n

参考: https: //quarkus.io/vision/container-first,了解更深入的信息,quarkus 中的原生构建在 Spring 原生方面如何遥遥领先。

\n

感谢 Quarkus 重新定义了 Java 的未来。

\n

所以,很明显,QUARKUS 是前进的方向。

\n

仍然不明白为什么要使用 quarkus?有任何疑问吗?在这里评论!如果想进行详细讨论,请前往下面提到的 zulip 频道。

\n

感谢 Clement Escoffier ( https://github.com/cescoffier ) 和 Georgios Andrianakis ( https://github.com/geoand ) 清楚地解释了 quarkus 的基础知识。

\n

另外,请访问https://quarkusio.zulipchat.com/login/另外,如果您希望学习 quarkus 并从根本上改变现有和未来应用程序的运营成本和性能,请

\n
\n

Quarkus 参考资料:\n https://www.youtube.com/channel/UCaW8QG_QoIk_FnjLgr5eOqg \n https://developers.redhat.com/courses/quarkus ->(这些是免费的,甚至不需要注册)

\n
\n

在 quarkus 上完成的 POC 参考:\n https://github.com/JayGhiya/QuarkusExperiments/tree/initial_version_v1

\n

POCS 的见解:与传统的 Java 同类产品相比,内存占用量降低了 5-8 倍,性能提高了,所需代码减少了 30%-50%。

\n

  • Quarkus 具有反应式数据库访问功能,但它基于 Vertx,而不是 r2dbc。这些车手都非常成熟且身经百战。此外,Quarkus 与 Hibernate Reactive(在 Vertx 层之上)集成,为反应式数据库访问提供更简单的支持。 (2认同)