Службы Windows в веб-ферме (как предотвратить конфликты параллелизма)

StackOverflow https://stackoverflow.com/questions/1420578

Вопрос

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top