В нашем приложении нам нужно создать HTTP-сервер, на котором при запуске к нему открываются около 1600 постоянных HTTP-соединений с различных удаленных серверов, и поток из тысяч HTTP-запросов POST отправляется по каждому соединению в быстрой последовательности в течение примерно 30 секунд. секунд - нам требуется всего несколько миллисекунд, чтобы ответить на каждое из них. Через 30 секунд соединение закрывается и открывается другое.
Мы выбрали Netty, потому что, по мнению большинства, он хорошо подходит для создания эффективных HTTP-серверов.
При реализации нашего HTTP-сервера мы следовали Snoop пример HTTP-сервера Netty.
К сожалению, мы сталкиваемся с проблемами, которые могут быть объяснены перегрузкой Netty, и поэтому мы пересматриваем, правильно ли она настроена, в частности, в отношении того, как обрабатываются потоки. Настраиваем сервер следующим образом:
ServerBootstrap bootstrap = new ServerBootstrap(
new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
Когда мы получаем запрос, мы обрабатываем его в том же потоке, который вызывает messageReceived() в нашем SimpleChannelUpstreamHandler.
Должен ли этот подход работать в нашем приложении?
изменить: средняя нагрузка на коробку во время возникновения сбоев составляет 0,05, что очень мало. Я выделил 4 ГБ процессу Java, но он почти не использует его. Так что, в основном, коробка полностью недогружена.