Страницы

Поиск по вопросам

вторник, 4 июня 2019 г.

Долгие задачи в IIS сервер

Есть задача разработать сервис для рассылки почты, которым будут пользоваться остальные сервисы/приложения/сайты внутри компании. Планирую сделать WEB-сервис. Схема примерно такая:
есть паблик метод который принимает на вход что рассылать и кому. метод получает пачку задач. Метод порождает поток, который берет задачи и рассылает потихонечку. Сам метод продолжает ожидать новых задач.
Есть минимум 2 проблемы:
До этого я всегда размещал сервисы в IIS. Однако, при наших объемах расылки, мы теоретически можем получить задачу которая будет длится часы. Насколько я понимаю IIS может сам прерывать задачи, которые длятся долгое время. Как мне этого избежать? Сервис работает в контексте IIS. Думаю (но не уверен), что реально мой метод будет не порождать потоки, а резервировать существующие внутри пула потоков IIS. Итого мы можем в результате залочить все потоки и полностью заблокировать сервис.
Какой наиболее простой выход из этой ситуации? Возможно, мне стоит использовать SelfHosting WCF?


Ответ

Нет, проблем с прерыванием задач не будет. Просто потому что у вас задача в отдельном потоке - IIS прерывает только те задачи, которые он запускал сам.
Кстати, без отдельного потока он бы тоже не стал прибивать задачу - WCF служба неподвластна IIS, даже если использует его для активации.
Если вы создаете поток через new Thread - то это будет именно отдельный поток, не имеющий никакого отношения к пулу IIS. В других случаях - да, такая проблема присутствует (кстати, у WCF и IIS тоже общие пулы).
Способы "украсть" поток из общего пула:
delegate.BeginInvoke ThreadPool.QueueUserWorkItem new Task BackgroundWorker Просто синхронная работа в операции WCF
и еще куча более редких способов.
Способы щадящей работы с общим пулом потоков:
new Thread Использование асинхронных методов (они будут выполняться в общем пуле - но не будут занимать его надолго).

На самом деле, проблемы вы ищите немного не там. Дело в том, что долгие операции рано или поздно захочется сделать еще и возобновляемыми, чтобы можно было, к примеру, выключить сервер для установки обновлений или для переезда на другой сервер - а потом продолжить все то, что не успело выполниться.
Отдельную службу можно настроить, чтобы она запускалась автоматически. А сайт IIS - нет. Когда перед вами встанет такая задача - переход на SelfHosting WCF будет хорошим решением.

Комментариев нет:

Отправить комментарий