Ограничение количества запросов к сервлету

StackOverflow https://stackoverflow.com/questions/1631981

  •  06-07-2019
  •  | 
  •  

Вопрос

У нас есть сервлет, который занимает больше виртуальной памяти на сервере из-за своей логики.По этой причине мы хотели бы ограничить количество одновременных запросов к этому серверу, скажем, например, что нам нужно обрабатывать только 10 одновременных запросов.Остальные запросы должны ждать в очереди.

Можно ли создать и назначить этому сервлету собственный пул потоков для обработки этого сценария?Мы используем сервер WebLogic 9.2.Или есть ли другой лучший подход для этого?Цените любые мысли.

Это было полезно?

Решение

  

Можно ли создать собственный пул потоков и назначить этому сервлету для обработки этого сценария? Мы используем сервер WebLogic 9.2. Или есть другой лучший способ сделать это? Цени любые мысли.

Да, это возможно. Вместо использования самонастраиваемого менеджера работ по умолчанию (начиная с Weblogic 9.x, очереди выполнения заменяются менеджерами работ для пулов потоков 1 ), вы можете создать менеджер работ с определенным ограничения , такие как max-threads-constraint и возможно емкость . Затем вы можете назначить сервлет определенному менеджеру работ, используя wl-dispatch-policy из файла дескриптора развертывания weblogic.xml .

<Ч>

1 Обратите внимание, что все еще можно включить модель пула потоков WebLogic 8.1 и использовать очереди выполнения.

Другие советы

Вам нужно что-то впереди или на машине, на которой размещен сервлет, потому что когда запросы попадают на машину, уже слишком поздно: ресурсы уже используются. Вы не можете контролировать спрос : вы можете только реагировать на него и планировать его.

Возможно, вам нужен балансировщик нагрузки, программный или аппаратный, в зависимости от ваших целевых требований. Программный балансировщик нагрузки может быть просто «сервлетом-диспетчером». с управлением сеансом (например, 10 одновременно с сервлетом X).

Существует еще одна возможность: вы "дросселируете" запрашивающие, выдав соответствующий код HTTP. Конечно, это означает дополнительную логику на стороне запрашивающей стороны ... и она все еще потребляет некоторые ресурсы на стороне сервера.

Вы можете распределить нагрузку таким образом, чтобы существовал вторичный сервер, который обрабатывал все запросы на дорогой сервлет.

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

Итак, вы бы превратили ваш текущий сервлет в вызов метода.

Затем сервлет шлюза получит запрос, посмотрит, достаточно ли низкий счетчик, а затем увеличит его. Если больше 10, верните сообщение об ошибке.

Это не идеальная ситуация, но если вы помещаете вещи в очередь, через некоторое время браузеры начинают время ожидания, или пользователи теряют терпение и нажимают кнопку отправки снова и снова, поскольку это занимает слишком много времени.

Если бы вы могли использовать javascript для отправки запроса, то есть несколько лучших решений, которые могут вам помочь.

Без использования балансировщиков нагрузки и т.п. мне кажется, вы хотите отделить запрос от обработки.

например

  1. браузер отправляет запрос.Сервлет принимает его, ставит в очередь и возвращает билет.
  2. Сервлет будет работать над этим рабочим запросом, насколько позволяют ресурсы (используя отдельный пул потоков, извлекающий рабочие элементы из очереди).
  3. Браузер может обновиться (повторно GET), используя этот билет, и сервлет вернет соответствующий результат (например,не обработка, обработка, обработка).

Это довольно распространенная закономерность.Обратите внимание, что браузер не блокируется, а просто отправляет запрос, а затем регулярно выполняет проверки, чтобы убедиться, что рабочий элемент завершен.Я успешно использовал это (например) в ситуации, когда пользователи запрашивали диаграммы, обработка которых занимала 5 минут или более, и при этом использовалась собственная библиотека, не поддерживающая потокобезопасность.В этом сценарии я имел ограничить обработку одним потоком независимо от количества одновременных запросов.

Мне нравится идея использования статического счетчика и перенаправления для отображения сообщения об ошибке, когда счетчик превысил предел.

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

http://download.oracle.com /docs/cd/E13222_01/wls/docs92/perform/appb_queues.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top