Службы Windows в веб-ферме (как предотвратить конфликты параллелизма) - PullRequest
1 голос
/ 14 сентября 2009

Забегая вперед, когда будет создана веб-ферма ...

У нас есть различные приложения-службы Windows, выполняющие различные фоновые задачи: отправка электронной почты, миниатюры / обработка файлов и т. Д.

В среде серверной фермы мы теоретически могли бы устанавливать и запускать каждую службу на каждом компьютере, однако могут быть конфликты из-за бизнес-объекта, основанного на принципе «первый выиграл при записи», или нежелательного дублирования задач, например: одни и те же электронные письма являются отправить несколько раз.

Сценарий «первый выиграл при записи» можно преодолеть с помощью кода или логики, которая решает проблему или пропускает элемент. (если это базовый механизм организации очередей (список запросов и запись процесса), он будет просто повторен)

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

Чтобы предотвратить дублирование задач, я думаю о создании механизма, который записывает «флаг блокировки» в базу данных, который будет установлен первой запускаемой службой. Этот флаг будет датирован и ссылается на экземпляр службы. Служба, которой «принадлежит» флаг, будет запускать задачи и периодически обновлять эту дату. Также будет установлен тайм-аут / допуск для каждого сервиса в ситуации, когда сервис не владеет флагом, он проверит допуск и при необходимости вступит во владение.

Похоже ли это на разумное решение или нужно перейти к лучшему решению на основе очередей сообщений на этом этапе (также не знаете, как это будет работать в среде фермы?

Технологии: C # / ASP.NET / SQL Server

1 Ответ

2 голосов
/ 14 сентября 2009

Я могу вспомнить два механизма.

  1. Если все ваши задачи получены из активностей базы данных, вы можете создать новую таблицу «задач» и установить триггеры для действий, чтобы вставить новую запись с информацией о задаче. Затем ваши службы Windows могут опрашивать таблицу «задачи» и использовать атомарную транзакцию выбора и удаления, чтобы убедиться, что только одна служба делает это.

  2. Вы можете использовать очередь сообщений и отбросить в ней свои задачи, а затем сделать так, чтобы ваши службы Windows опрашивали очередь. Каждое сообщение в очереди может быть заблокировано только одной службой, поэтому вы можете убедиться, что каждая задача выполняется только один раз. Конечно, вам придется беспокоиться о нагрузке на очередь сообщений. В зависимости от вашего приложения вы можете использовать что-то вроде Amazon Simple Queue Service, что избавит вас от необходимости беспокоиться о надежности и масштабируемости.

...