Ответы пользователя по тегу Gearman
  • Определенное RDS (запросы в секунду) в сервере очередей?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Средствами Gearman этого сделать, разумеется, нельзя - это явно внешняя по отношению к gearman задача.
    Главная идея - запустить весь поток через какой-то регулятор.
    Как бы я сделал.
    1) есть мастер-воркер, который добавляет задачи на сервер очередей на запрос к внешнему АПИ
    2) клиенты кидают в очередь не задачи на запрос к внешнему АПИ, а задачи на запрос к этому самому мастер-воркеру
    3) мастер-воркер, получив задачу, смотрит, не превышен ли поток, и, если превышен, ждет, не превышен - кидает в очередь задачу на запрос к внешнему АПИ
    Ответ написан
  • Как запускать параллельные задачи на PHP?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Лихая задача.
    Что бы вы ни делали, все будет ресурсозатратно, а ну ка, у вас в онлайне 1000 чел запустили по нескольку задач, которые делают по нескольку тысяч действий ))
    Не вижу проблемы в том, чтобы запустить много воркеров. Вы можете использовать вот эту мою разработку для автоматического запуска и остановки воркеров, там есть класс, из которого можно управлять воркерами.
    https://habrahabr.ru/post/212761/
    Алгоритм: появилась задача - бросаем ее на сервер очередей - запускаем один воркер. Задача выполнилась - останавливаем один воркер.

    Воркеры можно располагать на разных серверах. Можно мониторить, на каком сервере по скольку воркеров запущено, и догружать свободные.
    Таким образом, задача с помощью Gearman превращается в распределенную.
    Сам по себе Gearman ресурсов почти не потребляет. Ресурсы будут потреблять воркеры, но от этого вам никак вообще не уйти - воркеры ведь решают задачу, чем бы вы ни решали задачу, вы потребите те же самые ресурсы.

    Еще. Вам не нужно для распределения задачи несколько Gearman. Вам нужен один сервер очередей Gearman, на котором регистрируются воркеры с разных серверов. Вообще введите в курс задачи подробнее где-то в личке, я смогу помочь более предметно.
    Ответ написан
  • Почему не добавляется фоновая задача gearman?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Из предположений:
    1) переименуйте задачу, видел такие грабли
    2) где-то в процессе добавления задачи процесс падает. Отмониторьте

    Вопрос: чем вы смотрите очередь?
    Ответ написан
  • Простейшая очередь задач на PHP?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    А на том же Gearman нужно писать гору лишнего кода

    Это еще почему?
    $client = new GearmanClient();
    $client->doBackground(<function>, <data>);

    Как раз пара строк кода.
    Ответ написан
  • PHP и Gearman, что и как?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Пользуясь случаем, хочу еще узнать: если вы имели дело с этой темой, какое из решений вы выбрали для организации выполнения отложенных задач? Я в настоящее время выбираю между RabbitMQ, Gearman и php-resque.

    Gearman — великолепен. Я свой выбор сделал
    Ответ написан
  • PHP и Gearman, что и как?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Есть ли стандартный способ из клиентского скрипта посмотреть, что сейчас происходит с данной задачей, не запуская ее на выполнение вновь. если она выполнена?

    Еще момент: воркер может в процессе выполнения передавать клиенту промежуточные данные.
    Посмотрите, в моей публикации есть пример с кодом и видео
    Ответ написан
  • PHP и Gearman, что и как?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    — этот вопрос вытекает из предыдущего: понятно дело, когда клиент — демон, он поставил задание и просто ждет результата, или регулярно опрашивает Gearman на предмет результата…

    Я делаю «в лоб» — как только задачи определенной группы начали выполняться, я делаю инкремент одной переменной в БД, как только задача завершается — делаю декремент. В итоге, когда хоть какие-то задачи выпоняются — переменная отлична от 0, как готовы все — там 0. Из веб-приложения аяксом просто опрашиваю БД
    Ответ написан
  • PHP и Gearman, что и как?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    их можно запускать из консоли или скриптом.
    кстати, я готовлю новую публикацию — веб-интерфейс для сервера очередей. Он давно готов, сыроват, но рабочий, я его юзаю, руки не доходят
    Вот код
    code.google.com/p/gearman-monitor-and-control/
    Ответ написан
  • PHP и Gearman, что и как?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    у меня демоны — только воркеры
    Ответ написан
  • PHP и Gearman, что и как?

    konst20
    @konst20
    Программист, преподаватель, немного электронщик
    Доброго :)
    Отвечаю на вопросы

    — чем концептуально отличается GearmanJob от GearmanTask и какой из них следует использовать для оформления отложенного задания?

    Job — это то, что поступает воркеру.
    Task — это то, что передает клиент

    То есть клиент кидает Task на сервер очередей, там два агрумента — имя ф-и и сериализованные данные (в виде строки).
    Если у воркера есть ф-я, указанная в Task, то есть он готов ее обработать, то он принимает задачу, а данные получает в виде Job.
    Извлекаются данные вот так (кусок реального кода):

    function create_campaign(GearmanJob $job){

    $rawData = $job->workload();
    $data = unserialize($rawData);


    А передаются на сервер вот так (я использую не Task, а чуть проще — просто doBackground)

    $gclient = new GearmanClient();
    $gclient->addServer('localhost');

    $new_offers = $client_db->select_new_offers();

    if(is_array($new_offers) AND count($new_offers) > 0){
    foreach($new_offers as $item){
    $data_for_gearman = array(
    'item' => $item,
    'client_class_name' => 'axxa',
    );
    $gclient->doBackground('new_offer', serialize($data_for_gearman));
    }
    }

    echo «Для добавления товаров на сервер очередей добавлено ».count($new_offers)." задач \n";
    Ответ написан