PurpleSchool — курсы программирования онлайн
  • Пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • AI для кодаНовое
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюс
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развитияВопросы для собеседований
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • PurpleSchool — курсы программирования онлайн
    • AI для кодаНовое
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    Настройка очередей с retray на laravel и Foton сравнение

    Настройка очередей с retray на laravel и Foton сравнение

    Аватар автора Настройка очередей с retray на laravel и Foton сравнение

    Константин

    Иконка календаря08 октября 2026
    очередиlaravelretrayframework FotonFotonmiddleИконка уровня middle
    Картинка поста Настройка очередей с retray на laravel и Foton сравнение

    Начнем с фреймворка Laravel

    здесь для создания очереди выполняем запуск создания воркера через cli

    php artisan make:job SendOrderToSdek

    Далее в файле джобы прописываем все условия по retray

    <?php namespace App\Jobs; use App\Models\Order; use App\Services\SdekService; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; class SendOrderToSdek implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public $tries = 3; // максимум 3 попытки public $maxExceptions = 3; // провал после 3 необработанных исключений public $timeout = 60; // таймаут выполнения задачи (сек) public function __construct( public Order $order ) {} // Нарастающие задержки между попытками (сек) public function backoff(): array { return [30, 60]; // 1-й повтор через 30 сек, 2-й — через 60 сек } // Альтернатива: временной лимит вместо количества попыток public function retryUntil(): \DateTime { return now()->addHours(2); // повторять в течение 2 часов } public function handle(SdekService $sdek): void { $sdek->createShipment($this->order); } // Сработает, если все попытки исчерпаны public function failed(\Throwable $exception): void { // отправить уведомление в Telegram / Slack / лог \Log::error("Job failed: {$exception->getMessage()}", [ 'order_id' => $this->order->id, ]); } }

    На Framework Foton создаем задачу через ядро, например так

    $this->core->cron(‘task’,[‘тестовый текст’]);
    

    Далее создаем метод task и вспомогательные методы для retray на \Dev\Cron

    <?php
      //размещаем код в класс Dev\Cron там уже инициирован класс ядра
        //метод записи в файл
        private function writeFile($path,$step){
            if(file_exists($path)){
                $current = file_get_contents($path);
            }
            else{
                $current = 0;
            }
            $current+=$step;
            file_put_contents($path,$current);
        }
        //метод чтения файла
        private function readFile($path){
            if(file_exists($path)){
                return file_get_contents($path);
            }
            return 0;
        }
        //метод удаления файла
        private function deleteFile($path){
            if(file_exists($path)){
                unlink($path);
            }
        }
        public function task($text){
            //настройки, путь к файлу для хранения количество успешно обработанных операций
            $path = FotonGit('.logs/task.log');
            //количество успешных шагов, после которого нужно удалить задачу
            $maxCount = 12;
            //шаг обновления
            $step = 1;
            //читаем из файла количество уже отработаных шагов
            $count = $this->readFile($path);
            //если оно больше или равно заданному максимуму удаляем задачу и файл логирования
            if($count>=$maxCount){
                $this->core->delWork('task'); 
                $this->deleteFile($path);
                echo $this->cli->green("Запись данных остановлена на шаге $count очередь удалена\r\n");
            }
            //если же нет выполняем задачу и дописываем в файл логов еще один шаг
            else{
                //здесь логика выполнения задачи
                FotonLog($text,'F');
                echo $this->cli->green("Данные записаны в файл текущая позиция $count \r\n");
                //добавляем при успешном выполнении еще 1,2,3 и т.д. записей в зависимости от $step
                $this->writeFile($path,$step);
            }
        }
    

    Далее на laravel создаем ручной retry внутри handle()

    public function handle(SdekService $sdek): void { try { $sdek->createShipment($this->order); } catch (\Throwable $e) { if ($this->attempts() >= 3) { throw $e; // окончательный провал → failed_jobs } $this->release(180); // вернуть в очередь, повтор через 180 сек } }

    И запускаем воркер

    php artisan queue:work --tries=3 --timeout=90

    Количество попыток 3, таймаут 90 секунд

    На Foton второй этап не нужен, так как мы уже добавили все проверки и запуски просто запускаем очередь через cli

    php foton cron 1 0 5

    Запустит очередь по 1 пакету за раз начиная с 0 каждые 5 секунд

    Это всего лишь примеры, их можно дорабатывать, но главное хотелось сравнить два разных подхода, с одной стороны воркеры которые работают как отдельные сущности повторяющие и проверяющие себя с не очень понятным механизмом проверки, так как при падении системы может случиться что у годно и с другой стороны обычный механизм очередей, но с возможностью кастомизации выборки успешных операций, здесь конечно нужно добавить и try catch и блокировку файловых операций, но суть именно в разных подходах. Какой выбрать решать вам, но из моего опыта если это не сложные задачи работающие с транзакциями лучше выбрать Foton, если же это сложные операции с большой логикой laravel либо организовать микросервис. Последнее наверное наиболее оптимально. Легкая сборка микросервисов есть на Foton из ядра, в laravel нужно будет писать как сервис, но в любом случае здесь мы получим отдельную точку входа, свое пространство с сервисом и широкие возможности кастомизации.

    Иконка глаза10

    Комментарии

    0

    Постройте личный план изучения HTML и CSS - полный курс по вёрстке с нуля до уровня Middle — бесплатно!

    HTML и CSS - полный курс по вёрстке с нуля — часть карты развития Frontend, Mobile

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    CSS Flexbox

    Антон Ларичев
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.9
    бесплатно
    Подробнее
    изображение курса

    Основы JavaScript

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Продвинутый JavaScript

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.8
    3 999 ₽ 6 990 ₽
    Подробнее

    Похожие статьи

    Картинка поста Работа с DI-контейнером на Framework Foton
    Иконка аватараКонстантин
    Иконка календаря07 октября 2026
    di-контейнерframework FotonFotonmiddleИконка уровня middle

    Работа с DI-контейнером на Framework Foton

    Что такое DI-контейнер и как с ним работать с примерами для самых маленьких на примере системы сборщика и внедрения зависимостей с автоматическим разрешением аргументов конструктора через рефлексию на Framework Foton

    Иконка чипа0
    Иконка глаза73
    Иконка комментариев0
    Иконка аватараАнтон
    Иконка календаря08 октября 2026
    AI-инструментыopenaiapi+ 2middleИконка уровня middle

    OpenCode Zen или свой API-ключ: что выгоднее в России

    OpenCode Zen — это шлюз с отобранными командой OpenCode моделями, где вы платите по факту за токены. Свой API-ключ — это когда вы подключаете к OpenCode отдельного провайдера и платите ему. Для разработчика из России выбор решается не ценой за токен, а способом оплаты: в Zen нужно привязать биллинг и платить в долларах, а ключ российского прокси оплачивается рублёвой картой.

    Иконка чипа0
    Иконка глаза33
    Иконка комментариев0
    Картинка поста Тестирование React-компонентов с Jest и React Testing Library
    Иконка аватараАнтон
    Иконка календаря07 октября 2026
    JestReact Testing LibraryТестирование+ 1middleИконка уровня middle

    Тестирование React-компонентов с Jest и React Testing Library

    Jest и React Testing Library: как настроить окружение, писать тесты на поведение пользователя, мокировать запросы и тестировать кастомные хуки.

    Иконка чипа0
    Иконка глаза47
    Иконка комментариев0
    Иконка чипа0