Мы имеем дело с интересной проблемой в StackOverflow.
У нас есть целая куча маленьких «дел, которые нужно сделать в ближайшее время». Примером является обновление списков «Связанные вопросы». То, что мы делали в прошлом, - это перенести эти задачи на страницы некоторых пользователей.
Это никогда не было идеальным, но это не было действительно заметно. Теперь, когда SO прошел знак вопроса в 1 000 000, эти несчастные пользователи начинают чувствовать это.
Естественное решение - отодвинуть эти задачи на задний план. Есть два широких способа сделать это, я рассматриваю.
1. В IIS как пользовательский Thread-Pool / Work-Queue
По сути, мы раскручиваем несколько (не ThreadPool , чтобы не мешать IIS) потоков и предоставляем им обслуживание некоторых коллекций, в которые мы помещаем Funcs .
Большим профессионалом здесь является простота. Нам не нужно беспокоиться о том, чтобы что-то маршалировать, и при этом мы не должны убедиться, что какой-то внешний сервис работает и реагирует.
Мы также получаем доступ ко всему нашему общему коду.
Дело в том, что мы не должны использовать фоновые потоки. Все возражения, о которых я знаю, сосредоточены вокруг голодающего IIS (если вы используете ThreadPool) и потоков, умирающих случайным образом (из-за рециркуляции AppPool).
У нас есть существующая инфраструктура, позволяющая избежать случайной смерти потока (в принципе, можно обнаружить, что задача была отменена), и ограничение количества потоков (и использование потоков, не относящихся к ThreadPool) также не представляет трудностей.
Перемещено в StackOverflow , поскольку здесь это не было адресовано.
2. Как услуга
Либо какое-нибудь стороннее решение, либо нестандартное.
По сути, мы перенаправили задачу через границу процесса в какой-нибудь сервис и просто забыли об этом. Предположительно, мы связываем некоторый код или ограничиваемся необработанным SQL + строка подключения.
Профи в том, что это «правильный путь» сделать это.
Минусы в том, что мы либо очень ограничены в своих возможностях, либо нам придется разработать какую-то систему для синхронизации этого сервиса с нашей базой кода. Нам также нужно каким-то образом подключить весь наш мониторинг и регистрацию ошибок, которые мы получаем бесплатно с опцией «In IIS».
Есть ли другие преимущества или проблемы с сервисным подходом?
Короче говоря, есть ли непредвиденные и непреодолимые проблемы, которые делают подход № 1 неработоспособным, и если да, то есть ли какие-либо хорошие сторонние сервисы, которые мы должны рассмотреть для подхода № 2?