Поэтапная асинхронная обработка в контейнерах сервлетов? - PullRequest
0 голосов
/ 09 декабря 2010

Я немного читал о Stage Event Driven Architecture (SEDA) и концепции асинхронного ввода-вывода. Я сталкивался с несколькими людьми, которые говорили о реализации SEDA для обработки HTTP-запросов. Пример:

  • Веб-сервер получает клиентский HTTP-запрос.
  • Запрос помещен в очередь
  • Один из ограниченного числа потребителей получает запрос из очереди
  • Запрос обрабатывается, возможно, через типичную инфраструктуру MVC (например, Spring MVC)
  • Ответ отправляется обратно клиенту

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

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

Может кто-нибудь прояснить этот вопрос для меня?

1 Ответ

1 голос
/ 09 декабря 2010

Да, вы в некотором роде правы, большинство современных контейнеров сервлетов будут «ставить в очередь» запросы на отправку ограниченному числу потоков, которые фактически выполняют обработку, и это в некоторой степени аналогично SEDA.

Но, конечно, стандартный HTTP-запрос на самом деле не помещается в физическую очередь (как задача / запрос будет в SEDA), вместо этого пользовательское соединение (запрос) просто не принимается, пока сервер не будет готов к обработке это (или до тех пор, пока оно не будет отклонено), и в этом ключ разница , потому что пользователю приходится ждать, пока соединение будет принято, а затем обработано - что все происходит синхронно . Ключевой особенностью SEDA является то, что обработка запроса обычно асинхронная , т.е. вы отправляете задачу в очередь, а затем забываете о ней, возможно, через некоторое время узнаете о ее завершении.

В любом случае, в Tomcat вы можете настроить acceptCount и maxThreads , чтобы контролировать, сколько запросов ' поставлено в очередь ' до того, как сервер отклонит новые входящие подключения, и сколько будет обрабатываться одновременно. Более новые серверы позволят вам обрабатывать запросы асинхронно, AJAX / Comet style.

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