2011-02-09 3 views
6

У меня есть сервлет Java, который перегружается клиентскими запросами в часы пик. Некоторые клиенты охватывают одновременные запросы. Иногда количество запросов в секунду слишком велико.Предотвратить клиент от сервера перегрузки?

Должен ли я внедрять логику приложения для ограничения количества запросов, которые клиент может отправлять в секунду? Нужно ли это делать на уровне приложений?

+3

Бросьте больше оборудования на него. –

+0

Пока все запросы действительны, я соглашаюсь с Anon, бросаю больше аппаратных средств (проще всего) или оптимизирую ваш сервлет Java. Если запросы являются спамом, то вы можете заблокировать их на более низком уровне, используя что-то вроде iptables или блока уровня apache. – Nick

+1

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

ответ

1

Два наиболее распространенных способа обращения с этим - отклонить запросы, когда сервер слишком занят, или обрабатывать каждый запрос медленнее.

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

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

Два могут общаться через один из классов в java.util.concurrent, например LinkedBlockingQueue или ThreadPoolExecutor. Если вы хотите получить действительно фантазию, вы можете использовать что-то вроде PriorityBlockingQueue для обслуживания некоторых клиентов перед другими.

меня, я бы бросить больше оборудования, на него, как сказал Анон;)

1

Некоторые твердые ответы здесь. Я думаю, что больше оборудования - это путь. Слишком много клиентов или трафик обычно хорошая проблема.

Однако, если вы абсолютно должны дросселировать клиентов, есть некоторые варианты.

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

Укажите скорость, с которой ваша система может обрабатывать трафик. Либо в целом, либо на каждого клиента. Затем поместите счет в memcached, который представляет эту скорость. Каждый раз, когда вы получаете запрос, уменьшайте значение. Периодически увеличивайте счетчик, чтобы увеличить пропуск трафика.

Например, если вы можете обрабатывать 10 запросов в секунду, поместите счет 50 в каждые 5 секунд, максимум до 50. Таким образом, вы не заправляете его все время, но можете также обрабатывать немного разрыва, ограниченного окном. Вам нужно будет поэкспериментировать, чтобы найти хорошую частоту обновления. Ключом для этого счетчика может быть либо глобальный ключ, либо на основе идентификатора пользователя, если вам нужно ограничить этот путь.

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

Все, что касается меня, я сначала изучу другие варианты. Дросселирование ваших клиентов обычно является хорошим способом их раздражать. Скорее всего, НЕ лучшая идея. :)

+0

, если вам удастся дросселировать клиента, вам придется объяснять мертвое тело. Но их больше не будет раздражать :-) –

+1

Существует более одного способа обмануть cust ... cat. – rfeak

1

Я предполагаю, что вы не в состоянии увеличить емкость (через аппаратное или программное обеспечение), и вам просто нужно ограничить внешнюю нагрузку на вашем сервере.

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

Если вы используете Tomcat, вы можете настроить максимальное количество одновременных запросов, разрешенных с помощью настроек maxThreads и acceptCount. Прочитайте введение в http://tomcat.apache.org/tomcat-6.0-doc/config/http.html, чтобы узнать о них.

Для более продвинутых элементов управления (например, ограничений для каждого пользователя), если вы проксируете через Apache, вы можете использовать различные модули, чтобы помочь справиться с ситуацией. Несколько модулей для google for - limitipconn, mod_bw и mod_cband. Это немного сложнее настроить и понять, чем основные элементы управления, которые, вероятно, предлагаются вашим сервером приложений, поэтому вы можете просто захотеть придерживаться этих.

Смежные вопросы