2010-09-29 1 views
6

У меня есть программная система, которая выполняет OCR на нескольких машинах одновременно. Текущая система работает следующим образом:Рекомендации по проектированию Распределенные вычисления

  1. Все документы, которые должны быть сделаны, вставляются в таблицу в db.
  2. Каждый клиентский ocr-пул объединяет эту таблицу и всякий раз, когда данные найдены для ocr, он блокирует таблицу и выбирает n нет. файлов для ocr. Блокировка используется для атомарности.
  3. После того, как каждый документ снят, статус документа будет обновлен как завершенный.

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

Так что мой вопрос: какой лучший способ создать такую ​​систему, я хочу, чтобы база данных как хранилище была не только местом синхронизации. Я хочу услышать ваши мысли.

ответ

5

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

Это предположение, что действительно хотите использовать базу данных, а не очередь сообщений некоторого описания. Вы могли бы рассмотреть возможность использования очереди сообщений в сочетании с с базой данных ... и некоторые базы данных имеют встроенные в них очереди, что также может быть полезно. Даже если вам нужна запись в базе данных, вы можете иметь очередь только из идентификаторов - клиенты могут просто вытащить следующий элемент из очереди, а затем извлечь данные. Вы все равно можете записать время, в которое элемент был вынут из очереди, так что, если клиент сработает или что-то в этом роде, пакетное задание может помещать любые неудачные задания (например, те, которые были собраны днем ​​назад, t еще есть результаты) в очереди.

+0

Спасибо за ваш быстрый ответ, я на самом деле сделал то же, что вы упомянули в своем первом параграфе. Но я не удовлетворен этим решением. – crypted

+0

@ Int3: Почему бы и нет? Я не предлагаю держать транзакцию открытой при обработке данных - просто отмечая ее как находящуюся в процессе. –

2

С использованием опроса базы данных для ocr-файлов лучше использовать службу обмена сообщениями Windows. Что делать, если база данных не работает и ваша служба ocr запущена, ocr-сервис не запускается до тех пор, пока служба базы данных не будет запущена, с использованием очереди сообщений Windows вы можете получить информацию для ocr-файла из службы обмена сообщениями (онлайн или офф- line), так что ocr-сервис будет автоматически запускаться после того, как машина заработает, и не будет никакой проблемы с блокировкой в ​​базе данных.

+0

MSMQ звучит хорошо, что также предлагает Jon skeet. – crypted