Как я могу получить список запланированных заданий в Gearman?

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

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

Наверное, мне это вообще не нужно :) Итак, вот еще кое-что о том, чем я хочу заниматься, я открыт для лучших предложений. И клиент, и рабочий работают на PHP. В нашем интерфейсе администратора администраторы могут инициировать новый импорт для клиента; поскольку импорт занимает некоторое время, он запускается как фоновая задача. Теперь простые вопросы, на которые я хочу ответить: когда последний раз выполнялся импорт для этого клиента? Поставлен ли импорт в очередь для этого клиента (в этом случае запуск нового импорта не должен иметь никакого эффекта)? Приятно иметь: на какой позиции в очереди находится это задание (чтобы я мог оценить, когда оно будет выполнено)?

Спасибо!


person Georg M. Sorst    schedule 24.06.2012    source источник


Ответы (2)


Обычно вы используете протокол администратора, но, как вы обнаружили, он не перечисляет фактические задачи в очереди. Мы решили это, отслеживая текущие задачи, которые мы начали на нашем уровне приложения, и имея обратный вызов в нашем worker, сообщающий приложению, когда задача завершена. Это позволяет нам выполнять очистку, уведомление и т. Д., Когда задача завершена, и позволяет нам сохранить эту логику в приложении, а не в самом воркере.

Что касается прогресса, лучший способ - просто использовать встроенную механику прогресса в самом Gearman, в модуле PHP вы можете вызвать это с помощью $job->sendStatus(percentDone, 100). Затем клиент может получить это значение с сервера, используя дескриптор задачи (который будет возвращен при запуске задания). Это позволит вам показать пользователям текущий прогресс в вашем интерфейсе.

Пока у вас есть текущие запущенные задачи в вашем приложении, вы можете использовать это, чтобы ответить, есть ли уже запущенные аналогичные задачи, но вы также можете использовать встроенное объединение / дедупликацию заданий gearman; см. параметр $ unique при добавлении задачи.

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

person MatsLindh    schedule 25.06.2012
comment
Большое спасибо, я думаю, что тогда можно будет связать ручки работы с клиентом. По-прежнему кажется немного неуклюжим, например. когда приложение выходит из строя, но Gearman продолжает работать, дескрипторы заданий не работают. Что ж, ничего, с чем не мог бы справиться хороший процесс уборщика, звучит как решение, с которым я могу жить. - person Georg M. Sorst; 26.06.2012

Вы в значительной степени дали себе ответ: используйте СУБД (MySQL или Postgres) в качестве бэкэнда устойчивости и запросите таблицу gearman_queue.

Например, мы разработали гибридное решение: мы генерируем и передаем уникальный идентификатор для задания, который мы передаем в качестве третьего параметра в doBackground () (http://php.net/manual/en/gearmanclient.dobackground.php) при постановке задания в очередь.

Затем мы используем этот идентификатор для запроса таблицы gearman, чтобы проверить статус задания по полю таблицы unique_key. Вы также можете получить позицию в очереди, поскольку записи уже упорядочены.

Бонус Pro: мы также ловим исключения внутри воркера. Если задание не удается, мы записываем полезную нагрузку задания (которая представляет собой сериализованный объект JSON) в файл, а затем забираем файл и повторно запускаем задание с помощью cronjob, увеличивая внутренний счетчик повторных попыток, поэтому мы повторяем одно задание максимум 3 раза, и проверьте работу позже, если она все еще не удалась.

person paul.ago    schedule 15.10.2014