Управління обмеженнями запитів API в Laravel за допомогою обмеження виконання завдань

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 30 листопада, 2024
У статті розглядається, як ефективно керувати обмеженнями швидкості API при використанні AWS SES для надсилання електронної пошти за допомогою Laravel. Дослідимо, як реалізувати контролювання пропускної здатності за допомогою Redis::throttle, щоб уникнути блокувань сервісу та забезпечити оптимальне використання API
```html

Коли ви працюєте з зовнішніми сервісами, такими як AWS SES для доставки електронної пошти, важливо запобігти перевантаженню API. Laravel пропонує елегантне рішення через Redis::throttle, яке допомагає ефективно управляти вашими лімітами. Давайте розглянемо, як впровадити це для оптимального використання API.

# Розуміння Redis::throttle

Метод Redis::throttle у Laravel надає потужний спосіб контролювати потік завдань у черзі. Це забезпечує дотримання лімітів API та допомагає уникнути тимчасових або постійних блокувань сервісу.

Redis::throttle('key-name')
    ->allow(10)
    ->every(5)
    ->then(function () {
        // Логіка вашої задачі тут
    });

# Практична реалізація

Створимо практичний приклад для управління швидкістю надсилання електронних листів з AWS SES. Ми реалізуємо повну систему проміжного програмного забезпечення для управління лімітами:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Redis;

class EmailRateLimit
{
    public function handle($job, Closure $next)
    {
        Redis::throttle('email-throttle')
            ->block(2)
            ->allow(10)
            ->every(2)
            ->then(
                function () use ($job, $next) {
                    $next($job);
                },
                function () use ($job) {
                    $job->release(30);
                }
            );
    }
}

Щоб застосувати це у вашій системі сповіщень:

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\MailMessage;
use App\Http\Middleware\EmailRateLimit;

class EmailDispatch extends Notification implements ShouldQueue
{
    use Queueable;

    protected $content;

    public function __construct($content)
    {
        $this->content = $content;
    }

    public function via($notifiable)
    {
        return ['mail'];
    }

    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject($this->content['subject'])
            ->line($this->content['body']);
    }

    public function middleware(): array
    {
        return [new EmailRateLimit];
    }
}

І нарешті, реалізуємо це у вашому контролері:

<?php

namespace App\Http\Controllers;

use App\Models\User;
use App\Notifications\EmailDispatch;
use Illuminate\Http\Request;

class MailController extends Controller
{
    public function dispatch(Request $request)
    {
        $content = [
            'subject' => 'Важливе оновлення',
            'body' => 'Ваш обліковий запис успішно оновлено.'
        ];

        $user = User::find($request->user_id);
        $user->notify(new EmailDispatch($content));

        return response()->json(['message' => 'Електронний лист поставлено у чергу для доставки']);
    }
}

Ця реалізація гарантує, що ваш додаток дотримується лімітів API, зберігаючи ефективну доставку електронних листів через AWS SES або будь-якого іншого провайдера електронної пошти

```