Camel Restlet maxThreads 未按预期工作
Camel Restlet maxThreads not working as expected
我正在开发一个应用程序,其中许多 camel 路由被公开为 restlet 路由。让我们称它们为端点。这些端点由 angular 应用程序使用。这些端点调用第 3 方系统来收集数据,然后在处理它们之后,将响应传递给 angular 应用程序。
有时 3rd 方系统非常慢,在这种情况下,我们的服务器 (Websphere 8.5.5.9) 线程池达到其最大大小(因为它们中的大多数都在等待来自 3rd 方的响应).因此,应用程序的其他部分(不通过这些端点与服务器交互)没有可用的线程,因此它们也因此受到影响。
所以基本上我们想限制这些请求的数量 'endpoints' 如果服务器过载很大,这样应用程序的其他部分就不会受到影响。所以我们想研究可以处理任何端点上的传入请求的线程数。作为一个 poc(概念证明)来做到这一点,我使用了这个例子 https://github.com/apache/camel/tree/master/examples/camel-example-restlet-jdbc
在这个例子中我更改了以下配置
<bean id="RestletComponentService" class="org.apache.camel.component.restlet.RestletComponent">
<constructor-arg ref="RestletComponent" />
<property name="maxQueued" value="0" />
<property name="maxThreads" value="1" />
</bean>
并且在
org.apache.camel.example.restlet.jdbc.MyRouteConfig
我在其中一条 get direct 路线上添加了 20 秒的睡眠,如下所示:
from("direct:getPersons")
.process(exchange -> { Thread.sleep(20000);})
.setBody(simple("select * from person"))
.to("jdbc:dataSource");
现在我的假设(我从 http://camel.apache.org/restlet.html 的骆驼文档中了解到)是在给定时间只能处理 1 个请求,并且不会接受其他请求(因为 maxQueued 设置为 0)当原始请求仍在处理中时。但这并没有真正发生。使用此代码,我可以同时多次调用此端点,并且所有端点都在 20 秒和几毫秒后给出响应。
我正在搜索最近几天的类似设置,但我还没有找到任何东西。我想知道是我做错了什么,还是我对文档的理解不正确。
这里使用的Camel版本是2.23.0-SNAPSHOT
您可以尝试使用 Camel Hystrix to control the downstream calls of your application with the Circuit Breaker 模式,而不是尝试配置 Camel 组件的线程池。
一旦下游服务 return 出错或响应太慢,您可以 return 对调用方的替代响应。
我正在开发一个应用程序,其中许多 camel 路由被公开为 restlet 路由。让我们称它们为端点。这些端点由 angular 应用程序使用。这些端点调用第 3 方系统来收集数据,然后在处理它们之后,将响应传递给 angular 应用程序。
有时 3rd 方系统非常慢,在这种情况下,我们的服务器 (Websphere 8.5.5.9) 线程池达到其最大大小(因为它们中的大多数都在等待来自 3rd 方的响应).因此,应用程序的其他部分(不通过这些端点与服务器交互)没有可用的线程,因此它们也因此受到影响。
所以基本上我们想限制这些请求的数量 'endpoints' 如果服务器过载很大,这样应用程序的其他部分就不会受到影响。所以我们想研究可以处理任何端点上的传入请求的线程数。作为一个 poc(概念证明)来做到这一点,我使用了这个例子 https://github.com/apache/camel/tree/master/examples/camel-example-restlet-jdbc
在这个例子中我更改了以下配置
<bean id="RestletComponentService" class="org.apache.camel.component.restlet.RestletComponent">
<constructor-arg ref="RestletComponent" />
<property name="maxQueued" value="0" />
<property name="maxThreads" value="1" />
</bean>
并且在
org.apache.camel.example.restlet.jdbc.MyRouteConfig
我在其中一条 get direct 路线上添加了 20 秒的睡眠,如下所示:
from("direct:getPersons")
.process(exchange -> { Thread.sleep(20000);})
.setBody(simple("select * from person"))
.to("jdbc:dataSource");
现在我的假设(我从 http://camel.apache.org/restlet.html 的骆驼文档中了解到)是在给定时间只能处理 1 个请求,并且不会接受其他请求(因为 maxQueued 设置为 0)当原始请求仍在处理中时。但这并没有真正发生。使用此代码,我可以同时多次调用此端点,并且所有端点都在 20 秒和几毫秒后给出响应。
我正在搜索最近几天的类似设置,但我还没有找到任何东西。我想知道是我做错了什么,还是我对文档的理解不正确。
这里使用的Camel版本是2.23.0-SNAPSHOT
您可以尝试使用 Camel Hystrix to control the downstream calls of your application with the Circuit Breaker 模式,而不是尝试配置 Camel 组件的线程池。
一旦下游服务 return 出错或响应太慢,您可以 return 对调用方的替代响应。