Как ограничить количество разрешенных активных подключений в Jetty

#java #sockets #servlets #embedded-jetty

#java #сокеты #сервлеты #встроенный-jetty

Вопрос:

Здесь я пытаюсь отклонить запрос на уровне сервера jetty, прежде чем перейти к сервлету. Поскольку, согласно приведенной ниже конфигурации, пул потоков имеет 6 минимальных и 10 максимальных потоков параллельного выполнения, и 10 запросов могут быть поставлены в очередь в пуле потоков, где на уровне соединителя может быть поставлено в очередь 55 запросов. таким образом, всего 85, что означает, что если одновременно отправляется 200 запросов, 115 запросов должны быть отклонены. Но даже если я отправлю 1000 запросов одновременно с помощью jmeter. Сервер Jetty обслуживает все запросы. Ниже приведен фрагмент кода.

 Server server = new Server();
QueuedThreadPool threadPool = new QueuedThreadPool();

LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(15);
ExecutorThreadPool pool = new ExecutorThreadPool(6, 10, 30000, TimeUnit.MILLISECONDS, queue);
server.setThreadPool(pool);

threadPool.setMaxThreads(AssuranceConfiguration.annetAssurancesrvConsumerThread);
server.setThreadPool(threadPool);
if (AssuranceConfiguration.annetAssurancesrvSslRequired)
{
    if (logger.isInfoEnabled())
    {
        logger.info("Going to use HTTPS, Initialising SSL context....");
    }
    SslContextFactory sslContextFactory = new SslContextFactory();
    sslContextFactory.setKeyStore(JettyServer.class.getResource(KEYSTOREFILE).getFile());
    sslContextFactory.setKeyStorePassword(AssuranceConfiguration.annetAssurancesrvKeystoreidentifier);
    sslContextFactory.setKeyManagerPassword(AssuranceConfiguration.annetAssurancesrvKeystoremanagerPassword);
    SslSelectChannelConnector sslConnector = new SslSelectChannelConnector(sslContextFactory);
    sslConnector.setPort(AssuranceConfiguration.annetAssurancesrvPort);
    server.setConnectors(new Connector[] { sslConnector });

}
else
{
    if (logger.isInfoEnabled())
    {
        logger.info("Going to use HTTP, Initialising simple context....");
    }
    SelectChannelConnector simpleConnector = new SelectChannelConnector();
    simpleConnector.setPort(AssuranceConfiguration.annetAssurancesrvPort);
    simpleConnector.setMaxIdleTime(30000);
    simpleConnector.setRequestHeaderSize(8192);
    server.setConnectors(new Connector[] { simpleConnector });
    simpleConnector.setAcceptQueueSize(55);
}
  

Комментарии:

1. Связь между входящим соединением и запросами не так проста, ваша конфигурация потока будет устанавливать только искусственное ограничение на количество запросов, но в соединении может быть 0 ..n запросов. В вашей конфигурации легко использовать все потоки только с 1 подключением.

2. спасибо за ответ . Но как одно соединение будет обслуживать несколько запросов. соединение является эксклюзивным между сервером и клиентом. после обработки запроса это конкретное соединение закрывается между сервером и клиентом.

3. Вы имеете в виду более старую спецификацию HTTP / 0.9, которая это делает. HTTP / 1.0 имеет функцию keep-alive как необязательную, а HTTP / 1.1 имеет постоянные / конвейерные соединения по умолчанию. Например, соединение HTTP / 1.1 может подключаться, отправлять 0 .. n запросов, затем оно ожидает ответов (обработка запросов / потоков может быть распараллелена, но запись ответа должна быть последовательной в соответствии со спецификацией)

4. И нет 1 потока на 1 правило обработки запросов с сервлетом 3.0 и выше. Вы можете легко иметь 1 поток, обрабатывающий несколько запросов на несколько подключений, если ваш сервлет использует функции Servlet 3.0 .

5. Еще раз спасибо за ценную информацию. Но для того, чтобы удовлетворить мое требование, какой может быть наилучший подход, по вашему мнению 🙂