Существует ли стандартный шаблон для сканирования таблицы задания, выполняющей некоторые действия?

(Я понимаю, что мой заголовок плох. Если после чтения вопроса Вы имеете улучшение в виду, нравитесь или редактируете его или говорите мне, и я изменю его.)

У меня есть относительно общий сценарий таблицы задания, которая имеет 1 строку для некоторой вещи, которая должна быть сделана. Например, это мог быть список электронных писем, которые будут отправлены. Таблица выглядит примерно так:

ID    Completed    TimeCompleted   anything else...
----  ---------    -------------   ----------------
1     No                           blabla
2     No                           blabla
3     Yes          01:04:22
...

Я смотрю или для общепринятой практики / шаблон (или для кода - предпочтенный Сервер C#/SQL) для того, чтобы периодически "сканировать" (я использую термин "сканирование" очень свободно), эта таблица, находя не - завершенные объекты, делая действие и затем отмечая их завершенный когда-то сделанный успешно.

В дополнение к базовому процессу для выполнения вышеупомянутого я рассматриваю следующие требования:

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

Некоторые другие мысли:

  • Я особенно не обеспокоен реализацией, сделанной в базе данных (например, в T-SQL или МН / коде SQL) по сравнению с некоторым внешним кодом программы (например, автономный исполняемый файл или некоторое действие, инициированное веб-страницей), который выполняется против базы данных
  • Сделано ли "выполнение действия" часть синхронно или асинхронно не является чем-то, что я рассматриваю как часть этого вопроса.
5
задан Howiecamp 13 March 2010 в 01:33
поделиться

3 ответа

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

1) Один процесс помещает «сообщение о задании» (возможно, просто идентификатор) в очередь.

2) За очередью следит другой процесс. Он опрашивает очередь на предмет работы и извлекает задания из очереди по одному в порядке их получения. Элементы, которые вы вытащили из очереди, помечаются как «в процессе» - они больше не доступны для других процессов.

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

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

Поддержка .NET включает Microsoft Message Queue и либо Windows Communication Foundation, либо классы в пространстве имен System.Messaging. Это требует некоторой настройки и настройки (вам нужно создать очереди и настроить разрешения), но оно того стоит.

1
ответ дан 15 December 2019 в 06:23
поделиться

Если вы используете SQL 2005+, вы можете изучить Service Broker . Он в значительной степени предназначен для этого.

1
ответ дан 15 December 2019 в 06:23
поделиться

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

1
ответ дан 15 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: