2017-10-15 63 views
1

我最近使用vert.x测试了一个简单的HTTP服务器(基于java)我很惊讶http服务器的吞吐量和api延迟,它非常快。为什么反应式编程应用程序(vert.x)比单线程锁定free,无阻塞Java应用程序更快?

http服务器的同一段代码在java应用程序上运行,具有单线程,无锁和非阻塞。性能不及vert.x one的三分之一。

我不明白的是,vert.x优于非反应式Java应用程序的核心技术差异是什么?

STATS:

测试使用Jmeter完成。 jmeter和应用程序都运行在相同的机器上,jmeter消耗CPU 25-50%,应用程序消耗CPU 20-30%。 所有测试运行5分钟。

  1. 弹簧引导用1个Tomcat的工作线程:

的JMeter用1客户线程轰击请求(遍及:每秒3474): enter image description here

的JMeter与50客户线程同时轰击请求(全部:每秒4285): enter image description here

  1. Vert.x(基于java)只有1个垂直(HTTP处理器垂直) - 这意味着只有1个处理器线程

的JMeter用1个客户线程轰击请求(遍及:9382每秒): enter image description here

的JMeter与50个客户线程轰击请求并发(全程:每秒20785): enter image description here

+0

剖析这两个应用程序并查看线程转储。这将得到一个线索。您需要提供号码才能获得反馈。 – randominstanceOfLivingThing

回答

1

有很多原因。
首先,您将单线程裸Java应用程序与Vertx进行了比较,该应用程序为actually multithreaded
第二个是你如何使用无锁数据结构。 Lock free doesn't necessarily means "faster in all conditions"
第三,我认为这是最重要的一点,一些最好的红帽开发者对Vertx开发做出了贡献。例如,您可以检查source code并查看一些非常智能的缓冲区。从第一个例子来看,示例项目的表现要超过这个框架有点过分。如果您对某些替代方案感兴趣,请检查Rapidoid效果,这应该与Vertx保持一致。

+0

感谢Alexey的评论! #1 - 我知道vertx是多线程的,每个核心有1个事件循环线程。我在4核心机器上运行这个。 Spring引导没有扩展具有4个或更多线程的事件。 #2 - 同意 #3 - 将检查此 – abhi

+0

你用Jetty或Undertow使用SpringBoot吗?另外,如果您比较Spring生态系统,请尝试WebFlux。但坦率地说,Vertx只是快速:) –

相关问题