Как распределяются запросы IIS с использованием COMET? - PullRequest
1 голос
/ 08 декабря 2009

У меня есть бета-приложение ASP.NET MVC 2, в котором мне нужно заблокировать входящие запросы для определенного действия, пока у меня не будет доступных данных для возврата или просто отпущу запрос через 30 секунд без новых данных.

Для этого я использую AutoResetEvent.WaitOne(30000);

Большая проблема заключается в том, что IIS, похоже, не принимает новый запрос, пока поток заблокирован по инструкции WaitOne. Новые запросы зависают до выхода потока.

Мне нужно иметь возможность распараллеливать запросы, сохраняя при этом поведение WaitOne.

Ответы [ 4 ]

2 голосов
/ 08 декабря 2009

Асинхронные обработчики - это то, что вы ищете. Если вы создаете кометное решение, вы можете проверить нашу .NET-реализацию кометного сервера здесь , это сэкономит вам некоторое время. Если вы хотите развернуть свой собственный, вам определенно нужно будет использовать асинхронные обработчики, чтобы избежать превышения верхних пределов параллелизма к тому времени, когда вы получите 60 или 70 пользователей, но даже с асинхронными обработчиками вам все равно придется сделать какую-нибудь модную работу ног. По сути, вы все равно достигнете некоторых верхних пределов в пуле потоков, если не передадите запросы в ограниченный пул потоков, который может в основном управлять всеми входящими запросами для вас.

Удачи!

1 голос
/ 08 декабря 2009

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

0 голосов
/ 08 декабря 2009

На самом деле, оказывается, что это происходит только с ASP.NET MVC 2 Beta. Я отлично работал с MVC 2 Preview 2 и откатился до этой версии для повторного тестирования и подтвердил, что приложение работало с этой версией.

Теперь возникает вопрос: почему я вижу это разное поведение между этими двумя версиями MVC и какое поведение я должен ожидать в этом сценарии?

0 голосов
/ 08 декабря 2009

Для веб-приложения более целесообразно (не жесткое правило) возвращать сообщение, чтобы попросить пользователей повторить попытку позже по любой причине, по которой вы хотите его вызвать.

Задержка / блокировка запросов с помощью «ожидания» не очень помогает, так как ожидание недетерминировано, если, конечно, у вас нет механизма, чтобы сделать это.

Я не знаю природу / контекст / структуру трафика вашего сайта. 30 секунд может быть число, которое работает для вас. Возможно, мои пункты выше не очень актуальны, просто мои 2 цента.

...