Как да внедрите списък с кръгови задачи с Gearman?

Имам таблица в моята база данни MySQL, съдържаща 200K записа. Всеки запис съдържа URL адрес, който трябва да бъде обработен по някакъв начин. Обработката на URL в моя случай не е тривиална задача, така че избрах да използвам опашката Gearman, за да ги изпълнявам като фон работни места.

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

Освен това данните в моята таблица не са статични и много често там ще се добавят нови URL адреси.

Според моята бизнес логика трябва непрекъснато да обработвам този списък с URL адреси. Когато завърша обработката на последния запис в моята DB таблица, трябва да премина към първия и процесът трябва да се повтори отново за всички записи.

Та моите въпроси:

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

И така, бихте ли ми казали как най-добре да внедря тази система?


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


Отговори (1)


Звучи, че това, от което се нуждаете, е опашка, където обработените елементи се добавят обратно към края на опашката. Предлагам да организираме работния процес по следния начин:

  1. След като нов URL се появи във вашата система, добавете го към опашката за фонови задачи на Gearman.

  2. В изпълнението на Gearman worker, след като заданието бъде обработено, добавете го отново към опашката.

По този начин вие непрекъснато ще обработвате URL адреси в реда, в който са били добавени към опашката и цялата опашка ще се повтаря безкрайно. Това предполага, че многократно изпълнявате една задача, разбира се.

Ако има повече от 1 задача (напр. първо изпълнете задача №1 на всички URL адреси, след това изпълнете задача №2 и т.н.), можете да следвате подобен модел, просто да изпратите задачите на втората опашка (напр. различен работник) след първата задача. След това, в зависимост от това как точно искате да поръчате работата, или ще видите, че всичко се случва автоматично (ако и двамата работници са на разположение през цялото време), или ще трябва да наблюдавате опашка #1 и да стартирате работник #2 само когато е празна . За подробности относно такова наблюдение вижте Всякакъв начин за достъп до администрацията на Gearman?

Като цяло Gearman може лесно и бързо да се справи с 200 000 артикула. Сега използването на постоянна опашка ще забави малко нещата (по същество това е MySQL / друга DB връзка), но не трябва да прави нищо ужасно. Самият аз не съм го пробвал, но историите за успех обикновено включват още повече артикули и често също постоянна опашка.

Единственото нещо, което трябва да знаете е, че Gearman не позволява обработка на задания на партиди (напр. 10 елемента едновременно). Тъй като обработвате URL адреси, това означава, че ще трябва да обработвате 1 URL адрес наведнъж, което е скъпо, тъй като ще трябва да изчакате всеки от тях да бъде изтеглен отделно. Можете да го избегнете или като използвате управляван от събития / неблокиращ език за програмиране за обработка, или можете да погледнете beanstalkd, което позволява такава пакетна обработка.

person Aurimas    schedule 01.06.2012
comment
благодаря много за вашето подробно решение! Още един въпрос - трябва ли да използвам persistent gearman queue и голям проблем ли е да има 200 000 задачи за него в опашката? - person alexanoid; 01.06.2012
comment
@alexanoid виж моите редакции на отговорите - като цяло не би трябвало да има проблеми. - person Aurimas; 04.06.2012
comment
@Aurimas Здравейте, но как да запазя транзакцията, когато я чета на опашка? Да вземем примерен процес, претърпял срив след изпращане на известие за завършено задание. В този случай тази работа никога няма да получи график. - person Vivek Goel; 02.10.2012
comment
@VivekGoel добре, предполагам, че просто трябва да се уверите, че няма да настъпят сривове между извикването на job_completed и повторното изпращане на опашката :) Ако трябва да сте 100% сигурни през цялото време и крайните случаи биха били фатални.. Предполагам, че вие трябва да го запишете някъде, преди да изпратите известие за завършено задание, и да го изтриете отново, след като бъде изпратено отново. - person Aurimas; 03.10.2012