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