Повторение операции с высокой вероятностью отказа в Laravel

Есть определенные операции, которые могут иметь высокую вероятность неудачи. Например, отправка запроса в сторонний API. Вы не уверены, будет ли это работать каждый раз безупречно, потому что это не в вашей власти. Если конечная точка API, на которую вы отправляете запрос, не отвечает, Вы можете сразу же получить исключение.

Я уверен, что мы все не хотим, чтобы это произошло. Итак, что бы вы сделали в таком случае? Вы “повторите” ту же операцию, нет?

Ну, если ваше приложение построено поверх фреймворка Laravel, то в фреймворке есть действительно удобная вспомогательная функция, которая может помочь вам сделать именно это.

Хелпер retry 

По сути, retry – это вспомогательная функция общего назначения, которая помогает вам пытаться выполнить данный обратный вызов до тех пор, пока не будет достигнут заданное кол-во попыток.

Вот сигнатура этой функции.

function retry($times, callable $callback, $sleep = 0, $when = null);

Как вы можете видеть, функция принимает четыре аргумента.

  • $times – Максимальное количество попыток вызова колбека, которое вы хотите повторить.
  • $callback – Функция, которую вы хотите выполнить повторно.
  • $sleep (необязательно) – количество миллисекунд, в течение которых Laravel должен ожидать между попытками.
  • $when (необязательно) – колбек, в котором вы можете указать условие, когда необходимо выполнять попытки

Таким образом, если вы хотите выполнить вызов API, который вы хотите повторить (при сбое) 3 раза каждые 200 миллисекунд, вы можете использовать функцию retry таким образом.

$response = retry(3, function () {
    return Http::get('http://example.com/users/1');
}, 200)

Если колбек вызывает исключение, он будет автоматически повторен, иначе его возвращаемое значение будет возвращено. Как только максимальное количество попыток будет превышено, исключение будет выдано.

Если вы не укажете нужное количество миллисекунд, Laravel немедленно попытается выполнить обратный вызов.

Повторение попыток в Http 

Кроме того, вы можете напрямую вызвать метод retries (который очень похож на функцию retry), если вы используете Http-клиент таким образом.

$response = Http::retries(3, 200)->get('http://example.com/users/1');

Как вы можете видеть,

  • Первый аргумент, который принимает retries – это максимальное количество попыток выполнения запроса
  • А второй аргумент (необязательно, по умолчанию = 0) – это количество миллисекунд, которое Laravel должен ждать между попытками.

Если все запросы завершатся неудачей, будет создан экземпляр Illuminate\Http\Client\RequestException.

https://www.amitmerchant.com/retry-operations-with-high-probability-of-failure-in-laravel/

Рейтинг
( 5 оценок, среднее 5 из 5 )
Maxyc Webber/ автор статьи
Мне 35 лет. Опыт профессиональной разработки 15 лет. Занимаюсь разработкой и поддержкой корпоративных систем автоматизации бизнеса, а также высоконагруженными проектами. Мне нравится решать нестандартные проблемы бизнеса. Имею опыт формирования команд под проект, налаживания процесса разработки, коммуникации программистов и заказчиков. Есть опыт работы с зарубежными заказчиками (ОАЭ, Польша, Германия, Швейцария).
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.