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

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

  • В этой теме 0 ответов, 1 участник, последнее обновление 1 год, 4 месяца назад сделано Васильев Владимир Сергеевич.
Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #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 в случае ошибки подключения.

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