Реализация очередей

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Tonni_regoletti
Сообщения: 52
Зарегистрирован: 2019.10.11, 09:16

Реализация очередей

Сообщение Tonni_regoletti »

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


Аватара пользователя
Tonni_regoletti
Сообщения: 52
Зарегистрирован: 2019.10.11, 09:16

Re: Реализация очередей

Сообщение Tonni_regoletti »

Да, но хотелось бы более формального подхода, больше теории

Аватара пользователя
samdark
Администратор
Сообщения: 9405
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Реализация очередей

Сообщение samdark »

Теории того, что такое очередь и как она работает?

iamguruman
Сообщения: 174
Зарегистрирован: 2018.05.10, 08:26

Re: Реализация очередей

Сообщение iamguruman »

samdark писал(а):
2020.04.14, 13:46
Теории того, что такое очередь и как она работает?
Samdark, тема очень интересная, в двух словах поясните как этим пользоваться, я слышал про это, но не могу понять тоже как это можно применять. Заранее признателен за ответ. Может быть ссылку на какой-нибудь ресурс где это описано.

Аватара пользователя
Tonni_regoletti
Сообщения: 52
Зарегистрирован: 2019.10.11, 09:16

Re: Реализация очередей

Сообщение Tonni_regoletti »

samdark писал(а):
2020.04.14, 13:46
Теории того, что такое очередь и как она работает?
Да что бы не совсем бездумно юзать

Аватара пользователя
samdark
Администратор
Сообщения: 9405
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Реализация очередей

Сообщение samdark »

Решил записать голосом :)

https://soundcloud.com/alexander-makaro ... oni-nuzhny

Аватара пользователя
Tonni_regoletti
Сообщения: 52
Зарегистрирован: 2019.10.11, 09:16

Re: Реализация очередей

Сообщение Tonni_regoletti »

samdark писал(а):
2020.04.14, 21:48
Решил записать голосом :)

https://soundcloud.com/alexander-makaro ... oni-nuzhny
Спасибо, было полезно )

zxczxc12
Сообщения: 161
Зарегистрирован: 2013.01.24, 21:16

Re: Реализация очередей

Сообщение zxczxc12 »

Tonni_regoletti писал(а):
2020.04.14, 11:08
Добрый день.
Подскажите как правильно походить к созданию очередей ? С чего начать ?
Понимаю что вопрос общий и можно использовать гугл, но хотелось бы услышать тех кто уже реализовывал очереди.
Я делал :-)

Вот типичная задача для очередей
Юзер загружает своё фото . Мне нужно взять его фотку и сделать с неё :
1) 4 тхумбнейлсов разных разрешений
2) заблурить все тхумбтейлся ( что бы не зареганые юзера не видели изображений )

если пункт 1 делается сервером быстро , То блур - крайне долго , а если учесть что юзер может загружать в свой альбом много фото то это будет очень долгое ожидание для него пока все обработается сервером

выход - применение очереди

теперь делает тхумбнейлсы у меня сервер на лету и после окончания я ставлю новую задачу в очередь на создание блура
таким образом юзер не долго ждет загрузку своих фото , а обработка блур делается в фоне


очень простое в использовании этого дела:
yiisoft/yii2-queue

вот пример как использую :


Сам код задачи (job)

Код: Выделить всё

namespace common\jobs;

use common\models\ImageProcessing;
use yii\base\BaseObject;

class BlurImageJob extends BaseObject implements \yii\queue\JobInterface
{
    public $source_image_path;
    public $destination_image_path;
    public $img_x;
    public $img_y;

    public function execute($queue)
    {
        ImageProcessing::CreateBlurThumbnail($this->source_image_path, $this->destination_image_path, ImageProcessing::getBlurLevel($this->img_x, $this->img_y));
    }
}



вот место где я савлю в очередь :

Код: Выделить всё


... 

 /**
     * @param null|PhotoAlbumItem $model
     * @param bool $use_queue
     */
    public function makeBlurImage($model = null, bool $use_queue = true)
    {
        if (!$model) {
            $model = $this;
        }

        foreach ($model->image_sizes as $x => $y) {
            $size = $x . 'x' . $y;

            if ($y == 'h') continue;

            $new_image_path = $model->getImagePath($model->id . '_' . $size);
            $hash_image_path = $model->getImagePath($model->hash . '_' . $size);

            if (!$use_queue) {
                ImageProcessing::CreateBlurThumbnail($hash_image_path, $new_image_path, ImageProcessing::getBlurLevel($x, $y));
            } else {
                Yii::$app->queue->push(new BlurImageJob([
                    'source_image_path' => $hash_image_path,
                    'destination_image_path' => $new_image_path,
                    'img_x' => $x,
                    'img_y' => $y
                ]));
            }
        }
    }
    
    ... 


Аватара пользователя
Tonni_regoletti
Сообщения: 52
Зарегистрирован: 2019.10.11, 09:16

Re: Реализация очередей

Сообщение Tonni_regoletti »

zxczxc12 писал(а):
2020.04.16, 18:26
Tonni_regoletti писал(а):
2020.04.14, 11:08
Добрый день.
Подскажите как правильно походить к созданию очередей ? С чего начать ?
Понимаю что вопрос общий и можно использовать гугл, но хотелось бы услышать тех кто уже реализовывал очереди.
Я делал :-)

Вот типичная задача для очередей
Юзер загружает своё фото . Мне нужно взять его фотку и сделать с неё :
1) 4 тхумбнейлсов разных разрешений
2) заблурить все тхумбтейлся ( что бы не зареганые юзера не видели изображений )

если пункт 1 делается сервером быстро , То блур - крайне долго , а если учесть что юзер может загружать в свой альбом много фото то это будет очень долгое ожидание для него пока все обработается сервером

выход - применение очереди

теперь делает тхумбнейлсы у меня сервер на лету и после окончания я ставлю новую задачу в очередь на создание блура
таким образом юзер не долго ждет загрузку своих фото , а обработка блур делается в фоне


очень простое в использовании этого дела:
yiisoft/yii2-queue

вот пример как использую :


Сам код задачи (job)

Код: Выделить всё

namespace common\jobs;

use common\models\ImageProcessing;
use yii\base\BaseObject;

class BlurImageJob extends BaseObject implements \yii\queue\JobInterface
{
    public $source_image_path;
    public $destination_image_path;
    public $img_x;
    public $img_y;

    public function execute($queue)
    {
        ImageProcessing::CreateBlurThumbnail($this->source_image_path, $this->destination_image_path, ImageProcessing::getBlurLevel($this->img_x, $this->img_y));
    }
}



вот место где я савлю в очередь :

Код: Выделить всё


... 

 /**
     * @param null|PhotoAlbumItem $model
     * @param bool $use_queue
     */
    public function makeBlurImage($model = null, bool $use_queue = true)
    {
        if (!$model) {
            $model = $this;
        }

        foreach ($model->image_sizes as $x => $y) {
            $size = $x . 'x' . $y;

            if ($y == 'h') continue;

            $new_image_path = $model->getImagePath($model->id . '_' . $size);
            $hash_image_path = $model->getImagePath($model->hash . '_' . $size);

            if (!$use_queue) {
                ImageProcessing::CreateBlurThumbnail($hash_image_path, $new_image_path, ImageProcessing::getBlurLevel($x, $y));
            } else {
                Yii::$app->queue->push(new BlurImageJob([
                    'source_image_path' => $hash_image_path,
                    'destination_image_path' => $new_image_path,
                    'img_x' => $x,
                    'img_y' => $y
                ]));
            }
        }
    }
    
    ... 

Спасибо)

Ответить