Страница 1 из 1

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

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

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

Добавлено: 2020.04.14, 11:41
ge74d8

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

Добавлено: 2020.04.14, 12:28
Tonni_regoletti
Да, но хотелось бы более формального подхода, больше теории

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

Добавлено: 2020.04.14, 13:46
samdark
Теории того, что такое очередь и как она работает?

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

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

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

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

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

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

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

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

Добавлено: 2020.04.15, 09:18
Tonni_regoletti
samdark писал(а): 2020.04.14, 21:48 Решил записать голосом :)

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

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

Добавлено: 2020.04.16, 18:26
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
                ]));
            }
        }
    }
    
    ... 


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

Добавлено: 2020.04.17, 14:37
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
                ]));
            }
        }
    }
    
    ... 

Спасибо)