Повторение операции с высокой вероятностью отказа в 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 )
Максим Гречушников/ автор статьи
Мне 40 лет, и больше половины жизни я занимаюсь разработкой. За это время я работал с корпоративными системами, highload-проектами, интеграциями, платежными решениями, внутренними платформами и legacy-кодом, который пережил не одного разработчика. Некоторые системы, кажется, переживут и нас. Моя специализация — PHP, Laravel, backend-архитектура, DDD, тестирование, рефакторинг и техническое лидерство. Мне интересны задачи, где нужно соединить код, бизнес, данные, процессы и здравый смысл. Последние годы я много работаю с LLM и AI-инструментами: использую их для проектирования, анализа кода, документации, тестов, ревью, работы с legacy и построения инженерных процессов. Для меня LLM — это не замена разработчику, а усилитель для тех, кто умеет думать системно. В блоге я пишу о Laravel, PHP, архитектуре, тестировании, инженерной практике, управлении разработкой и реальном применении AI в работе программиста.
Понравилась статья? Поделиться с друзьями: