Очереди PHP задач, реализуемые через Gearman

Программирование Веб программирование Очереди PHP задач, реализуемые через Gearman

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 3 нед. назад.

  • Автор
    Сообщения
  • #5311
    @admin

    Установка сервера очередей задач Gearman, настройка PHP для работы с ним. +Примеры

    Установка Gearman

    #aptitude install gearman-job-server

    Управляется сервер стандартными командами

    #/etc/init.d/gearman-job-server { start | stop | restart | force-reload }

    Мониторинг гирмана можно осуществлять из консоли:

    (echo status) | netcat 127.0.0.1 4730

    или из браузера: https://github.com/yugene/Gearman-Monitor Для этого нам понадобится PEAR пакет:

    pear install Net_Gearman-alpha

    Сбросить очередь можно созданием воркера, который по тому же ключу очень быстро вернет пустое значение. Как пользоваться на оф. сайте: http://gearman.org/getting-started/ Установка из PECL: http://pecl.php.net/package/gearman

    apt-get install php5-dev
    aptitude install php-pear
    aptitude install make
    aptitude install libgearman-dev
    pecl download gearman-1.1.2
    tar xzf gearman-X.Y.tgz
    cd gearman-X.Y
    phpize
    ./configure
    make
    make install
    echo 'extension=gearman.so' > /etc/php5/conf.d/gearman.ini
    /etc/init.d/php5-fpm restart

    Проверить версию можно кодом:

    <?php
    print gearman_version() . "\n";

    Чтобы смотреть из консоли на статус гирмановских задач:

    $telnet localhost 4730
    ;Затем
    status
    status
    ;название задачи;в очереди;вработе;сколько воркеров доступно для обработки данной задачи
    model_mail1        0       0       4
    model_mail2        0       0       4
    model_mail3        0       0       4

    Отказоустойчивость Gearman

    Супервизор — просто крутит демоны в системе, и следит, что бы их было именно такое количество. Гирман — Крутит задачу до тех пор, пока не получит от нее ответ об успехе. (если не настроить кол. попыток). Итак, возникают ситуации, когда гирман зависает, пытаясь отправить задачу, которая вылетает по тайм-ауту или просто с ошибкой. Для решения данной задачи я использую обычную таблицу в БД:

    CREATE TABLE `gearman_jobs` (
    	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    	`name` VARCHAR(255) NOT NULL COMMENT 'задача',
    	`key` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'int ключ обрабатываемого ресурса, для быстрого доступа к статистике',
    	`date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'дата создания',
    	`status` ENUM('new','fail','complete') NOT NULL DEFAULT 'new' COMMENT 'статус выполнения задачи',
    	`reason` TEXT NOT NULL COMMENT 'причина невыполнения задачи',
    	`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'дата обновления статуса задачи',
    	`iteration` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Количество попыток',
    	`terminate` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Остановить после последней попытки, если 1',
    	`in_progress` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Была начата обработка',
    	PRIMARY KEY (`id`),
    	UNIQUE INDEX `name` (`name`),
    	INDEX `key` (`key`)
    )
    COMMENT='Статус работ гирмана: выполнено/не выполнено и причина не выполнения'
    COLLATE='utf8_general_ci'
    ENGINE=InnoDB;

    При создании задачи гирману — добавляю запись. Iteration следит за кол-вом попыток выполнения, чтоб не ушло в бесконечность. Terminate позволяет в любое время остановить задачу. Так же не забываем проверять пинг к гирману $this->client->ping(‘test_string’); который должен вернуть FALSE в случае ошибки подключения.

Для ответа в этой теме необходимо авторизоваться.