(Я понимаю, что мой заголовок плох. Если после чтения вопроса Вы имеете улучшение в виду, нравитесь или редактируете его или говорите мне, и я изменю его.)
У меня есть относительно общий сценарий таблицы задания, которая имеет 1 строку для некоторой вещи, которая должна быть сделана. Например, это мог быть список электронных писем, которые будут отправлены. Таблица выглядит примерно так:
ID Completed TimeCompleted anything else...
---- --------- ------------- ----------------
1 No blabla
2 No blabla
3 Yes 01:04:22
...
Я смотрю или для общепринятой практики / шаблон (или для кода - предпочтенный Сервер C#/SQL) для того, чтобы периодически "сканировать" (я использую термин "сканирование" очень свободно), эта таблица, находя не - завершенные объекты, делая действие и затем отмечая их завершенный когда-то сделанный успешно.
В дополнение к базовому процессу для выполнения вышеупомянутого я рассматриваю следующие требования:
Некоторые другие мысли:
Если вы готовы рассмотреть технологии, не связанные с базами данных, лучшим (хотя и не единственным) решением будет очереди сообщений (часто вместе с базой данных, которая содержит сведения о каждом задании). Очереди сообщений предоставляют множество функций, но основной рабочий процесс прост:
1) Один процесс помещает «сообщение о задании» (возможно, просто идентификатор) в очередь.
2) За очередью следит другой процесс. Он опрашивает очередь на предмет работы и извлекает задания из очереди по одному в порядке их получения. Элементы, которые вы вытащили из очереди, помечаются как «в процессе» - они больше не доступны для других процессов.
3) Для критических рабочих процессов вы можете выполнить транзакционное чтение - в случае сбоя системы транзакция откатывается, а сообщение все еще находится в очереди. Если есть какое-то другое исключение (например, тайм-аут во время чтения базы данных), вы можете просто перенаправить сообщение в специальную очередь ошибок.
Самый простой способ масштабировать это - настроить процесс чтения на несколько потоков для обработки заданий, которые он выполняет из очереди. В качестве альтернативы вы можете масштабировать, используя несколько процессов чтения, которые могут находиться на разных серверах.
Поддержка .NET включает Microsoft Message Queue и либо Windows Communication Foundation, либо классы в пространстве имен System.Messaging. Это требует некоторой настройки и настройки (вам нужно создать очереди и настроить разрешения), но оно того стоит.
Если вы используете SQL 2005+, вы можете изучить Service Broker . Он в значительной степени предназначен для этого.
Для масштабирования вы можете рассмотреть возможность сканирования готовых заданий с последующим добавлением их в очередь сообщений. Таким образом, несколько потребителей могут читать готовые задания из очереди. Пометить задания как «выполняющиеся» можно так же просто, как поместить это значение в столбец «Завершено», или вы можете добавить столбец TimeStarted и иметь заранее определенный период тайм-аута, прежде чем задание будет сброшено и получит право на обработку другим рабочим потоком. . (Последний подход предполагает, что обработка завершилась неудачно, если по прошествии некоторого времени задание не завершилось. Сбой после некоторого количества попыток должен вызвать ручную проверку этого задания.) Тот же процесс-демон, который сканирует базу данных на предмет готовых заданий для добавления в очередь, может ищите вакансии, срок действия которых истек.