Laravel Tutorials

Managing API Rate Limits in Laravel Through Job Throttling

Published
Managing API Rate Limits in Laravel Through Job Throttling image

When working with external services like AWS SES for email delivery, preventing API flooding is crucial. Laravel provides an elegant solution through Redis::throttle to manage your rate limits effectively. Let's explore how to implement this to maintain optimal API usage.

Understanding Redis::throttle

The Redis::throttle method in Laravel offers a powerful way to control the flow of your queued jobs. This ensures you stay within API rate limits and avoid temporary or permanent service blocks.

Redis::throttle('key-name')
->allow(10)
->every(5)
->then(function () {
// Your job logic here
});

Real-World Implementation

Let's build a practical example for managing email sending rates with AWS SES. We'll create a complete middleware system to handle rate limiting:

<?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);
}
);
}
}

To apply this in your notification system:

<?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];
}
}

And finally, implementing it in your controller:

<?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' => 'Important Update',
'body' => 'Your account has been updated successfully.'
];
 
$user = User::find($request->user_id);
$user->notify(new EmailDispatch($content));
 
return response()->json(['message' => 'Email queued for delivery']);
}
}

This implementation ensures your application respects API rate limits while maintaining efficient email delivery through AWS SES or any other email service provider.

Harris Raftopoulos photo

Senior Software Engineer • Staff & Educator @ Laravel News • Co-organizer @ Laravel Greece Meetup

Sponsored

acquaintsoft logo
Acquaint Softtech

Hire Laravel developers with AI expertise at $20/hr. Get started in 48 hours.

Visit Acquaint Softtech

The latest

View all →
Delete Expired Sessions in Laravel With a Scheduled Command image

Delete Expired Sessions in Laravel With a Scheduled Command

Read article
Pollora: Run WordPress Inside a Laravel Application image

Pollora: Run WordPress Inside a Laravel Application

Read article
Scheduled Session Garbage Collection in Laravel 13.39 image

Scheduled Session Garbage Collection in Laravel 13.39

Read article
Deferred Schema Loading in Filament v5.8 image

Deferred Schema Loading in Filament v5.8

Read article
Sloppy: Static Analysis for AI-Written PHP image

Sloppy: Static Analysis for AI-Written PHP

Read article
Mastering Laravel Testing: A Video Course on Laravel Tests image

Mastering Laravel Testing: A Video Course on Laravel Tests

Read article