Соединения с жестким ограничением Spring Boot

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

Я хотел бы наложить жесткое ограничение на одновременные подключения, разрешенные для моего микросервиса, и отклонить любое с 503 или на уровне tcp/ip. Я пытался изучить различные конфигурации, которые можно сделать для Jetty/Tomcat/Undertow, но пока не нашел ничего полностью убедительного.

Я нашел некоторые настройки, регулирующие пулы потоков:

  • server.tomcat.max-threads=0 # Максимальное количество рабочих потоков.
  • server.undertow.io-threads= # Количество потоков ввода-вывода, которые нужно создать для воркера.
  • server.undertow.worker-threads= # Количество рабочих потоков.
  • server.jetty.acceptors= # Количество используемых потоков акцепторов.
  • server.jetty.selectors= # Количество используемых потоков селектора.

Но если правильно понять, все они настраивают размеры пула потоков и просто приведут к тому, что соединения будут поставлены в очередь на каком-то уровне.

Это кажется действительно интересным, но это еще не было объединено и предназначено для Spring Boot 1.5, https://github.com/spring-projects/spring-boot/pull/6571

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


person user1293081    schedule 24.08.2016    source источник
comment
В Jetty есть QoSFilter и DoSFilter для таких ограничений на количество подключений (в следующей версии Jetty 9.4.x будет больше возможностей).   -  person Joakim Erdfelt    schedule 24.08.2016
comment
Я просмотрел DoSFilter, но не могу найти ни одного параметра, который фактически ограничивал бы количество параллельных/постоянных запросов. Я что-то упускаю?   -  person user1293081    schedule 30.08.2016


Ответы (1)


Попробуйте посмотреть на EmbeddedServletContainerCustomizer

эта суть может дать вам представление о том, как это сделать.

TomcatEmbeddedServletContainerFactory factory = ...;
    factory.addConnectorCustomizers(connector ->
            ((AbstractProtocol) connector.getProtocolHandler()).setMaxConnections(10000));
person bilak    schedule 24.08.2016
comment
Спасибо! Попробую, как только появится время, но выглядит многообещающе. - person user1293081; 25.08.2016