Сервис для обработки долго выполняющихся процессов в очереди — с чего начать?

Как лучше всего создать службу для обработки долго выполняющихся процессов в очереди? Например, это то, что мы пытаемся сделать

  1. Пользователь загружает данные 401k в сеть
  2. Данные поступают в очередь обработки (таблица базы данных)
  3. Обрабатывается 401 КБ (может занять пару минут на каждого клиента)
  4. Пользователю сообщается по электронной почте, что 401k был принят

Конечно, мы могли бы написать сервис для обработки этого, но что, если сервис выйдет из строя? Как кто-то будет уведомлен? Что делать, если есть исключение? Кроме того, должна ли эта служба обрабатывать другие процессы, не инициированные пользователем (например, отправка электронной почты и т. д.).

У нас есть команда опытных разработчиков .NET, но весь наш опыт связан с веб-приложениями/клиентскими или консольными приложениями, запускаемыми планировщиком задач, поэтому мы будем очень признательны за любое указание, которое вы можете дать.


person Beep beep    schedule 05.09.2010    source источник
comment
Немного разочаровывает, когда все 3 ответа получают отрицательный голос без единого объяснения со стороны отрицающего. :(   -  person p.campbell    schedule 05.09.2010
comment
Был не я! =) Я проголосовал за 2 из 3 (и ничего не делал с @saurabh's ... Я немного опасаюсь добавлять в микс относительно новый фреймворк)   -  person Beep beep    schedule 06.09.2010


Ответы (2)


Рассмотрите возможность использования MSMQ (System.Messaging) для этой задачи. Возможно такой поток:

  • Пользователь загружает данные на веб-сайт.
  • данные записываются в MSMQ.
  • с интервалом n служба Windows просматривает/считывает из очереди следующее ожидающее сообщение.
  • работа выполняется сервисом, данные записываются в БД, и он отправляет другое сообщение в другую очередь для уведомления клиента.
  • другая служба просматривает/читает из 2-й очереди. Отправляет электронное письмо / уведомление клиенту по мере необходимости. Предположите, что эта 2-я очередь необходима для обработки сбоев SMTP и т. д., и ею можно управлять независимо от 1-й очереди.

Другим поводом для беспокойства по поводу потенциальных сбоев может быть еще одна служба или, возможно, механизм опроса на вашем веб-сайте. Прочитайте БД для даты и времени последнего обработанного сообщения. Прочитайте количество элементов, «ожидающих». Если цифры вас не устраивают, отправьте электронное письмо администраторам/клиентам/и т. д. как необходимо.

Использование MSMQ означает, что вы можете использовать вытягивающую систему, и вам не придется нагружать базу данных и сеть опросом каждого n в базе данных. Все отправленные сообщения являются транзакционными, поэтому вам не придется беспокоиться о потерянных/неподтвержденных сообщениях.

@Jess: Понял, что вы пытаетесь прикрыть факты. Правильная очередь поможет в том, что она не забивает вашу базу данных запросами. Масштаб вашего приложения/проекта/клиентов будет определять, является ли это проблемой. Действительно, вы могли бы запихнуть все это в один .aspx в Page_Load, но вам определенно виднее.

Re: перебор. Я «читал» в вопросе, что были некоторые опасения по поводу простоев и того, как такое приложение может с этим справиться. Стандартный веб-сервис не может:

  • хорошо справляться с перебоями в работе БД, поскольку она зависит от БД для сохранения результатов своей работы. Это «ловец», «работник» и «результат» в одном кадре. Это действительно относится к DMZ? Примечание. Пункт 1: «Интернет», а не интрасеть.

  • масштабирование без добавления дополнительных узлов web+worker.

Предлагаемое решение включает в себя:

  • MSMQ имеет собственную реализацию хранилища, поэтому он не зависит от базы данных вашего приложения для очередей и порядка доставки. Это часть Windows и работает как служба. Если MSMQ не работает, значит, Windows не работает, или безопасность настроена неправильно.

  • асинхронная обработка. Ваш веб-уровень может просто «поймать» запрос и «поставить» его в очередь. Вот и все. Никаких раскручивающихся потоков, никакой зависимости от баз данных приложений. Он может вернуться к работе по приему запросов от других пользователей. Пользователям не придется «чувствовать» отставание от напряженного рабочего дня.

  • масштабируемость. Вы можете развернуть службу Windows на 1+ компьютерах для работы.

  • разделение работы: обработка 401k, электронная почта, обработка запросов + аутентификация в отдельных модулях.

  • безопасность - неясно на 100%, является ли это интранет-решением или интернет-решением. Если доступ к Интернету, подумайте, как вы хотите отправлять сообщения из DMZ во внутреннее приложение. Можете ли вы оправдать наличие доступа для чтения и записи к базе данных вашего приложения из открытого Интернета? Рассмотрим какой-нибудь фасад. Очередь обеспечивает это.

person p.campbell    schedule 05.09.2010
comment
Если по какой-то причине MSMQ вышел из строя, или у нас произошел сбой, будет ли он подхватываться со списком, как раньше ... или нам нужно будет что-то для заполнения очереди из очереди базы данных (я просто пытаюсь покрыть свой базы)? Мы должны читать/записывать из базы данных в любом случае (для состояния базы данных), поэтому я не понимаю, как MSMQ помогает по сравнению с опросом очереди каждую минуту или две (если в данный момент ничего не обрабатывается). - person Beep beep; 05.09.2010
comment
MSMQ здесь излишество и мало что дает. - person Steven Sudit; 05.09.2010
comment
Интересно, надо будет еще разобраться. Что касается Интернета/интранета, это приложение служит обеим целям. У нас нет DMZ, но брандмауэр блокирует внешние запросы к веб-серверу, кроме порта 443 (и веб-сервер не находится в домене). - person Beep beep; 05.09.2010
comment
@Jess: подумайте, что произойдет, если ваш веб-сервер будет скомпрометирован. Есть ли у этой зараженной машины доступ к остальной части вашей сети или существуют правила брандмауэра для доступа к файлам . Другими словами, никогда не доверяйте запросу от этой машины DMZ, а скорее это должен быть фасад для вызова другой службы/абстракции. Его следует абстрагировать от вашего приложения в худшем случае злонамеренного захвата. - person p.campbell; 05.09.2010
comment
п. Кэмпбелл – у вас есть примеры того, как люди это устраивали? Везде, где я работал, они просто использовали правила брандмауэра, когда продукт должен быть в Интернете и интрасети. - person Beep beep; 06.09.2010
comment
@Jess: на самом деле нет примеров, но я собирался написать об этом в блоге. Хотя может и 2 дня. Вы хотели больше общаться по электронной почте? - person p.campbell; 06.09.2010
comment
Я думаю, что понял идею (ваш ответ, безусловно, лучший, я собираюсь оставить его без ответа на некоторое время, чтобы посмотреть, не предложит ли кто-нибудь еще какие-нибудь предложения). У нас здесь работает сетевой архитектор, с которым я могу больше поговорить о DMZ и брандмауэре. Я не хочу отнимать время, которое вы могли бы потратить на ведение блога в массах, обсуждая со мной =). - person Beep beep; 06.09.2010
comment
Я надеюсь, что это сработает для вас, но, по моему опыту, MSMQ доставляет больше неудобств, чем пользы. - person Steven Sudit; 08.09.2010

Если у вас есть опыт работы с веб-приложениями, делайте это в веб-приложении. Вы можете выполнять обработку в контексте веб-службы, а не в ее собственном.

изменить

Видимо я недостаточно ясно выразился. IIS обслуживает ASP.NET и статическое содержимое, но это также идеальное место для размещения потока опроса, который обрабатывает задания в базе данных. Я называю его идеальным, потому что он может обновлять статические переменные, которые могут отображаться на внутренней веб-странице, и он может использовать всю инфраструктуру ведения журналов, сбросов и другую инфраструктуру, предоставляемую IIS. Это позволяет избежать всей сложности создания отдельной службы только для запуска одного потока, а затем иметь дело со стоимостью этого решения.

Я делал это несколько раз, с хорошими результатами.

person Steven Sudit    schedule 05.09.2010
comment
Я не уверен, что ты имеешь в виду. Как веб-приложение будет обрабатывать что-то, что выполняется одновременно с действиями пользователя, но не инициируется этими действиями пользователя? Можем ли мы просто установить таймер в отдельном потоке для опроса очереди базы данных? - person Beep beep; 05.09.2010