Есть определенные операции, которые могут иметь высокую вероятность неудачи. Например, отправка запроса в сторонний 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/