Camel Restlet maxThreads не работает должным образом - PullRequest
0 голосов
/ 05 ноября 2018

Я работаю над приложением, в котором множество верблюжьих маршрутов выставляются как маршруты рестлета. Позволяет называть их конечными точками. Эти конечные точки потребляются угловым приложением. Эти конечные точки обращаются к сторонней системе для сбора данных, а затем после их обработки передает ответ на угловое приложение.

Бывают случаи, когда сторонняя система работает очень медленно, и в таких случаях пул потоков нашего сервера (Websphere 8.5.5.9) достигает своего максимального размера (потому что большинство из них ждут получения ответа от третьей стороны). Из-за этого нет никаких потоков, доступных для других частей (которые не взаимодействуют с сервером через эти конечные точки) приложения, и, следовательно, они также страдают из-за этого.

Таким образом, в основном мы хотим ограничить количество запросов, которые будут обслуживаться этими «конечными точками», если сервер сильно перегружен, чтобы другие части приложения не пострадали. Поэтому мы хотели поиграть с количеством потоков, которые могут обрабатывать входящий запрос на любой конечной точке. Чтобы сделать это как документ (доказательство концепции), я использовал этот пример 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

Я добавил 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 секунд и несколько миллисекунд.

Я ищу похожие настройки за последние несколько дней, но пока ничего не получил. Я хотел понять, делаю ли я что-то неправильно или неправильно понял документацию.

верблюжья версия, используемая здесь, 2.23.0-SNAPSHOT

1 Ответ

0 голосов
/ 06 ноября 2018

Вместо того, чтобы пытаться настроить пул потоков компонента Camel, вы можете попытаться использовать Camel Hystrix для управления нисходящими вызовами вашего приложения с помощью шаблона Circuit Breaker .

Как только нисходящая служба возвращает ошибки или реагирует слишком медленно, вы можете вернуть альтернативный ответ вызывающей стороне.

...