Периодическая реализация событий - PullRequest
3 голосов
/ 19 апреля 2011

У меня есть веб-сайт ASP.NET MVC 2. Все возможности находятся в хранимых процедурах базы данных (MS SQL SERVER 2008).
Задача:
Какой-то пользователь создает запись, используя сайт. Соответствующие строки вставки в таблицу. Эта строка имеет внешний ключ для другой таблицы, ее значение устанавливается в процедуре. Затем я хочу, чтобы приложение переназначило запись (изменить поле внешнего ключа) на другую, если она не была обработана в течение 1 минуты.
Например:
1. Пользователь создает запись A(id = 1, adminId = 1).
2. Только администратор с id = 1 видит эту запись, и он должен обработать ее в течение 1 минуты.
3. Если admin 1 не обрабатывает запись в течение 1 минуты, она должна быть переназначена другому администратору. Например, A обновляет до (adminId = 3).
Каким путем было бы лучше сделать это? Параллельная нить? Еще одно приложение в фоновом режиме? Или ...

Ответы [ 2 ]

1 голос
/ 19 апреля 2011

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

    SELECT * FROM Table Where 
    (user='Admin3') Or 
    (DATEDIFF(m,GETDATE(),@LastHandleTime)=1 
        And dbo.fn_ChangeAdminName('Admin3') 
 and locked=0)

Здесь функция fn_ChangeAdminName () показывает, какие пользователи могут обращаться к записям вместо «оригинального» пользователя.

1 голос
/ 19 апреля 2011

Я не думаю, что вам нужен отдельный процесс для обработки времени.

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

Итак

  1. Пользователь создает запись A (id = 1, adminId = 1) с отметкой времени ts
  2. Если администратор пытается получить доступзапись, которую БД / приложение разрешит, если разница между текущей датой / временем и ts будет меньше 1 минуты;если более 1 минуты запись переназначается другому администратору
  3. Если другой администратор пытается получить доступ к записям и прошло более 1 минуты, запись назначается им (еще на одну минуту?)

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

Это только если вы хотите отправить записи или выполнить вышеуказанное обслуживание автоматически (для некоторых отчетов).Тем не менее, это всегда можно сделать, проверив, переназначены ли записи перед получением других данных.

Наличие другого процесса и обеспечение его такой же стабильности, как в DB , нетривиально, но вы можетесоздайте заданий , которые будут периодически запускаться в среде БД (или вы можете пойти по пути SMO , если это больше подходит для вашего сценария).

Однако, я полагаю, вы не описаливсе состояния, которые может иметь запись (что происходит, если adminId | 3 не «обрабатывает» запись).

EDIT После комментария позвольте мне объяснить немного.Предполагая, что вам нужно выполнять какую-то работу каждые 5 минут (или каждую минуту), тогда не имеет значения, выполняете ли вы это каждую минуту или делаете это в первый раз, прежде чем пользователь запрашивает данные, на которые он может повлиять.

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

Ленивые обновления против своевременных обновлений

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