Как я могу использовать Gearman для обработки файлов, не убивая БД?

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

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

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

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

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

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

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

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

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

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

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


person Nick Long    schedule 25.10.2011    source источник


Ответы (2)


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

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

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

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

person Nick Long    schedule 24.05.2012

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

person Alister Bulman    schedule 23.01.2012
comment
Мне нужен достаточно высокопроизводительный и устойчивый доступ к файлам, а они довольно малы, поэтому я думаю, что управление ими в базе данных упрощает их отслеживание. - person Nick Long; 25.01.2012