В нашем приложении нам нужно обрабатывать объемы запросов более 5000 запросов в секунду. Нам сказали, что это возможно с Jetty в нашем типе приложений (где мы должны предоставить JSON-HTTP API для удаленной системы, которая затем инициирует входящие запросы и подключения к нам).
Мы получаем несколько тысяч входящих HTTP-соединений, каждый из которых является постоянным и длится около 30 секунд. Затем удаленный сервер запускает запросы у нас так быстро, как мы можем реагировать на них по каждому из этих соединений. Через 30 секунд соединение закрывается, а другой открывается. Мы должны отвечать менее чем за 100 мс (включая время транзита сети).
Наш сервер работает в EC2 с 8 ГБ оперативной памяти, 4 ГБ которого выделяется нашей виртуальной виртуальной машиной Java (предыдущие исследования предполагали, что вы не должны выделять более половины доступной ОЗУ для JVM).
Вот как мы в настоящее время инициализируем Jetty на основе различных советов, которые мы читаем в Интернете:
Server server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setPort(config.listenPort);
connector.setThreadPool(new QueuedThreadPool(5120));
connector.setMaxIdleTime(600000);
connector.setRequestBufferSize(10000);
server.setConnectors(new Connector[] { connector });
server.setHandler(this);
server.start();
Обратите внимание, что у нас изначально было всего 512 потоков в нашем потоковом пуле, мы пытались увеличить до 5120, но это не помогло.
Мы обнаруживаем, что с этой настройкой мы пытаемся обрабатывать более 300 запросов в секунду. Мы не считаем, что проблема - это наш обработчик, поскольку он просто выполняет быстрые вычисления и сериализацию/десериализацию Gson.
Когда мы вручную выполняем собственный HTTP-запрос, когда он пытается обработать эту нагрузку, мы обнаруживаем, что может потребоваться несколько секунд, прежде чем он начнет отвечать.
Мы используем Jetty версии 7.0.0.pre5.
Любые предложения, как для решения, так и методы выделения узкого места, будут оценены.