Есть задача разработать сервис для рассылки почты, которым будут пользоваться остальные сервисы/приложения/сайты внутри компании. Планирую сделать 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 будет хорошим решением.
Комментариев нет:
Отправить комментарий