I am passionate about adopting new technologies and thrive in dynamic environments.
Khi làm việc với các dịch vụ bên ngoài như AWS SES để gửi email, việc quản lý giới hạn tốc độ API là rất quan trọng để tránh tình trạng gửi quá nhiều yêu cầu trong một khoảng thời gian ngắn, dẫn đến việc dịch vụ có thể bị tạm ngưng hoặc chặn vĩnh viễn.
Khi làm việc với các dịch vụ bên ngoài như AWS SES để gửi email, việc quản lý giới hạn tốc độ API là rất quan trọng để tránh tình trạng gửi quá nhiều yêu cầu trong một khoảng thời gian ngắn, dẫn đến việc dịch vụ có thể bị tạm ngưng hoặc chặn vĩnh viễn. Laravel cung cấp một giải pháp hiệu quả để quản lý giới hạn tốc độ thông qua phương thức Redis::throttle
, giúp quản lý việc gửi các yêu cầu API một cách an toàn và hiệu quả.
Redis::throttle
trong LaravelRedis::throttle
là một phương thức mạnh mẽ cho phép bạn kiểm soát số lượng công việc được xử lý trong hàng đợi, đảm bảo rằng không có quá nhiều yêu cầu được gửi trong một khoảng thời gian nhất định. Dưới đây là một ví dụ về cách sử dụng throttle
trong Laravel:
Redis::throttle('ten-khoa')
->allow(10)
->every(5)
->then(function () {
// Logic xử lý công việc tại đây
});
Trong ví dụ trên, Redis::throttle
sẽ cho phép tối đa 10 yêu cầu được thực hiện mỗi 5 giây. Điều này đảm bảo rằng các yêu cầu không vượt quá giới hạn của dịch vụ.
Khi gửi email thông qua AWS SES, bạn có thể sử dụng Redis::throttle
để đảm bảo rằng không có quá nhiều email được gửi trong một khoảng thời gian ngắn. Để thực hiện điều này, bạn có thể tạo một middleware để kiểm soát giới hạn tốc độ khi xử lý các công việc gửi email.
Đầu tiên, tạo một middleware với mục đích kiểm soát tần suất gửi email:
<?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) // Chờ tối đa 2 giây nếu vượt quá giới hạn
->allow(10) // Cho phép tối đa 10 yêu cầu
->every(2) // Mỗi 2 giây
->then(
function () use ($job, $next) {
$next($job); // Xử lý công việc nếu chưa vượt giới hạn
},
function () use ($job) {
$job->release(30); // Giải phóng công việc sau 30 giây nếu đang bị quá tải
}
);
}
}
Trong middleware này, chúng ta sử dụng Redis::throttle
với khóa email-throttle
. Middleware này cho phép thực hiện tối đa 10 email mỗi 2 giây. Nếu vượt quá giới hạn, công việc sẽ bị tạm dừng và thử lại sau 30 giây.
Sau khi đã tạo middleware, bạn có thể tích hợp nó vào lớp thông báo (Notification) để kiểm soát tốc độ gửi email:
<?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];
}
}
Lớp EmailDispatch
là một lớp thông báo được xếp hàng (Queued Notification) và sử dụng middleware EmailRateLimit
để quản lý giới hạn tốc độ gửi email.
Cuối cùng, bạn có thể triển khai việc gửi email từ controller. Controller này sẽ nhận yêu cầu từ người dùng và gửi email thông qua lớp EmailDispatch
:
<?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' => 'Cập nhật quan trọng',
'body' => 'Tài khoản của bạn đã được cập nhật thành công.'
];
$user = User::find($request->user_id);
$user->notify(new EmailDispatch($content));
return response()->json(['message' => 'Email đã được đưa vào hàng đợi để gửi']);
}
}
Phương thức dispatch
trong MailController
chịu trách nhiệm lấy thông tin từ yêu cầu, tạo thông báo EmailDispatch
, và gửi nó đến người dùng. Laravel sẽ đảm bảo rằng các thông báo này được gửi đi tuân thủ giới hạn tốc độ, nhờ vào middleware EmailRateLimit
.
Quản lý giới hạn tốc độ API là một trong những yếu tố quan trọng giúp ứng dụng của bạn hoạt động ổn định và bền vững, đặc biệt khi làm việc với các dịch vụ bên ngoài. Laravel cung cấp nhiều công cụ để giúp bạn đạt được mục tiêu này, và Redis::throttle
là một trong những giải pháp tốt nhất để quản lý giới hạn tốc độ trong hàng đợi công việc.
Hãy sử dụng Job Throttling để đảm bảo rằng ứng dụng của bạn tuân thủ đúng các giới hạn dịch vụ, giúp bảo vệ dịch vụ của bạn và cung cấp trải nghiệm người dùng tốt nhất có thể.
Nguồn: https://laravel-news.com/managing-api-rate-limits-in-laravel-through-job-throttling
Your email address will not be published. Required fields are marked *