I am passionate about adopting new technologies and thrive in dynamic environments.

Telegram

@hxdvn

Social Links

Web Development

Quản Lý Giới Hạn Tốc Độ API trong Laravel thông qua Job Throttling

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.

Quản Lý Giới Hạn Tốc Độ API trong Laravel thông qua Job Throttling

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ả.

1. Hiểu về Redis::throttle trong Laravel

Redis::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ụ.

2. Triển khai Throttling cho việc gửi Email với AWS SES

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.

Tạo Middleware kiểm soát giới hạn tốc độ

Đầ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.

Sử dụng Middleware trong Notifications

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.

Tạo Controller để 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.

3. Lợi ích của Job Throttling trong Laravel

  • Bảo vệ dịch vụ API bên ngoài: Sử dụng Job Throttling giúp tránh vi phạm giới hạn của các dịch vụ API bên ngoài, tránh bị khóa hoặc ngừng dịch vụ.
  • Quản lý tài nguyên hiệu quả: Giảm tải cho hệ thống bằng cách quản lý và điều phối các công việc một cách hợp lý, tránh tình trạng quá tải.
  • Cải thiện trải nghiệm người dùng: Đảm bảo dịch vụ hoạt động ổn định, không bị gián đoạn hoặc chậm trễ do vi phạm giới hạn dịch vụ.

Kết luận

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

laravel, Redis::throttle, Rate Limits
7 min read
Nov 29, 2024
By HXD VN
Share

Leave a comment

Your email address will not be published. Required fields are marked *

Related posts

Jan 09, 2025 • 4 min read
Đối tác cung cấp dịch vụ hosting vps tốt nhất mà tôi tin tưởng sử dụng - 123HOST

Nhớ lại cách đây khoảng 10 năm, từ những ngày đầu bắt đầu dấn thân vào...

Dec 22, 2024 • 14 min read
Bí quyết thành công cho thực tập sinh: Hành trang vững chắc cho sự nghiệp

Từ kinh nghiệm làm việc của mình, tôi nhận thấy giai đoạn thực tập đón...

Dec 06, 2024 • 4 min read
PHP 8: Constructor property promotion

Trong PHP 8 property promotion cho phép bạn kết hợp các trường của cla...