Задачи в базе данных с несколькими программами, обрабатывающими их - как гарантировать, что каждая из них обрабатывается ровно один раз? - PullRequest
2 голосов
/ 03 февраля 2012

Дано:

  1. У меня есть база данных с таблицей, полной задач.
  2. У меня есть программа, которая обрабатывает эти задачи. База данных абстрагируется с помощью NHibernate.
  3. Программа запускается несколько раз.

Теперь я хочу убедиться, что каждая задача обрабатывается ровно одним процессом.

Одна возможность описана здесь , но я не вижу, как я мог бы передать это объектам домена, сопоставленным с базой данных с помощью NHibernate.

Итак, вопрос:
Как реализовать систему обработки задач с центральным хранилищем данных и несколькими параллельными процессами, доступ к которым осуществляется не напрямую, а через NHibernate?

1 Ответ

2 голосов
/ 03 февраля 2012

Возможное решение 1

Одна вещь, которую мы делаем, - это создание централизованного процесса, который выполняет работу.В настоящее время у нас есть служба Wcf, которая работает в InstanceContextMode.Single ... в основном синглтон-сервисе.

Когда работа была назначена, она обновит ее в базе данных, чтобы отразить, что она была назначена с идентификатором запрашивающего или просто значением, которое говорит, что она назначена, если вам все равно, кто ее получает.

Возможное решение 2

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

Я никогда не использовал оптимистичный параллелизм в NHibernate, но, похоже, чтоРешение может работать.Я не уверен, что некоторые процессы не будут нуждаться в работе, и я думаю, что вам придется заново инициализировать сеанс, когда этот объект брошен.

По моему мнению, вариант 1 или что-то похожее на эту модельработает лучше всего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...