apache-camel - 与 camel-jetty 和 camel-servlet 相比,Camel-reSTLet 的性能更好——有什么具体原因吗?

标签 apache-camel restlet

我创建了一个 spring-boot 应用程序,我在其中使用 camel-reSTLet 组件将我的 camel 路由公开为 rest 端点。

我的 camel 路由很简单:它们接受来自北向休息端点的请求,进行请求处理,通过 camel-netty4-http 组件调用另一个南向休息端点,处理响应并将其发送回北向。

现在我正在使用 JMeter 进行性能分析。我观察到使用 10 个线程时,我的 Camel 路由性能(平均延迟 220 毫秒和吞吐量 ~38)与我通过 JMeter 直接调用相同的南向休息端点时从 JMeter 获得的结果相匹配(平均延迟 210 毫秒和吞吐量~39) .

但是当我在 Jmeter 中将线程数从 10 增加到 100 或更多时,结果很奇怪:

  • 当我直接调用南向休息端点时:延迟 2230 毫秒和吞吐量 ~20
  • 当我通过 Camel 路线调用同一个南行休息终点时,延迟为 230 毫秒,吞吐量约为 38。

我通过将其余组件从 camel-reSTLet 更改为 camel-servelet、camel-jetty 进行了相同的测试,结果与我通过 JMeter 直接调用南向休息端点时从 JMeter 获得的结果相匹配(平均延迟2230 毫秒 & 吞吐量 ~20)。

谁能帮助我理解与其他 camel 组件(camel-jetty 或 camel-servlet)相比,camel-reSTLet 组件获得更好性能的原因?

最佳答案

camel-reSTLet默认是异步的,更适合你的测试。您可以将端点上的选项 synchronous=true 设置为相同的条件。

<from uri="restlet:/path/?synchronous=true" />

http://camel.apache.org/restlet.html

或者在 camel servlet 上启用异步:

<servlet> 
  <servlet-name>CamelServlet</servlet-name> 
  <display-name>Camel Http Transport Servlet</display-name> 
  <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class> 
  <init-param> <param-name>async</param-name> <param-value>true</param-value> </init-param> 
  <load-on-startup>1</load-on-startup> 
  <async-supported>true</async-supported>
</servlet>

您也可以尝试 netty4 端点(您已经将其用作客户端),它是完全响应式(Reactive)的并且可以处理大型并发连接。

<from uri="netty4-http:http://0.0.0.0:{{port}}/path/">

http://camel.apache.org/netty4-http.html

关于apache-camel - 与 camel-jetty 和 camel-servlet 相比,Camel-reSTLet 的性能更好——有什么具体原因吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52271939/

相关文章:

java - Camel - unmarshal().serialization() - ClassNotFoundException

java - 在 apache Camel 上为 HTTPS 实现 API(SSL)的最佳方法是什么?

java - getResourceAsStream 总是返回 null (Google App Engine)

java - 无法通过 Apache Camel 访问外部 HTTP 服务

java - 如何在Camel中的路由之间传递异常

java - 注册 Apache Camel 处理器的监听器

apache-camel - Camel 幂等消费者对于removeOnFailure=true 的错误行为

java - 这里哪个异常(exception)最合适?

android - 带有 AppEngine 通信错误的 ReSTLet Android

java - 如何使用 ReSTLet 将所有路径路由到单个 ServerResource