Система очередей, которая поддерживает группировку заданий (например, несколько заданий на 1 работника одновременно)

Я ищу систему очередей, которая могла бы поддерживать следующий сценарий:

  • Клиент добавляет задание - чтобы проверить, сколько Facebook лайков имеет конкретный URL (URL1);
  • Клиент добавляет еще одно задание - чтобы проверить ту же информацию для URL2;
  • [....]

  • Рабочий выбирает от 1 до 50 заданий (URL-адресов) из очереди (например, если их всего 5 - он берет 5, если есть 60 - берет 50, оставляя другие для другого работника), и выдает запрос в Facebook. API (который позволяет использовать несколько URL-адресов на запрос). В случае успеха все задания удаляются из очереди, в случае сбоя - все остаются.

Я работаю с PHP и изучил Gearman, Beanstalkd, но не обнаружил аналогичных функций. Есть ли какая-нибудь (бесплатная) система очередей, которая поддерживала бы такое «пакетное удаление из очереди»?

А может, кто-нибудь может предложить альтернативный способ решения такой проблемы? Я подумал о том, чтобы сохранить список URL-адресов для проверки вне системы очередей, а затем добавить их в пакеты по максимум N элементов с помощью задания cron, которое запускается каждые X периодов. Но это своего рода создание собственной очереди, которая сводит на нет всю цель, не так ли?


person Aurimas    schedule 03.03.2012    source источник
comment
Это не самый чистый способ сделать это, но я думаю, что с Beanstalk вы можете заставить одного работника попытаться получить несколько заданий (просто используйте цикл).   -  person trutheality    schedule 04.03.2012
comment
@trutheality Я обязательно посмотрю - пока не нашел никого, кто упомянул бы о такой возможности: /   -  person Aurimas    schedule 05.03.2012
comment
@Aurimas, как ты решил эту проблему с помощью gearman?   -  person Suriya    schedule 08.12.2015


Ответы (2)


Я использовал Beanstalkd для получения 100 имен твиттера за раз, а затем для вызова API со всеми ними. Когда я закончил, я удалил их - но я мог бы решить не удалять некоторые (или все), если бы захотел.

Это был простой цикл, чтобы зарезервировать начальные 100 (по одному), и я поместил результаты (идентификатор задания и возвращенные данные) в массив. Когда я закончил работу с полезной нагрузкой (в данном случае, экранным именем Twitter), я удалил их, но я мог бы легко вернуть их в очередь.

person Alister Bulman    schedule 29.03.2012
comment
Спасибо - я вижу, как это можно сделать с помощью Beanstalkd. В конце концов, я выбрал Gearman, так что теперь мне просто нужно выяснить, смогу ли я сделать то же самое с Gearman. - person Aurimas; 30.03.2012

Возможно, вы могли бы вдохновиться системой очереди заданий MediaWiki. Не очень сложно, но у него есть некоторые проблемы, с которыми вы можете столкнуться, если решите свернуть свой своя.

Используемые для этого таблицы БД определены здесь.

person Etienne Perot    schedule 03.03.2012
comment
Спасибо за предложение, но я не думаю, что эта система очередей поддерживает то, что я ищу (если только я это не пропустил). Тем не менее, это хорошая отправная точка для разработки собственной системы очередей! - person Aurimas; 05.03.2012