Как реализовать круговой список задач с помощью Gearman?

У меня есть таблица в моей базе данных MySQL, содержащая 200K записей. Каждая запись содержит URL-адрес, который нужно каким-то образом обработать. Обработка URL-адресов в моем случае - нетривиальная задача, поэтому я решил использовать очередь Gearman для их запуска в фоновом режиме. рабочие места.

Итак, для каждой записи (URL) в моей таблице я планирую создать отдельную задачу и передать ее Gearman.

Кроме того, данные в моей таблице не статичны, и очень часто туда будут добавляться новые URL-адреса.

Согласно моей бизнес-логике, мне нужно постоянно обрабатывать этот список URL-адресов. Когда я завершу обработку последней записи в моей таблице БД, я должен перейти к первой, и процесс должен быть повторен для всех записей снова.

Итак, мои вопросы:

  • Как лучше поставить задачи в Gearman в этом случае?
  • Стоит ли использовать cron или можно организовать логику, при которой Gearman будет автоматически тянуть задачи?
  • Сколько задач можно отправить в Gearman за один раз?

Итак, не могли бы вы рассказать мне, как лучше всего реализовать эту систему?


person alexanoid    schedule 01.06.2012    source источник


Ответы (1)


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

  1. Как только новый URL-адрес появится в вашей системе, добавьте его в очередь фоновых заданий Gearman.

  2. В реализации работника Gearman, как только задание будет обработано, снова добавьте его в очередь.

Таким образом, вы будете постоянно обрабатывать URL-адреса в том порядке, в котором они были добавлены в очередь, и вся очередь будет бесконечно повторяться. Это, конечно, предполагает, что вы постоянно выполняете одну задачу.

Если есть более одной задачи (например, сначала выполните задачу №1 по всем URL-адресам, затем выполните задачу №2 и т. Д.), Вы можете следовать аналогичному шаблону, просто отправив задания во вторую очередь (например, другого исполнителя) после первой. задача. Затем, в зависимости от того, как именно вы хотите заказать работу, вы либо увидите, что все происходит автоматически (если оба воркера доступны все время), либо вам нужно будет отслеживать очередь №1 и запускать воркера №2 только тогда, когда она пуста. . Подробнее о таком мониторинге см. Есть ли способ получить доступ к администрированию Gearman?

В целом Gearman может легко и быстро обработать 200 000 единиц хранения. Теперь использование постоянной очереди немного замедлит работу (по сути, это соединение MySQL / другой БД), но не должно делать ничего ужасного. Я сам не пробовал, но истории успеха обычно включают в себя еще больше элементов и часто постоянную очередь.

Единственное, что вам нужно знать, это то, что Gearman не позволяет обрабатывать задания партиями (например, 10 элементов одновременно). Поскольку вы обрабатываете URL-адреса, это означает, что вам нужно будет обрабатывать 1 URL-адрес за раз, что дорого, так как вам нужно будет ждать, пока каждый из них будет загружен отдельно. Вы можете избежать этого, используя для обработки язык программирования, управляемый событиями / неблокирующий, или взглянув на beanstalkd, что позволяет выполнять такую ​​пакетную обработку.

person Aurimas    schedule 01.06.2012
comment
Большое спасибо за подробное решение! Еще один вопрос - стоит ли использовать постоянную очередь передач и есть ли большая проблема, если для него в очереди стоит 200000 задач? - person alexanoid; 01.06.2012
comment
@alexanoid смотри мои правки ответа - в общем, проблем быть не должно. - person Aurimas; 04.06.2012
comment
@Aurimas Привет, но как сохранить транзакцию, когда я читаю ее в очередь? Давайте возьмем пример процесса, который потерпел сбой после отправки уведомления job_completed. В этом случае у этой работы никогда не будет расписания. - person Vivek Goel; 02.10.2012
comment
@VivekGoel ну, я думаю, вам просто нужно убедиться, что не произойдет сбоев между вызовом job_completed и повторной отправкой в ​​очередь :) Если вам нужно быть на 100% уверенным, все время и крайние случаи будут фатальными .. Я думаю, вы необходимо сохранить его где-нибудь перед отправкой уведомления job_complete и удалить его снова после повторной отправки. - person Aurimas; 03.10.2012