В настоящее время я разрабатываю систему для обработки загруженных файлов.
Файлы загружаются через веб-интерфейс LAMP и должны обрабатываться в несколько этапов, некоторые из которых являются последовательными, а другие могут работать параллельно.
Несколько ключевых моментов:
- Клиенты, загружающие файлы, заботятся только о безопасной доставке файлов, а не о результатах обработки, поэтому она может быть полностью асинхронной.
- Размер файлов не превышает 50 КБ
- Система должна масштабироваться для обработки более миллиона файлов в день
- Очень важно, чтобы файлы не могли быть потеряны или оставлены необработанными
- Мое предположение - MySQL, но у меня нет проблем с NoSQL, если бы это могло дать преимущество.
Моя первоначальная идея состояла в том, чтобы клиентская часть помещала файлы прямо в MySQL.БД, а затем несколько рабочих процессов опрашивают флаги настроек базы данных по мере выполнения каждого шага.После некоторых грубых вычислений я понял, что это не будет масштабироваться, поскольку рабочий опрос начнет вызывать проблемы с блокировкой таблицы загрузки.
После некоторых исследований кажется, что Gearman может быть решением проблемы.Рабочие могут зарегистрироваться на сервере Gearman и могут опросить рабочие места, не нанося вред БД.
В настоящее время я озадачен тем, как наиболее эффективно распределять задания.Я вижу три способа сделать это:
- Написать одного диспетчера для опроса базы данных и затем отправить задания в Gearman
- Запустить процесс загрузки с помощью асинхронного задания Gearmanкогда он получает файл
- Используйте расширение Gearman MySQL UDF, чтобы заставить БД запускать задания при вставке файлов
Первый подход все равно несколько забьет БД, но это может быть тривиальнооправиться от неудачи.Вторые два подхода, по-видимому, требуют включения возможности восстановления очереди Gearman после сбоев, но я обеспокоен тем, что, если я включу это, я потеряю грубую скорость, которая привлекает меня к Gearman, и переместит узкое место в DB вниз по течению.
Любой совет, какой из этих подходов будет наиболее эффективным (или даже лучшие примеры из реальной жизни), будет высоко оценен.
Также не стесняйтесь, если вы думаете, что я собираюсьобо всем этом неправильно.