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