Как избежать затопления в моем очень простом веб-приложении и сделать его масштабируемым?

Я пытаюсь разработать очень простое веб-приложение на Java с использованием JSP и сервлетов.

1) На странице есть текстовое поле и кнопка отправки,
2) Пользователь вводит свое имя, скажем Джон, в текстовое поле и нажимает кнопку,
3) Строка пересылается на мой сервлет,
4) В методе doPost моего сервлета я получаю доступ к опубликованной строковой переменной,
5) Веб-сервис, который я буду использовать, имеет sayHello метод, который принимает аргумент и возвращает "Hello " соединенный с аргументом,
6) Итак, я называю sayHello метод веб-службы, получить возвращаемую переменную и передать ее в JSP, который в основном пишет Hello John,

У меня есть 2 вопроса:

1) Flooding: Как избежать переполнения запросов к моему сервлету? Как мне с этим бороться? Я думал о создании темы, чтобы связаться с веб-сервисом и сказать привет. Когда приходит запрос, я проверяю, работает ли поток / занят, если нет, я обрабатываю запрос. Поэтому я буду отвечать не более 1 запроса в единицу времени. Как это звучит?

2) Масштабируемость. Предположим, что сегодня вечером 10000000000 человек посетят мое веб-приложение и заставят мое приложение передать привет 10 раз каждому. Как мне убедиться, что это приложение будет хорошо масштабироваться? Что я могу сделать с частью JSP/Servlet, кроме аппаратного обеспечения, от которого зависит сервер?

Я знаю, что вопросы носят общий характер, поэтому я постарался предоставить как можно больше подробностей. Буду очень признателен за исчерпывающий и точный ответ =)

Заранее спасибо.

2 ответа

Решение

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

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

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

Вертикальное масштабирование - это когда вы бросаете более быстрый процессор в проблему. Горизонтальный лучше.

Работа с самим сервисом - это ваша точка сбоя масштабируемости, так как именно там выполняется реальная работа. В этом случае у вас есть простой сервис, поэтому вы можете сделать то же самое с веб-сервисом, что и с сервлетом. Но если проблема "сложнее" - хорошо, именно здесь вы начинаете использовать JMS для предоставления асинхронных услуг, так что ваши поставщики услуг принимают запросы и предоставляют ответы, как только могут. Это дает вам естественное место для добавления большего количества потребителей, поэтому, если вы обнаружите, что ваша служба JMS не может обрабатывать запросы, вы добавляете другого потребителя (другой сервер, прослушивающий очередь); если это не в состоянии не отставать, вымойте, ополосните, повторите.

Конечно, есть и облачные решения проблемы; Я работаю в GigaSpaces Technologies, которая предоставляет сервис горизонтальной масштабируемости для веб-сервисов, и мы выполняем намного лучшую работу, чем решение, которое я только что изложил. Чтобы узнать, как это работает, см. http://www.youtube.com/watch?v=YTEqFzrfVss.

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

  2. Я предпочел бы пойти с решением от @Joseph Ottinger

Другие вопросы по тегам