В мире веб-разработки работа с внешними API и сервисами является обычным явлением. Однако эти взаимодействия не всегда надежны. Проблемы с сетью, ошибки сервера или даже временная недоступность службы могут привести к сбою HTTP-запросов. Чтобы обеспечить надежность и отказоустойчивость приложения, Laravel предоставляет мощные механизмы обработки таких сбоев, включая повторные попытки HTTP. В этой статье мы рассмотрим различные методы, лучшие практики и примеры кода для реализации повторных попыток HTTP в Laravel.
- Использование промежуточного программного обеспечения Retry:
Laravel предлагает встроенное промежуточное программное обеспечение RetryMiddleware, которое можно добавить в стек промежуточного программного обеспечения. Это промежуточное программное обеспечение автоматически повторяет неудачные запросы на основе предопределенных правил. Чтобы включить его, добавьте промежуточное ПО в файлapp/Http/Kernel.php:
protected $middleware = [
// ...
\Illuminate\Http\Middleware\RetryRequests::class,
];
- Явные повторы с заголовком Retry-After.
Иногда вы можете столкнуться с API, которые предоставляют заголовокRetry-After, указывающий предлагаемое время для повтора запроса. Laravel позволяет вам реализовать этот сценарий с помощью методаretry, предоставляемого фасадомIlluminate\Support\Facades\Http:
$response = Http::retry(3, 5)->get('https://api.example.com/endpoint');
В этом примере запрос будет повторен три раза с задержкой в 5 секунд между каждой попыткой.
- Пользовательские стратегии повторов.
Laravel позволяет вам определять собственные стратегии повторов, исходя из конкретных потребностей вашего приложения. Вы можете создать собственную стратегию повторных попыток, реализовав интерфейсIlluminate\Contracts\Http\RetryStrategy:
use Illuminate\Contracts\Http\RetryStrategy;
class MyCustomRetryStrategy implements RetryStrategy
{
public function shouldRetry($attempt, $response): bool
{
// Implement your custom retry logic here
}
}
Определив собственную стратегию повторных попыток, вы можете применить ее к своим HTTP-запросам с помощью метода withRetryStrategy:
$response = Http::withRetryStrategy(new MyCustomRetryStrategy())->get('https://api.example.com/endpoint');
- Экспоненциальная отсрочка:
Экспоненциальная отсрочка — это широко используемая стратегия повторных попыток, которая постепенно увеличивает задержку между повторными попытками. Laravel предоставляет удобный классExponentialBackoffдля реализации этой стратегии:
use Illuminate\Http\ExponentialBackoff;
$response = Http::withBackoff(new ExponentialBackoff($maxAttempts = 5, $baseDelay = 100))->get('https://api.example.com/endpoint');
В этом примере задержка между повторными попытками будет увеличиваться в геометрической прогрессии, начиная с базовой задержки в 100 миллисекунд.
Повторные HTTP-запросы играют решающую роль в создании устойчивых приложений, которые могут корректно обрабатывать временные сбои. В этой статье мы рассмотрели несколько методов реализации повторных попыток HTTP в Laravel, включая использование встроенного RetryMiddleware, явные повторные попытки с заголовком Retry-After, пользовательские стратегии повторных попыток и экспоненциальную отсрочку. Используя эти методы, вы можете повысить надежность и надежность своих приложений Laravel, гарантируя плавное взаимодействие с внешними API и сервисами.