Джефф ранее писал о используя кеш для выполнения "внеполосной" обработки на своих веб-сайтах, однако мне было интересно, какие еще методы люди используют для обработки такого рода задач?





Служба Windows
Запланированные задачи или задания cron.
Несколько лет назад я видел, как Роб Ховард описал способ использования HttpModule для обработки задач в фоновом режиме. Это не так гладко, как использование кэша, но при определенных обстоятельствах может быть лучше.
Это сообщение в блоге содержит подробную информацию, и есть много других, которые фиксируют ту же информацию, если вы посмотрите вокруг.
Если это в первую очередь задачи обработки данных и вы используете MSSQL, как насчет запланированных задач SSIS?
Проблема с запланированными задачами или заданиями cron заключается в том, что они не разделяют память с веб-сервером. Вы можете настроить запланированную задачу, которая запрашивает страницы с веб-сервера, но это может создать проблемы с длительными задачами. Было бы неплохо иметь несколько потоков с низким приоритетом, запущенных в реальном стеке приложений ASP.Net для выполнения простых служебных задач, таких как очистка кешей, мониторинг ресурсов и просто для общего обслуживания.
Вы можете посмотреть, как это делает DotNetNuke. Я знаю, что он написан на VB.NET, но я модифицировал код на C#. Я просматривал источник и заметил, что у них есть функция в области администрирования для настройки запланированных задач. Эти задачи настраиваются через интерфейс администратора и сохраняются в базе данных. Когда сайт запускается через файл Global.asax, они либо создают другой поток для запуска этой службы, который затем запускает запланированные задачи в свое запланированное время. Я не могу вспомнить точную логику, это было давно, но это определенно хороший ресурс о том, как другие люди выполняли внеполосные процессы для приложений Asp.Net. Этот метод по-прежнему сохраняет логику в приложении Asp.Net, но, на мой взгляд, он выходит из строя.
Простые файлы очереди с отдельным агентом. Для каждого типа внешнего процесса напишите отдельный агент .exe, который следит за каталогом на предмет файлов очереди, которые включают любые данные, необходимые для выполнения указанного процесса.
Это может показаться грязным, но в реальном мире я считаю, что это дает большую гибкость, вы не выполняете много обработки в пространстве процессов ASP.net, и вы можете легко адаптировать этот стиль для обработки фермы на дешевых серверах Linux, на которых работает агент на Mono, когда вам нужно больше ОЗУ / ЦП / диска.
Если вам удобнее всего работать со страницами asp.net, вы можете написать небольшое приложение для выполнения своей работы, а затем «пропинговать» приложение с помощью внешней службы, которая отслеживает ваш веб-сайт. Это сохранит работу приложения.