2016-06-21 1 views
1

Я хочу, чтобы мой входящий запрос dropwizard был равен 3. Итак, если сервер обслуживает 3 запроса, я хочу отправить код ответа 503: «Достигнутая емкость сервера».Dropwizard: конфигурация MaxQueuedRequests

Я знаю Dropwizard имеет конфигурацию для макс очереди запросов:

MaxQueuedRequests 

По умолчанию это 1024. Однако, я не знаю, как играть с этим параметром. Когда я делаю это 3, мой сервер не запускается.

Если кто-нибудь может помочь предоставить более подробную информацию о том, какой предпочтительный шаблон дизайна использовать для достижения этого?

Один из способов, о котором я думаю, заключается в том, чтобы иметь глобальную (или статическую) переменную, чтобы держать счетчик. И для каждого запроса я увеличиваю счетчик. , когда счетчик> 3, я отвечаю с кодом 503.

Хотите услышать больше мыслей об этом.

редактировать:

Так что я был в состоянии добиться прогресса в следующем @pandaadb ответ. Однако, я ударил другой контрольно-пропускной пункт :( Это то, что моя конфигурация выглядит следующим образом:

server: 
    minThreads: 2 
    maxQueuedRequests: 3 
    type: simple 
    applicationContextPath:/
    adminContextPath: /admin 
    connector: 
     type: http 
     port: 9999 

С этим, я получаю следующее исключение:

WARN [2016-06-23 08:38:52,354] io.dropwizard.setup.AdminEnvironment: 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
! THIS APPLICATION HAS NO HEALTHCHECKS. THIS MEANS YOU WILL NEVER KNOW  ! 
!  IF IT DIES IN PRODUCTION, WHICH MEANS YOU WILL NEVER KNOW IF YOU'RE  ! 
! LETTING YOUR USERS DOWN. YOU SHOULD ADD A HEALTHCHECK FOR EACH OF YOUR ! 
!   APPLICATION'S DEPENDENCIES WHICH FULLY (BUT LIGHTLY) TESTS IT.  ! 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
INFO [2016-06-23 08:38:52,358] org.eclipse.jetty.server.handler.ContextHandler: Started [email protected]{/admin,null,AVAILABLE} 
WARN [2016-06-23 08:38:52,363] org.eclipse.jetty.util.thread.QueuedThreadPool: dw{STARTED,2<=3<=1024,i=0,q=3} rejected [email protected] 
WARN [2016-06-23 08:38:52,367] org.eclipse.jetty.util.component.AbstractLifeCycle: FAILED [email protected]289ba785: java.util.concurrent.RejectedExecutionException: [email protected] 
! java.util.concurrent.RejectedExecutionException: [email protected] 
! at org.eclipse.jetty.util.thread.QueuedThreadPool.execute(QueuedThreadPool.java:362) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.io.SelectorManager.execute(SelectorManager.java:160) ~[jetty-io-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.io.SelectorManager.doStart(SelectorManager.java:258) ~[jetty-io-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) [jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106) [jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:256) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:81) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.Server.doStart(Server.java:366) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at io.dropwizard.cli.ServerCommand.run(ServerCommand.java:43) [dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.cli.EnvironmentCommand.run(EnvironmentCommand.java:43) [dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:76) [dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.cli.Cli.run(Cli.java:70) [dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.Application.run(Application.java:73) [dropwizard-core-0.8.2.jar:0.8.2] 
! at net.lacework.eventgen.EventGeneratorMain.main(EventGeneratorMain.java:16) [classes/:na] 
! at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_77] 
! at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_77] 
! at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_77] 
! at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_77] 
! at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) [idea_rt.jar:na] 
WARN [2016-06-23 08:38:52,368] org.eclipse.jetty.util.component.AbstractLifeCycle: FAILED [email protected]22{HTTP/1.1}{0.0.0.0:9999}: java.util.concurrent.RejectedExecutionException: [email protected] 
! java.util.concurrent.RejectedExecutionException: [email protected] 
! at org.eclipse.jetty.util.thread.QueuedThreadPool.execute(QueuedThreadPool.java:362) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.io.SelectorManager.execute(SelectorManager.java:160) ~[jetty-io-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.io.SelectorManager.doStart(SelectorManager.java:258) ~[jetty-io-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:256) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:81) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.Server.doStart(Server.java:366) [jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) [jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at io.dropwizard.cli.ServerCommand.run(ServerCommand.java:43) [dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.cli.EnvironmentCommand.run(EnvironmentCommand.java:43) [dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:76) [dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.cli.Cli.run(Cli.java:70) [dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.Application.run(Application.java:73) [dropwizard-core-0.8.2.jar:0.8.2] 
! at net.lacework.eventgen.EventGeneratorMain.main(EventGeneratorMain.java:16) [classes/:na] 
! at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_77] 
! at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_77] 
! at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_77] 
! at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_77] 
! at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) [idea_rt.jar:na] 
WARN [2016-06-23 08:38:52,368] org.eclipse.jetty.util.component.AbstractLifeCycle: FAILED [email protected]: java.util.concurrent.RejectedExecutionException: [email protected] 
! java.util.concurrent.RejectedExecutionException: [email protected] 
! at org.eclipse.jetty.util.thread.QueuedThreadPool.execute(QueuedThreadPool.java:362) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.io.SelectorManager.execute(SelectorManager.java:160) ~[jetty-io-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.io.SelectorManager.doStart(SelectorManager.java:258) ~[jetty-io-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:256) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:81) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.Server.doStart(Server.java:366) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at io.dropwizard.cli.ServerCommand.run(ServerCommand.java:43) [dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.cli.EnvironmentCommand.run(EnvironmentCommand.java:43) [dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:76) [dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.cli.Cli.run(Cli.java:70) [dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.Application.run(Application.java:73) [dropwizard-core-0.8.2.jar:0.8.2] 
! at net.lacework.eventgen.EventGeneratorMain.main(EventGeneratorMain.java:16) [classes/:na] 
! at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_77] 
! at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_77] 
! at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_77] 
! at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_77] 
! at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) [idea_rt.jar:na] 
ERROR [2016-06-23 08:38:52,368] io.dropwizard.cli.ServerCommand: Unable to start server, shutting down 
! java.util.concurrent.RejectedExecutionException: [email protected] 
! at org.eclipse.jetty.util.thread.QueuedThreadPool.execute(QueuedThreadPool.java:362) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.io.SelectorManager.execute(SelectorManager.java:160) ~[jetty-io-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.io.SelectorManager.doStart(SelectorManager.java:258) ~[jetty-io-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:106) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:256) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:81) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:236) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.server.Server.doStart(Server.java:366) ~[jetty-server-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) ~[jetty-util-9.2.9.v20150224.jar:9.2.9.v20150224] 
! at io.dropwizard.cli.ServerCommand.run(ServerCommand.java:43) ~[dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.cli.EnvironmentCommand.run(EnvironmentCommand.java:43) [dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.cli.ConfiguredCommand.run(ConfiguredCommand.java:76) [dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.cli.Cli.run(Cli.java:70) [dropwizard-core-0.8.2.jar:0.8.2] 
! at io.dropwizard.Application.run(Application.java:73) [dropwizard-core-0.8.2.jar:0.8.2] 

В идеале, я хотел бы попробовать делая ограничение моих запросов на сервер равным 1. Так что он обслуживает только 1 запрос за раз. Кроме того, я не знаю, какие новые запросы поступают в WAIT. Вместо этого сервер должен отклонить их с помощью некоторого кода ответа.

Я не уверен, что у dropwizard уже есть эта встроенная.

+0

что ваше исключение? Отправьте свой yaml config, пожалуйста. – pandaadb

ответ

2

Я думаю, что ваша проблема в том, что вы меняете только одно значение, а не другие. И проверка DW не улавливает этот случай.

Установка MaxQueuedRequests не позволяет 3, если вы также не меняете свою емкость. Посмотрите здесь:

/** 
    * Create a bounded {@link BlockingArrayQueue} that grows by the given parameter. 
    * 
    * @param capacity 
    *   the initial capacity 
    * @param growBy 
    *   the growth factor 
    * @param maxCapacity 
    *   the maximum capacity 
    */ 
    public BlockingArrayQueue(int capacity, int growBy, int maxCapacity) 
    { 
     if (capacity > maxCapacity) 
      throw new IllegalArgumentException(); 
     _elements = new Object[capacity]; 
     _growCapacity = growBy; 
     _maxCapacity = maxCapacity; 
    } 

Это называется серверным завода:

protected ThreadPool createThreadPool(MetricRegistry metricRegistry) { 
     final BlockingQueue<Runnable> queue = new BlockingArrayQueue<>(minThreads, maxThreads, maxQueuedRequests); 
     final InstrumentedQueuedThreadPool threadPool = 
       new InstrumentedQueuedThreadPool(metricRegistry, maxThreads, minThreads, 
               (int) idleThreadTimeout.toMilliseconds(), queue); 
     threadPool.setName("dw"); 
     return threadPool; 
    } 

Значение ваши minThreads должны быть 3 или меньше, для этого, чтобы работать, в противном случае ваша способность больше, чем maxCapacity, где:

мощность: minThreads maxCapacity: maxQueuedRequests

EDIT: После получения дополнительной информации от Op, вот решение:

server: 
    minThreads: 2 
    maxQueuedRequests: 3 
    rootPath: /api/* 
    requestLog: 
    appenders: [] 
    applicationConnectors: 
    - type: http 
    port: 9085 
    acceptorThreads: 3 
    selectorThreads: 3 

Ваша ошибка на самом деле не является ошибкой - я считаю, что это ошибка в Jetty (или, скорее, неправильная настройка, которая не была проверена при запуске).

Проблема в том, что причал запускает несколько проверочных проверок/selectorthreads. Это count()> 3. Однако потоки запускаются жизненным циклом сервера, поэтому причал бомбит их в свой собственный поток. Это не проблема, так как они уходят после выполнения (вы можете проверить это, установив точку останова и медленно перешагнув запуск - ваш сервер начнет просто отлично).

Решение состоит в том, чтобы ограничить потоки акцептора/селектора (пожалуйста, сделайте несколько экспериментов/исследований, чтобы увидеть, что они делают и правильно их настроить). Таким образом, ограничивая эти потоки, запуск не перегружает ваш причал, и все начинается нормально.

(я не делал никаких экспериментов относительно производительности/стабильности с этой довольно странной настройкой).

FWIW - так, как я бы решить эту проблему:

Реализовать запрос фильтр, который подсчитывает входящие/исходящие запросы. Когда запрос приходит, а счетчик -> X, немедленно отклоняйте запрос с ответом, указывающим на высокую нагрузку, и позже повторите попытку (чтобы ваш клиент знал, что делать). Вышеприведенная конфигурация, скорее всего, приведет к выбросу 500 долларов из причала, что заставит ваших клиентов думать, что ваш сервер не работает.

С уважением,

Артур

+0

Спасибо @pandaadb. Я обновляю свой вопрос с более подробными сведениями об ошибках. – Roger

+0

См. Выше @Roger – pandaadb

Смежные вопросы