Gearman — сервер очередей: использование в проектах на PHP

    Не так давно была замечательная статья, описывающая общие принципы работы с сервером очередей Gearman. Мне бы хотелось продолжить материал, дополнив его некоторыми деталями практического применения, а именно:
    — установка и управление сервером
    — управление очередью — что возможно и как
    — PECL и PEAR php-расширения для работы с Gearman
    — мониторинг сервера
    — примеры кода
    — передача данных порциями
    — организация параллельных вычислений в PHP

    Интересно? Прошу под кат

    Прежде чем приступить к изложению материала, нужно сказать, откуда он появился. Это компиляция из практического применения в нескольких проектах (все касались работы с медленными удаленными сайтами), выдержек из документаций и обсуждений, просто некоторых наблюдений и абстрактных соображений. Разумеется, могут быть неточности, спорные решения и спорные мысли — автор будет благодарен за любую критику и правки.

    Содержание


    Жизненный цикл данных Gearman
    Установка и управление Gearman
    Мониторинг состояния сервера

    Cудьба очереди при рестарте gearman
    Сброс всей очереди и сброс очереди конкретной задачи
    Перезапуск воркера

    PECL и REAR php-расширения для работы с Gearman
    pear Net_Gearman
    pecl gearman
    Установка pecl gearman

    Самый простой клиент и воркер (+видео)
    Передача данных по частям и дополнительный обмен данными с клиентом(+видео)
    Фоновые задачи и приоритет
    Параллельные вычисления в PHP с использованием Gearman(+видео)


    Жизненный цикл данных Gearman


    Прежде чем вдаваться в подробности, еще раз проиллюстрируем работу с сервером.
    Самый простой пример. Как происходит вызов и выполнение ф-и в PHP:



    Тривиально. Теперь то же самое, но с использованием сервера очередей:



    Вкратце словами: скрипт, которому требуются результаты/действия работы функции (“client”) отправляет на сервер (регистрирует) имя функции и ее аргументы — на сервере создается задача (“task”).

    Если на сервере зарегистрирован обработчик для функции с таким именем (“worker”) и он в данный момент свободен, ему передаются данные для обработки и имя ф-и в виде задачи (“job”).
    Если worker для такой ф-и не зарегистрирован или он занят, task становится в очередь и ждет обработки.

    После обработки worker передает то, что возвращает ф-я, обратно на Gearman. Сервер очередей смотрит, какой client регистрировал task с такими именем ф-и и с такими данными, и отправляет результат работы worker ему (это в том случае, если клиент не регистрировал задачу как фоновую. Если задача зарегистрирована как фоновая, клиенту ничего не передается).

    Что сразу следует из такого принципа работы?

    1. В работе с Gearman участвуют четыре объекта: client, task, worker, job. Описание всех объектов есть на оф. сайте PHP.

    2. Передаваемые данные — и к серверу от клиента, и обратно от воркера — это только строка, и только одна. Если требуется передать несколько аргументов или не строку — массив к примеру — требуется сериализация.

    Впрочем, все изложенное выше — просто краткое повтореное оф. документации и уже опубликованных материалов. Теперь нюансы.


    Установка и управление Gearman


    Если есть большая необходимость, можно запустить сервер Gearman на Windows, есть его реализация на Java:
    https://launchpad.net/gearman-java

    Но мы будем рассматривать работу под linux (нижеследующие примеры приведены для debian).
    Установка сервера проходит гладко и особенностей не имеет:

    aptitude install gearman-job-server

    После успешной установки сервер управляется из etc/init.d/gearman-job-server простыми и ясными командами:
    { start | stop | restart | force-reload }
    Хост по умолчанию для сервера — localhost, порт — 4730


    Мониторинг состояния сервера

    Всегда есть необходимость посмотреть, что происходит на сервере: какие задачи зарегистрированы, сколько их в очереди, сколько воркеров зарегистрировано на каждую задачу.
    Это можно сделать из консоли командой
    (echo status) | netcat 127.0.0.1 4730


    Cудьба очереди при рестарте gearman

    Сразу возникает вопрос: что будет с очередью на работающем сервере, если сделать ему харакири restart?
    При дефолтной установке очередь хранится в памяти, рестарт сервера аннулирует все задачи, которые клиенты отправили на сервер, и аннулирует регистрацию всех воркеров на сервере. При этом у воркеров сгенерируются исключения вроде «Потеряна связь с сервером».
    Очередь можно сохранить в БД, поддерживаются MySQL, PostgreSQL, SQLite. Как организовать такую очередь, хорошо написано на оф. сайте:
    http://gearman.org/index.php?id=manual:job_server#persistent_queues

    Следует иметь ввиду, что даже если сохранить очередь, при рестарте сервера обработчики задач — воркеры — все равно «отвалятся» от сервера, и придется либо их перезапускать, либо заранее в самих воркерах такую ситуацию предусматривать.


    Сброс всей очереди и сброс очереди конкретной задачи

    Если очередь не хранится в БД, рестарт сервера, как сказано выше, сбросит всю очередь. Если очередь хранится в БД, нужно, кроме рестарта сервера, очистить соответствующую таблицу — всю или выборочно. Напомним, что рестарт сервера сгенерирует исключения как в клиентах, так и в воркерах.

    Однако может возникнуть ситуация, когда нужно сбросить очередь только по одной задаче. Пример: мы парсим 100 сайтов, один перестал отвечать, в очереди накопилось 1000 задач по приему данных с этого сайта, данные со всех остальных сайтов принимаются через сервер очередей без проблем. Нужно сбросить очередь только по заглохшему сайту.
    Самый простой и безболезненный способ это сделать — запустить фейковый воркер, который зарегистрирует на сервере очередей задачу с таким же именем, но быстро возвращающую NULL, пустую строку или вообще все что угодно — главное быстро. Этот воркер пропустит через себя все ожидающие задачи, очередь очистится.


    Перезапуск воркера

    Для чего это может потребоваться? Ну кроме очевидной ситуации, когда воркер завис и это не вызывает сомнений, есть еще одна, очень частая.
    Ситуация: воркер запущен, зарегистрировал на сервере свои задачи. Если вы в этот момент внесете изменения в код воркера, то сколько бы вы его не сохраняли, обрабатывать задачи с сервера очередей будет тот код, который был в момент регистрации задачи.
    Для того, чтобы изменения в коде вступили в силу — то есть чтобы задачи с сервера обрабатывал уже измененный код, воркера надо перезапустить, то есть прекратить выполнение скрипта текущего воркера и запустить его заново. Способы тривиальны: вручную, bash-скриптом, предусмотреть в воркере обработку ф-и вроде exit_worker и запуск его из крона etc.


    PECL и REAR php-расширения для работы с Gearman


    Для работы с сервером очередй Gearman в php можно использовать два варианта расширений: pecl gearman и pear Net_Gearman

    Между этими расширениями есть принципиальная разница.


    pear Net_Gearman

    pear Net_Gearman — это просто несколько php-файлов. И все. Установить на сервер очень просто:
    pear install Net_Gearman channel://pear.php.net/Net_Gearman-0.2.3
    Можно даже на сервер не устанавливать — просто распаковать архив, реализовать подключение соотв. классов и все — можно использовать, вот так например

    function __autoload($className){
    
        //Костыль для pear Net_Gearman, кроме Net_Gearman_Job
        if(strstr($className, 'Net_Gearman_') and !strstr($className, 'Net_Gearman_Job_')){
            $className = str_replace('Net_Gearman_', '', $className);
            include_once PATH_TO_PEAR_NET_GEARMAN.$className.'.php';
        }
        //Костыль для pear Net_Gearman_Job
        if(strstr($className, 'Net_Gearman_Job_')){
            $className = str_replace('Net_Gearman_Job_', '', $className);
            include_once PATH_TO_PEAR_NET_GEARMAN.'Job/'.$className.'.php';
        }
    
    }
    

    Это, кстати, дает возможность работать с Gearman в php, используя тот же Denwer или OpenServer.

    Текущая версия — это альфа-релиз, датированный 2009 годом. Но это не страшно: никто не мешает править требуемые файлы, никакие дополнительные компоненты/библиотеки не используются.
    Несмотря на дату, библиотека работоспособна на php5.3.* и доработки не требует.

    Возникает вопрос: как все это счастье взаимодействует с сервером Gearman? Через сокеты, посылая серверу команды (вот описание взаимодействия с сервером на оф. сайте)

    Отметим важную деталь pear Net_Gearman: в библиотеке есть средства мониторинга сервера и (частично) управления им, что дает возможность сделать, например, упомянутый выше скрипт для мониторинга.


    pecl gearman

    Несмотря на все достоинства, интерфейс библиотеки pear Net_Gearman беден и, как где-то выразились, несколько неуклюж. К тому же IDE — phpStorm например, классов Net_Gearman не содержит (для удобной работы надо костыль прикрутить), и для рабочего использования лучше подходит pecl gearman.
    Главное отличие pecl gearman от pear Net_gearman в том, что pecl gearman с сервером напрямую не взаимодействует — это обертка для С-библиотеки libgearman.

    Установка pecl gearman

    Очень бы хотелость вот так вот сразу:
    pecl install gearman
    Но так не получится. В конце установки появится сообщение о том, что требуется libgearman версии 0.21 и выше, сборка такой библиотеки тянет за собой еще некоторые действия, и успехом все этом может не увенчаться.
    В интернете много рекомендаций по установке библиотеки pecl-gearman-0.7.0, но у нее есть баг — есть большая вероятность вылететь с ошибкой Segmentation fault.
    Путем нескольких проб было установлено, что устойчиво работает и без проблем устанавливается версия 0.8.1
    Вот порядок установки на debian6/php5.3* «с нуля», начиная с сервера (для debian7/php5.4 см. вот эту публикацию):

    aptitude install gearman-job-server
    aptitude install php5-dev
    aptitude install php-pear
    aptitude install make
    aptitude install libgearman-dev
    cd /tmp
    pecl download gearman-0.8.1
    tar -xvf gearman-0.8.1.tgz
    cd gearman-0.8.1
    phpize
    ./configure
    make
    make test
    make install
    echo 'extension=gearman.so' > /etc/php5/conf.d/gearman.ini
    


    Теперь можно спокойно использовать всю красоту библиотеки в реальном проекте. IDE содержит классы для pecl gearman, дополнительных действий не требуется. Все приведенные ниже примеры используют именно расширение pecl gearman.

    Примеры



    Самый простой клиент и воркер

    Клиент
    <?php
    $client = new GearmanClient();
    
    /*Эта ф-я вернет true независимо от того, есть такой сервер или нет. Для проверки доступности сервера нужно использовать echo(‘’), установив на всякий случай таймаут в миллисекундах во избежание затыка скрипта при недоступности сервера */
    $client->addServer('192.168.68.4');
    
    
    $client->setTimeout(29000);
    
    /*true/false в зависимости от доступности сервера*/
    $haveGoodServer = $client->echo('');
    var_dump($haveGoodServer);
    
    $data = ‘slon yooo’;
    
    /*Отправляем задачу и данные на Gearman и ждем выполнения*/
    $res = $client->do('function_revert_string_and_caps', $data);
    
    /*Мы увидим результат, как только его вернет сервер, ну или выскочим по таймауту*/
    echo $res;
    


    Воркер
    <?php
    $worker = new GearmanWorker();
    $worker->addServer('192.168.68.4');
    
    /*Тут мы говорим, что готовы обработать ф-ю function_revert_string_and_caps, и что заниматься этим будет ф-я 'revCaps*/
    $worker->addFunction('function_revert_string_and_caps', 'revCaps');
    
    /*Запускаем воркер. В таком варианте он отработает один раз*/
    $worker->work();
    
    /*А это вариант будет висеть демоном - есть на видео*/
    //while($worker->work()){};
    
    
    //Ну и сама ф-я обработчик, аргумент один - объект-задание job
    function revCaps($job){
    
       /*Извлекаем из job данные, переданные клиентом*/ 
       $content = $job->workload();
        
        return mb_strtoupper(strrev($content));
    }
    

    Видео примера



    Передача данных по частям и дополнительный обмен данными с клиентом

    Операцией do в клиенте пользоваться не всегда удобно, зачастую лучше использовать добавление задачи и обработку данных, приходящих от сервера, с помощью простых callback ф-й.
    Кроме того, если данные передаются частями, имеет смысл отобразить количество обработанных частей — например, для прогресс-бара.
    Клиент
    <?php
    $client = new GearmanClient();
    $client->addServer('192.168.68.4');
    
    $data = '';
    /*Добавляем задачу. Пока она еще не выполняется*/
    $client->addTask('function_serial_send', $data);
    
    /*Указываем, какая ф-я будет обрабатывать событие успешной постановки задачи в очередь*/
    $client->setCreatedCallback('createTask');
    /*Ну и сама ф-я - обработчик этого события*/
    function createTask(GearmanTask $task){
        echo "Start data from ".$task->jobHandle()."\n";
    }
    
    /*Указываем, какая ф-я будет обрабатывать принимаемые данные*/
    $client->setDataCallback('getData');
    /*сама ф-я для обработки принимаемых данных*/
    function getData(GearmanTask $task){
        echo "received:".$task->data()."\n\n";
    }
    
    /*Указываем, какая ф-я обрабатывает прием статуса Complete - то есть окончание обработки*/
    $client->setCompleteCallback('stopTask');
    /*Ф-я - в ней прекращаем работу скрипта*/
    function stopTask(){
        echo "task Stop\n";
        exit;
    }
    
    /*Указываем, какая ф-я обрабатывает числовые данные о ходе обработки*/
    $client->setStatusCallback('getStatus');
    /*Результат просто показываем в %*/
    function getStatus(GearmanTask $task){
        echo "Handled: ".$task->taskNumerator() / $task->taskDenominator()*(100)."%\n";
    }
    
    /*Запускаем все задачи - одну в данном случае. ВАЖНО: этот запуск должен стоять ПОСЛЕ объявлений
    ф-й callback - иначе они работать не будут */
    $client->runTasks();
    


    Воркер
    <?php
    $worker = new GearmanWorker();
    $worker->addServer('192.168.68.4');
    $worker->addFunction('function_serial_send', 'sendDataAndStatus');
    
    /*напоминаем - это цикл нужен, чтобы worker висел демоном*/
    while($worker->work()){}
    
    function sendDataAndStatus(GearmanJob $job){
        $arr = array('one','two', 'three', 'four', 'five');
        $i = 1;
        foreach ($arr as $diggo){
    
           /*Отправляем типа статус - будет передаваться такое 1,5   2,5 и т.д. Первый аргумент - Numerator, то бишь “числитель”, второй Denumenator - “знаменатель”. Вообще можно произвольные числа передавать, приводятся к типу long*/
            $job->sendStatus($i, count($arr));
            
           /*передаем порцию данных*/
            $job->sendData($diggo);
    
            echo "send data: ".$diggo, "\n";
            $i++;
    
            sleep(1);
        }
        /*Передаем статус завершения - прием такого статуса обрабатывается в нашем клиенте*/
        $job->sendComplete('');
    }
    


    Видео выполнения этого примера:



    Фоновые задачи и приоритет

    Статус задачи — обычная или фоновая (синхронная/асинхронная) и приоритет ее выполнения задаются в клиенте. Если задача добавлена на сервер как фоновая, клиент фактически просто «бросает» ее на сервер и ее дальнейшей судьбой не интересуется. Если задача — обычная, клиент ждет от сервера результата ее выполнения.
    Для фоновых задач применяется приставка background.
    Для приоритетов есть три уровня — обычный (без приставок), низкий/высокий cоотв. Low/High, например, метод addTaskHighBackground — добавить фоновую задачу с высоким приоритетом.
    Все это хорошо расписано в оф. документации в разделе GearmanClient


    Параллельные вычисления в PHP с использованием Gearman


    На закуску, конечно, самое вкусное.
    Код этого примера несколько объемен, посему не приводится, но ничего военного в нем нет: клиент добавляет 800+ задач на сервер очередей, 4 воркера обрабатывают задачи.
    Сами задачи — перевод кусков текста с помощью Yandex Translate API, вся задача в целом — перевод книги «Крестный отец» с русского на украинский язык.
    Вот видео:
    Поделиться публикацией
    Похожие публикации
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 51
    • +2
      есть ли способ вернуть данные назад в очередь в воркере, если они уже были вытянуты? например, для случая когда сервис перевода яндекса лег и апи недоступно, тогда можно было бы вернуть данные в очередь и заснуть на пол часика
      • 0
        Как минимум заново их поместить в очередь
        • 0
          Насколько я помню, достаточно вернуть false из метода-обработчика. Либо из него-же заново добавить задачу в очередь, да.
          • 0
            Вроде бы удаление задачи из очереди должно зависеть от результата ее обработки. Ведь и при запуске сервера можно установить количество повторных выполнений задания при неудаче, и в pecl API есть GearmanJob::sendFail. Но мои практические эксперименты вокруг этого показали, что при любом варианте завершения задачи она удаляется из очереди.
            Выходит, что необходимость повторного выполнения надо контролировать самому, и при неудаче самому повторно добавлять задание в очередь на выполнение.
            • 0
              т.е. вернуть false из обработчика недостаточно.
              • 0
                вот в том и вопрос. Правда не знаю насколько идейно в воркере стартовать клиент
                • 0
                  Ну если клиент поставил задачу на выполнение в бакграунде, то кроме как из воркера, ее неоткуда повторно вернуть в очередь.
                  Если же ее выполнения ожидает клиент, то правильнее обрабатывать на клиенте результат выполнения и повторно ставить задачу, поскольку иначе получается уже каша:
                  — клиент ждет ответа от воркера;
                  — воркер не может выполнить, добавляет задачу в очередь;
                  — раз клиент ждет ответа, то тогда и воркер должен ждать ответа по новой задаче, чтобы вернуть его клиенту.
                  При такой схеме воркер выпадает из обоймы до выполнения задачи, и так можно всех воркеров перелинковать между собой и все повесить.
                • 0
                  Для случая, когда
                  $client->doBackground("taskName", "paramstring");
                  

                  единственным решением будет:
                  function func($job) {
                      try {
                          // work smth
                      } catch (Exception $e)
                          exit(255);
                      }
                  }
                  

                  Подсмотрено Найдено тут

                  PS: а для рестарта воркера можно использовать supervisord.org/ например
              • +1
                Способ именно вернуть забранное таки есть, хотя и не очень красивый. Завершить воркер с кодом отличным от нуля. Т.е. в php просто exit(1); но вот ожидание тогда придется делать как-нибудь еще
                • +2
                  Способ есть.

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

                  Количество таких попыток регулируется параметром

                  -j, --job-retries=RETRIES

                  при запуске сервера.

                  Через RETRIES количества безуспешных попыток задача будет удалена из очереди.
                  • 0
                    Чуть выше мы это обсуждали. Проблема в том, что несмотря на параметр --job-retries использование GearmanJob::sendFail не приводит к возвращению задания в очередь.
                    Смотрите (код для примера github.com/avorobiev/gearman):
                    1. запускаем сервер:
                    $ gearmand -job-retries=2

                    2. добавляем задание в очередь
                    $ php client.php

                    3. проверяем наличие задания в очереди
                    $ php monitor.php
                    | function | total | running | workers |
                    | fail | 1 | 0 | 0 |

                    4. подключаем воркера
                    $ php worker.php
                    Function got: «Function data» and fail

                    5. проверяем очередь
                    $ php monitor.php
                    | function | total | running | workers |
                    | fail | 0 | 0 | 1 |

                    ВЫВОД: GearmanJob::sendFail не возвращает задание в очередь. Или я что-то делаю не так?
                    • 0
                      Возвращает. Но у вас же стоит там while ($worker->work());, так что он снова принимает эту задачу на обработку, ещё раз фейлится и после этого лимит фейлов заканчивается,
                      • 0
                        Воркер в начале обработки задания выводит ее данные в консоль:
                        $ php worker.php
                        Function got: «Function data» and fail < — вот он вывод в консоль

                        Сколько раз воркер обрабатывал задание можно понять из количества выводов в консоль.
                        На каждое задание 1 вывод, несмотря на завершение GearmanJob::sendFail. Т.е. повторно задания не обрабатываются.
                      • 0
                        Похоже, что что — то вы делаете не так, но вот что именно, пока сказать не могу.
                        Дело в том, что я использовал этот функционал и он работал отлично.
                        Я на досуге погоняю ваш код и отпишусь.
                        • 0
                          Спасибо!
                          Я все это тестировал на gearmand 0.14 + php 5.3.10 (c pecl gearman 0.8.0 + libgearman 0.14)
                          Если у вас GearmanJob::sendFail будет работать, черканите, на каких версиях ПО.
                          • 0
                            В моем случае актуально для
                            PHP 5.3.10 with Suhosin-Patch
                            gearmand          0.32
                            pecl gearman     1.0.2
                            libgearman         0.32
                            
                  • –3
                    я на сколько понял это просто обёртка для pcntl?
                    • +3
                      Gearman — это отдельный продукт, который можно также использовать как мост между разными языками программирования. Есть несколько реализаций этого продукта, самая распространённая на Си, наверное.
                      • 0
                        Я бы дажу чуть в сторону расширил: мост между разной логикой. Клиент и воркер могут быть оба написаны на одном языке, но можно инкапсулировать в клиента — одну логику, в воркера — совсем другую.
                        Тут очень большое поле для экспериментов. В приведенном примере с переводом я делал по-разному:
                        — вся обработка в клиенте, воркер только общается с API Яндекса
                        — вся обработка в воркере, клиент только отправляет задачи и собирает потом куски в кучку

                        Второй вариант мне субъективно больше понравился.
                      • +1
                        Спасибо, интересно.

                        В разделе «Cудьба очереди при рестарте gearman», Вы пишите «и аннулирует регистрацию всех воркеров на сервере. При этом у воркеров сгенерируются исключения вроде «Потеряна связь с сервером».», но если сервер успевает рестартануть между таймаутами воркера, воркер зарегистрируеться на нём ещё раз.

                        В телнет интерфейсе, также есть полезная команда workers
                      • +3
                        Если бы вы запустили еще несколько воркеров для перевода, то команда Яндекса бы наверное выслала вам книгу в твердом переплете.

                        Спасибо за статью, очень познавательно. Не приходилось самому пользоватся Gearman`ом, но теперь вижу несколько вариантов применения для своих сайтов.
                        • 0
                          Я бы не отказался, но только если в хорошем переводе.
                          Отвлекаясь от темы: есть несколько переводов Крестного отца Пьюзо на русский. Все, кроме одного — это, как по мне, унылый американский гангстерский боевик. Перевод от Кан — это прекрасная философская книга, которую с удовольствием перечитываешь.

                          Еще раз сори за офтоп.
                        • 0
                          Спасибо! Как раз есть подходящая задача.
                          • 0
                            Все таки Gearman не совсем сервер очередей. Он предназначен именно для удаленного выполнения задач, с чем он справляется очень неплохо.
                            • 0
                              Интересно, как кто обеспечивает безопасность при использовании Gearman, ведь в нем самом нет средств авторизации… Ничего не мешает подключить к чужому серверу свой воркер, или добавить на чужой сервер задач…
                              В голову приходит только одно решение — разворачивать между хостами VPN и работать с Gearman строго внутри нее. У кого есть практический опыт — поделитесь!
                              • 0
                                забиндить на локальный интерфейс?
                                • 0
                                  Точно! Вариант туннелирования локальных портов решение, и гораздо проще VPN.
                                  • 0
                                    В этом нет смысла. В таком варианте не будет распределённости. Есть смысл прописывать правила для «своих» адресов.
                                    • 0
                                      Почему нет смысла? Если настроить на хосте с воркерами туннель для локального порта 4730 на тот же локальный порт Gearman-сервера, то все заработает. И распределенность будет :-). Вдобавок соединение будет шифроваться ssh.

                                      А вы предлагаете настроить iptables? Тоже вариант, но сложнее в реализации — надо писать правила, и нет шифрования передаваемых данных.
                                      • 0
                                        Возможно я не правильно понял mayhem'a. Под биндить на локальный интерфейс, я вижу слушать 127.0.0.1
                                        • 0
                                          да, если так, то смысл только в распараллеливании выполнения.
                                  • 0
                                    на сайте разработчики пишут, что задача авторизации у них в планах есть, но пока не реализована
                                    На текущий момент, к сожалению, только выруливать внешними средствами, как-то: iptables, vpn etc.
                                  • +1
                                    Удивительно, буквально день назад написал аналогичную статью skahin.blogspot.com/2012/04/gearman.html
                                    Только обработка воркеров происходит многопоточным демоном, что позволяет делить большие задачи на части.
                                    • +1
                                      Мне кажется, тема Gearman набирает потихоньку обороты.
                                      Хорошая вещь и много применений можно найти, которые сделают жизнь — проще, а код — прозрачнее.
                                    • +1
                                      Я вот одного не пойму. Если мне нужно в 100 потоков (к примеру) сайт парсить — я должен 100 воркеров вручную запустить? Понятно что можно скрипт для этого написать, но мне кажется управлять этим не так удобно. Хотелось бы самому указывать количество запущенных воркеров — возможно ли это?
                                      • 0
                                        Я вот одного не пойму, скрипт в 10 строке написать сложнее, чем очередной парсер? :)
                                        • 0
                                          Ну во-первых есть multi curl ;)
                                          А вообще, у нас в проекте используем supervisord, который прекрасно справляется с управлением процессами воркеров и клиентов gearman'a. Там в конфиге указывается что и как запускать + удобный перезапуск сразу всех воркеров/клиентов
                                          • 0
                                            Тут чуть не так.
                                            Воркер — самостоятельный процесс. Как и клиент, как и сам Gearman
                                            Есл Вы хотите всем этим хозяйством управлять согласно Вашему видению и алгоритму — 100 воркеров, 100500 воркеров и т.д., нужна, конечно, общая оболочка

                                            У меня давно зреет мысль попробовать систему, которая сама будет регулировать поведение очереди — запускать/снимать воркеров в зависимости от «нагрузки», сбрасывать задачи о определенным критериям и пр.

                                            Как сделаю — обязательно отпишусь.

                                            Но, возвращаясь к Вашему вопросу — эта система опять же является внешней по отношению и к воркерам, и к клиентам, и к Gearman
                                          • 0
                                            Поправка: то, что у вас на второй картинке — это не очереди, это RPC…

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

                                              Да, конечно, в таком виде это похоже на RPC. Но и на обработку данных в Gearman это тоже похоже. Если туда пририсовать еще одного клиента, все станет на места.
                                              Я постараюсь перерисовать немного яснее.

                                              Спасибо.
                                            • 0
                                              Если я правильно понимаю, при использовании Gearman теряются некоторые фишки, предоставляемые IDE.
                                              Например, если подвести курсор к вызову функции, то отобразится подсказка с описанием функции, параметрами, возвращаемым типом…

                                              А при таком синтаксисе ($res = $client->do('function');) эта возможность теряется, так ведь?
                                              • 0
                                                Также, как и при любой другой реализации добавления задач в очередь, или, например, при вызове хранимых SQL процедур.
                                                • 0
                                                  >А при таком синтаксисе ($res = $client->do('function');) эта возможность теряется
                                                  Я не понял, что тут теряется? Подсказка для метода do? Не должна она тут теряться.
                                                  • 0
                                                    Да, на тему function IDE Вам ничего не подскажет.
                                                    Но
                                                    Аргумент у function — всегда один и всегда string: это сериализованные данные или просто string
                                                    Возвращает она тоже string: сериализованные данные ну или опять же просто string

                                                    Так что Вы правы: при работе с Gearman учет того:

                                                    — что делает каждая ф-я
                                                    — что ей потребуется после операции unserialize (внутри ф-и)
                                                    — что получится после unserialize того, что она вернет

                                                    нужно где-то вести, IDE вам тут ничего не подскажет.
                                                    • 0
                                                      Большое спасибо.
                                                  • 0
                                                    Можно ставить через pecl только нужно обновить python.

                                                    sudo apt-get install python-software-properties -y
                                                    sudo add-apt-repository ppa:gearman-developers/ppa 
                                                    sudo apt-get update
                                                    sudo apt-get install gearman-job-server libgearman-dev gearman-tools php-pear php5-dev -y
                                                    sudo apt-get install libevent-dev uuid-dev -y
                                                    pecl install gearman
                                                    

                                                    Оригинальная статья: http://rdstash.blogspot.com/2012/02/installing-gearman-101-on-ubuntu-1104.html
                                                  • 0
                                                    Я заказал компиляцию pecl-расширения php_gearman.dll под Денвер (php 5.3.13) и готов поделиться ею с сообществом! :)

                                                    PECL-расширение версии 1.1.0 (от 2012-09-22), библиотека libgearman использовалась версии 0.41.

                                                    Скачать и протестировать можно по одной из ссылок: Зеркало 1, Зеркало 2, Зеркало 3

                                                    Пока найден только один баг — большие объемы данных нельзя передать между клиентом и воркером.
                                                    • 0
                                                      Подскажите, пожалуйста, gearman не хочет обновлять код который указан в job. Т.е берем job. Запускаем код. Job пишет в лог, и видно что она работает. Когда сервер остановлен то видно что не работает. При этом изменения в коде никак не влияют на поведение.

                                                      /etc/init.d/gearman-job-server force-reload такая команда не помогает, остановка и запуск очереди также ничего не дает.

                                                      Подскажите, в чем может быть причина, куда копать?

                                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                      Самое читаемое