spatie/laravel-rate-limited-job-middleware
Laravel job middleware to rate limit queued jobs. Allow a configurable number of jobs per second and automatically release throttled jobs for a delay. Easy to attach per job via middleware, with support for time-based attempts when rate limiting.
app/Jobs/*). This aligns perfectly with Laravel’s event-driven and asynchronous architecture, making it ideal for systems where job throttling is critical (e.g., API rate limiting, background processing, or external service calls).SETNX or database transactions), which may add latency if not optimized. Benchmark under expected load.shouldQueue() checks or retryUntil()).60 requests per minute) sufficient, or will dynamic rules (e.g., per-user tiers) be required?dispatch(), bus:work). Works alongside other Spatie packages (e.g., laravel-activitylog) if unified logging is needed.HandleJobsMiddleware in app/Http/Kernel.php.public function middleware() { return [\Spatie\RateLimitedJobMiddleware\RateLimitedJobMiddleware::class]; }).100 requests/hour per user).Spatie\RateLimitedJobMiddleware\Events\JobRateLimited).str_contains/array_key_first usage).predis/predis is installed (or use spatie/laravel-redis).Spatie\QueueableJobMiddleware).composer require spatie/laravel-rate-limited-job-middleware
php artisan vendor:publish --provider="Spatie\RateLimitedJobMiddleware\RateLimitedJobMiddlewareServiceProvider"
config/rate-limited-job-middleware.php:
'limits' => [
'api-webhook' => '100|minute',
'default' => '60|hour',
],
app/Http/Kernel.php:
protected $middlewareGroups = [
'web' => [...],
'api' => [...],
'jobs' => [
\Spatie\RateLimitedJobMiddleware\RateLimitedJobMiddleware::class,
],
];
public function middleware()
{
return [\Spatie\RateLimitedJobMiddleware\RateLimitedJobMiddleware::class];
}
config/rate-limited-job-middleware.php, reducing code changes.storage/logs/laravel.log.Monolog channels) for analytics.php artisan queue:failed and check middleware logs.job_key columns).limits config dynamically (e.g., via environment variables or a database table).php artisan config:cache) for performance.| Failure Scenario | Impact | Mitigation |
|---|---|---|
| Redis connection loss | Rate limiting fails (jobs unthrottled) | Fallback to database or allow all jobs temporarily. |
| Database lock contention | Jobs stall under high load | Use Redis; optimize database queries or increase connection pool size. |
| Misconfigured rate limits | Over/under-throttling | Validate configs in staging; use feature flags to toggle rate limiting. |
| Job retry loops | Infinite rate-limited retries | Add retryUntil() logic or dead-letter queue for failed jobs. |
| Middleware bypass | Jobs skip rate limiting | Audit job middleware chains; enforce |
How can I help you explore Laravel packages today?