Как я могу использовать Gearman для обработки файлов без уничтожения БД? - PullRequest
2 голосов
/ 25 октября 2011

В настоящее время я разрабатываю систему для обработки загруженных файлов.

Файлы загружаются через веб-интерфейс LAMP и должны обрабатываться в несколько этапов, некоторые из которых являются последовательными, а другие могут работать параллельно.

Несколько ключевых моментов:

  • Клиенты, загружающие файлы, заботятся только о безопасной доставке файлов, а не о результатах обработки, поэтому она может быть полностью асинхронной.
  • Размер файлов не превышает 50 КБ
  • Система должна масштабироваться для обработки более миллиона файлов в день
  • Очень важно, чтобы файлы не могли быть потеряны или оставлены необработанными
  • Мое предположение - MySQL, но у меня нет проблем с NoSQL, если бы это могло дать преимущество.

Моя первоначальная идея состояла в том, чтобы клиентская часть помещала файлы прямо в MySQL.БД, а затем несколько рабочих процессов опрашивают флаги настроек базы данных по мере выполнения каждого шага.После некоторых грубых вычислений я понял, что это не будет масштабироваться, поскольку рабочий опрос начнет вызывать проблемы с блокировкой таблицы загрузки.

После некоторых исследований кажется, что Gearman может быть решением проблемы.Рабочие могут зарегистрироваться на сервере Gearman и могут опросить рабочие места, не нанося вред БД.

В настоящее время я озадачен тем, как наиболее эффективно распределять задания.Я вижу три способа сделать это:

  • Написать одного диспетчера для опроса базы данных и затем отправить задания в Gearman
  • Запустить процесс загрузки с помощью асинхронного задания Gearmanкогда он получает файл
  • Используйте расширение Gearman MySQL UDF, чтобы заставить БД запускать задания при вставке файлов

Первый подход все равно несколько забьет БД, но это может быть тривиальнооправиться от неудачи.Вторые два подхода, по-видимому, требуют включения возможности восстановления очереди Gearman после сбоев, но я обеспокоен тем, что, если я включу это, я потеряю грубую скорость, которая привлекает меня к Gearman, и переместит узкое место в DB вниз по течению.

Любой совет, какой из этих подходов будет наиболее эффективным (или даже лучшие примеры из реальной жизни), будет высоко оценен.

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

Ответы [ 2 ]

2 голосов
/ 24 мая 2012

Это было открыто в течение некоторого времени, поэтому я подумал, что предоставлю некоторую информацию о подходе, который я выбрал.

Я создаю задание механика каждый раз, когда файл загружается для "отправляющего" работника.который понимает последовательность шагов обработки, необходимых для каждого файла.Диспетчер ставит в очередь задания механика для каждого из этапов обработки.

Любые завершенные задания записывают метку времени завершения в БД и вызывают диспетчер, который может затем поставить в очередь любые последующие задачи.

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

0 голосов
/ 23 января 2012

Я хотел бы сохранить файлы на диск, а затем отправить имя файла в Gearman.Когда каждая часть процесса завершается, она генерирует другое сообщение для следующей части процесса, вы можете переместить файл в новый каталог work-in-process для следующего этапа работы с ним.

...