Yii2: сервер очередей beanstalk

yii2 и сервер очередей beanstalkСерверы очередей заданий — это очень популярный инструмент, одним из применений которого является использование его как буфера между ядром бизнес-приложения и сервисом почтовых рассылок.

Сервер очередей beanstalk написан на c и имеет отличные показатели стабильности, масштабируемости и быстродействия. По многим параметрам он легко конкурирует с другими, такими как Apache ActiveMQ, MQS, Spread и RabbitMQ.

Для использования функционала beanstalk в yii 2.0, можно воспользоваться расширением udokmeci/yii2-beanstalk.

Расширение udokmeci/yii2-beanstalk представляет из себя веб и консольный интерфейс beanstalk через php-клиент pda/pheanstalk.

Установка

Для установки расширения достаточно добавить в раздел require файла composer.json строку «udokmeci/yii2-beanstalk» : «dev-master» и выполнить команду composer update.

Настройка

В конфигурационных файлах веб и консольной части приложения нужно описать компонент:

'beanstalk'=>[
            'class' => 'udokmeci\yii2beanstalk',
            'host'=> "127.0.0.1", // default host
            'port'=>11300, //default port
            'connectTimeout'=> 1,
            'sleep' => false, // or int for usleep after every job
        ],

И только в настройках консольного приложения добавить:

'params' => $params
// add you controller with name and class name next to params.
'controllerMap' => [
        'worker'=>[
            'class' => 'app\commands\WorkerController',
        ]

    ],

Начинаем работу

Осталось запустить beandstalkd и обращаться к нему подобным образом:

\Yii::$app->beanstalk->putInTube('tube', $mixedData ,$priority,$delay);

Воркеры

В качестве воркеров будет встроенный контроллер, который в бесконечном цикле ожидает новые задания. Большая часть кода реализована в классе BeanstalkController. Все что нужно сделать — наследовать от него контроллер с действием подобным описанному ниже.

Контроллер

Создаем контроллер в каталоге commands. Называем его логичным образом и наследуем от udokmeci\yii2beanstalk\BeanstalkController.

Пример контроллера:

namespace app\commands;

use udokmeci\yii2beanstalk\BeanstalkController;
use yii\helpers\Console;
use Yii;

class WorkerController extends BeanstalkController
{

  public function listenTubes(){
    return ["tube"];
  }

}

Пример действия:

    public function actionTube($job){
        $sentData = $job->getData();
        try {
           // something useful here
           if($everthingIsAllRight == true){
                fwrite(STDOUT, Console::ansiFormat("- Everything is allright"."\n", [Console::FG_GREEN]));
                return self::DELETE; //Deletes the job from beanstalkd
           }
           fwrite(STDOUT, Console::ansiFormat("- Not everything is allright!!!"."\n", [Console::FG_GREEN]));
           return self::DELAY; //Delays the job for later try
           // if you return anything else job is released.
        } catch (\Exception $e) {
            //If there is anything to do.
            fwrite(STDERR, Console::ansiFormat($e."\n", [Console::FG_RED]));
            return self::DELETE;
        }
    }

Запускаем воркер

Для запуска нужного воркера, то есть нашего нового контроллера, выполняем в консоли команду:

./yii worker

Действует.

6 thoughts on “Yii2: сервер очередей beanstalk

  1. Віталій КозійВіталій Козій

    Хочу еще добавить, что для меня
    ./yii worker — не работает
    следует запустить
    php ./yii worker

  2. Федор

    Интересует вопрос. Есть ли возможность очистить очередь?
    Допустим у меня в очереди висит на исполнение 1000 задач, но в определенный момент актуальность задач теряется, и хочется очистить очередь.
    Покопавшись в исходниках модуля не нашел подобного метода.

    1. Артём

      Один из простых вариантов — это в начале воркера поставить return true;
      Перезапустив воркер, очередь очиститься.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *