Что такое типичный поток Gearman для модификации базы данных?

Что такое типичный поток Gearman для модификации базы данных?

20.11.2019 09:35:35 Просмотров 55 Источник

Хотелось бы получить некоторую помощь в понимании типичных лучших практик при выполнении ряда задач с использованием Gearman в сочетании с PHP (среди прочего).

Вот основной сценарий:

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

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

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

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

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

У вопроса есть решение - Посмотреть?

Ответы - Что такое типичный поток Gearman для модификации базы данных? / What is a typical Gearman flow for database modification?

Alex Barker

20.11.2019 09:57:25

Вы уверены, что хотите использовать Gearman? Я только спрашиваю, потому что это был сервер заданий defacto PHP около 20 лет назад, но он не был надежным решением в течение довольно долгого времени. Я не уверен, что все резко улучшилось за последние 12 месяцев, но в последний раз, когда я оценивал Gearman, он не был способен к производству.

Теперь перейдем к вопросам.

каков общепринятый способ сделать это? Должен ли я использовать обратный вызов, который в конечном итоге запустит другой php-скрипт, который будет выполнять модификацию, или сама рабочая функция должна выполнять модификацию базы данных?

Вы собираетесь следовать этому общему шаблону с любой очередью заданий:

  • Соберите единицу работы. В вашем случае это будет 1 из изображений и любая информация о том, кому принадлежит это изображение, идентификатор пользователя и т. д.
  • Отправьте работу в очередь заданий с этой информацией.
  • Рабочий процесс очереди заданий берет работу и начинает ее обработку. Здесь я бы создал записи в базе данных, поскольку вы можете выбрать, чтобы не создавать их при сбое задания.

Очередь заданий будет отслеживать, какие задания завершены и, как правило, статус завершения. Если вы используете gearman, это процесс gearmand. Вам также нужно что-то делать и обрабатывать эту работу, я буду называть это рабочим местом. Работник задания-это то, где происходит параллелизм, который, как я думаю, вы имели в виду, когда сказали: "запустите другой php-скрипт."Вы можете просто запустить PHP-скрипт с интервалом (с супервизором или cronjob) для своего рода опроса и вилочного подхода. Это не самый эффективный подход, но не похоже, что это действительно будет иметь значение для вашего варианта использования приложений. Вы также можете использовать pcntl_fork или pthreads в PHP, чтобы получить больше контроля над параллельными процессами и реализовать шаблон рабочего пула, но это намного сложнее, чем просто запустить скрипт. Если вы заинтересованы в попытке реализовать некоторый параллелизм в PHP, у меня есть доказательство концепции job worker для beanstalkd, доступного на GitHub, который реализует рабочий пул как с fork, так и с pthreads. Я также включил несколько других ресурсов по теме параллелизма.

Закрыть X