Лучший подход к запуску потока/процесса в IIS/WCF на общем хостинге
-
21-08-2019 - |
Вопрос
Сценарий:Служба WCF получает XDocument от клиентов, обрабатывает его и вставляет строку в таблицу MS SQL.
Несколько клиентов могут одновременно вызывать службу WCF.Звонок обычно не занимает много времени (несколько секунд).
Теперь мне нужно что-нибудь для опроса таблицы SQL и асинхронного запуска другого набора процессов.Второй процесс не требует обратного вызова и никак не связан с WCF.Ему просто нужно прочитать таблицу и выполнить ряд методов и, возможно, вызов веб-сервиса (если, конечно, есть записи), и все.Клиенты службы WCF, использующие вышеупомянутую службу, понятия не имеют об этом и не заботятся об этом.
я читал о этот вопрос в StackOverflow и я также знаю, что служба Windows была бы идеальна, но эта служба WCF будет размещена на общем хостинге (discountasp или аналогичном), и поэтому установка службы Windows не будет вариантом (насколько мне известно).
Учитывая, что архитектура фиксированная (т.е.:Я не могу ни изменить таблицу, она взята из устаревшего формата, ни изменить механизм службы WCF), что бы вы предложили опросить/обработать эту таблицу?
Я бы сказал, что мне нужно проверять каждые 10 минут или около того.Это не обязательно должно быть мгновенно.
Спасибо.
Решение
Изменять.Предоставьте этот процесс как другую службу WCF и запустите команду go из ящика, находящегося под вашим контролем, в запланированное время.
Хотя вы можете запускать фоновые потоки в WCF или использовать срок действия кэша в качестве планировщика для бедняков, они остановятся, когда ваш пул приложений перезапустится до следующего обращения к вашему веб-сайту, и пул приложений снова заработает.По крайней мере, запуск запроса с компьютера, которым вы управляете, означает, что вы знаете, что пул приложений будет возвращаться каждые 10 минут или около того, потому что вы отправили запрос в его направлении.
Другие советы
Веб-приложение вообще не приспособлено для запуска чего-либо с фиксированным интервалом.Если запросы не поступают, в приложении не выполняется код, а если приложение какое-то время неактивно, IIS может принять решение полностью закрыть его до поступления следующего запроса.
Для некоторых приложений совершенно не важно, что что-то запускалось через определенный интервал, важно лишь то, что оно запускалось недавно.Если это относится к вашему приложению, вы можете просто отслеживать, когда таблица последний раз опрашивалась, и для каждого запроса проверять, прошло ли достаточно времени для повторного опроса таблицы.
Если у вас есть доступ к администрированию базы данных, в SQL Server есть планировщик.Он может запускать запросы, хранимые процедуры и даже запускать процессы, если у вас есть разрешение (хотя это маловероятно на общем хостинге).
Если вам нужен код в определенный интервал времени, и вы не можете получить доступ к серверу, чтобы запланировать его или запустить как службу, или не можете использовать планировщик SQL Server, это просто невозможно.
Сделайте пул приложений «всегда активным» и делайте со своими потоками все, что захотите.