none
В каком режиме (sync/async) работает реализация IHttpHandler? RRS feed

  • Вопрос

  • Добрый день!

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

    И так в чем соль: Есть класс, реализующий интерфейс IHttpHandler, заодно отмечу, что данный класс является производным от CustomControl'а, вдруг это важно. Интферейс реализован корректно и работает, выдавая и обрабатывая на AJAX get/post запросы нужную информацию. В реализации бизнес логики есть нюанс, такой, что ее выполнение занимает существенный промежуток времени (1м 30сек.), не то чтобы много. Соотвественно, этот промежуток времени висит индикатор о том что идет выполнение. И вот здесь я столкнулся с тем, что при попытке в этот момент выполнить другое действие, например - перейти на другую страницу портала, или послать другой асинхронный запрос, сервер "откладывает" прием входящих запросов на тот промежуток времени, пока выполняется хэндлер. Т.е. сам браузер успешно отправляет эти запросы, что видно через фиддлер, и запросы успешно отрабатываются после окончания выполнения проблемной процедуры. Но меня напряг тот факт, что сервер получается обрабатывает хэндлер всегда в одном потоке...

    Т.е. если я правильно понимаю, то в случае с промышленной версией и 500 пользователями, 499 человек будут ждать 1 пользователя, пока у того не пройдет процедура.

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

    Технология: asp.net web forms.

Ответы

  • "В реализации бизнес логики есть нюанс, такой, что ее выполнение занимает существенный промежуток времени (1м 30сек.), не то чтобы много." -

    нет, как раз это очень много, это проблемно много. А что там у Вас выполняется за этот огромный промежуток?

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

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

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

    "Т.е. если я правильно понимаю, то в случае с промышленной версией и 500 пользователями, 499 человек будут ждать 1 пользователя, пока у того не пройдет процедура. " - если у Вас всего один поток, то да, но такого небывает.

    "Честно говоря мне это кажется странным поведением, потому что вроде бы для каждого обращения к вэбприложению должен был бы создаваться отдельный поток? Или, где то в реализации логики есть ошибка." - так оно и есть, каждому запросу свой поток. Ошибка, наверное это ваш метод, который занимает нереальные 1,5 минуты.

    • Помечено в качестве ответа Eugene_Olisevich 28 мая 2012 г. 8:25
    Модератор

Все ответы

  • Добрый день.

    Откройте два браузера, откройте в них портал, выполните асинхронный запрос. Посмотрите сколько у вас будет время реакции в каждом браузере, если 1,5 минуты, то все ок. Если 1,5 минуты и 3, то надо смотреть в исходники, что там у вас в них творится...

    Отвечающий
  • Запустил как вы и предложили в 2х разных браузерах.

    На 2х разных сессиях время выполнения составило 1.5 минуты, следовательно, для 2х разных сессий создается 2 разных потока. Это хорошо.

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


  • Я, если честно, по Web-у не очень большой специалист, но если на 1 пользователя сервер выделяет 1 поток, то запросы ставятся в очередь и по мере закрытия одного обращения обрабатываются другие...
    Отвечающий
  • "В реализации бизнес логики есть нюанс, такой, что ее выполнение занимает существенный промежуток времени (1м 30сек.), не то чтобы много." -

    нет, как раз это очень много, это проблемно много. А что там у Вас выполняется за этот огромный промежуток?

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

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

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

    "Т.е. если я правильно понимаю, то в случае с промышленной версией и 500 пользователями, 499 человек будут ждать 1 пользователя, пока у того не пройдет процедура. " - если у Вас всего один поток, то да, но такого небывает.

    "Честно говоря мне это кажется странным поведением, потому что вроде бы для каждого обращения к вэбприложению должен был бы создаваться отдельный поток? Или, где то в реализации логики есть ошибка." - так оно и есть, каждому запросу свой поток. Ошибка, наверное это ваш метод, который занимает нереальные 1,5 минуты.

    • Помечено в качестве ответа Eugene_Olisevich 28 мая 2012 г. 8:25
    Модератор
  • Вот почитайте до конца.
    Модератор
  • Спасибо за отвеыт.

    Сделаю небольшой простенький тест, проверю про потоки.

    Проблема в функции - да, она там есть :) Читается очень большой кусок БД, + расчеты в хранимке :). И это место конечно оптимизируется... так что в промышленном варианте такого безобразия не будет)