0
0
Lập trình
TT

Xây Dựng Bộ Giới Hạn Tần Suất Chat AI Với Node.js và Express

Đăng vào 6 ngày trước

• 4 phút đọc

Giới thiệu

Trong quá trình phát triển ứng dụng chat AI, một trong những thách thức lớn nhất là kiểm soát chi phí. Mỗi yêu cầu AI đều có chi phí, vì vậy bạn không thể cho phép sử dụng không giới hạn. Một bộ giới hạn tần suất (rate limiter) giúp giải quyết vấn đề này bằng cách hạn chế số lượng yêu cầu mà mỗi người dùng có thể thực hiện trong một khoảng thời gian cố định.

Trong bài viết này, chúng ta sẽ khám phá cách xây dựng một backend chatbot sử dụng Node.js, Express và Vercel AI SDK. Hệ thống của chúng ta sử dụng thuật toán giới hạn tần suất cửa sổ cố định để quản lý việc sử dụng cho các loại người dùng khác nhau: Khách, Miễn phí và Cao cấp.


Tại Sao Cần Giới Hạn Tần Suất?

Giới hạn tần suất đảm bảo:

  • Sử dụng công bằng cho tất cả người dùng
  • Bảo vệ khỏi lạm dụng
  • Kiểm soát chi phí cho các dịch vụ AI
  • Hiệu suất hệ thống có thể dự đoán

Ví dụ, nếu một Khách hàng thực hiện 1.000 yêu cầu mỗi giờ, chi phí của bạn có thể tăng vọt. Với một bộ giới hạn, bạn có thể quyết định số lượng yêu cầu được phép.


Các Loại Người Dùng và Giới Hạn

Loại Người Dùng Giới Hạn (mỗi giờ) Ghi Chú
Khách 3 Không cần đăng nhập
Miễn phí 10 Người dùng đã đăng nhập với gói miễn phí
Cao cấp 50 Người dùng đã đăng nhập với gói cao cấp

Hệ thống xác định:

  • Khách bằng địa chỉ IP
  • Người dùng đã đăng nhập qua user.id (từ token JWT)

Cách Thức Hoạt Động Của Bộ Giới Hạn Tần Suất

  1. Một yêu cầu được gửi đến /api/chat.

  2. Nếu có token JWT, nó sẽ được xác thực. Nếu không có, người dùng là Khách.

  3. Hệ thống quyết định giới hạn dựa trên loại người dùng:

    • Khách = 3
    • Miễn phí = 10
    • Cao cấp = 50
  4. Bộ đếm yêu cầu được kiểm tra cho cửa sổ 1 giờ hiện tại.

  5. Nếu người dùng còn yêu cầu, hệ thống sẽ chuyển tiếp truy vấn đến AI SDK.

  6. Nếu giới hạn bị vượt quá, máy chủ trả về một lỗi 429 với thông điệp rõ ràng.


Thuật Toán Cửa Sổ Cố Định

Chúng ta sử dụng Thuật Toán Cửa Sổ Cố Định:

  • Giữ một số đếm yêu cầu cho mỗi người dùng (hoặc IP).
  • Nếu yêu cầu nằm trong cùng một cửa sổ (1 giờ), tăng số đếm.
  • Nếu cửa sổ đã hết hạn, reset số đếm và bắt đầu một cửa sổ mới.
  • Nếu số đếm vượt quá giới hạn, từ chối yêu cầu.

Ví dụ trong bộ nhớ:

json Copy
{
  "user123": {
    "count": 7,
    "windowStart": 1695206400000
  }
}

Điều này có nghĩa là user123 đã thực hiện 7 yêu cầu kể từ khi cửa sổ cuối cùng bắt đầu.


Sơ Đồ Quy Trình

Quy trình có thể được giải thích bằng sơ đồ sau:

  • Kiểm tra xem yêu cầu có token JWT không.
  • Nếu hợp lệ, xác định loại người dùng (Miễn phí hoặc Cao cấp). Nếu không, gán là Khách.
  • Áp dụng giới hạn tần suất dựa trên loại người dùng.
  • Nếu người dùng mới, bắt đầu theo dõi yêu cầu.
  • Nếu thời gian cửa sổ đã hết, reset bộ đếm.
  • Nếu số đếm nằm trong giới hạn, cho phép yêu cầu. Nếu không, chặn nó.

Thực Hành Tốt Nhất

Khi triển khai bộ giới hạn tần suất, bạn nên xem xét các thực hành tốt nhất sau:

  1. Theo dõi hiệu suất: Sử dụng công cụ giám sát để theo dõi tần suất yêu cầu và hiệu suất hệ thống.
  2. Cung cấp thông báo: Khi người dùng gần đạt giới hạn, thông báo cho họ để họ có thể điều chỉnh hành vi sử dụng.
  3. Điều chỉnh giới hạn: Tùy chỉnh giới hạn dựa trên trải nghiệm người dùng và chi phí thực tế.

Các Lỗi Thường Gặp

Một số lỗi thường gặp khi triển khai bộ giới hạn tần suất bao gồm:

  • Không xác thực JWT đúng cách: Đảm bảo rằng token JWT được ký và xác thực chính xác.
  • Quản lý bộ nhớ không hiệu quả: Sử dụng cơ chế lưu trữ hiệu quả để tránh tràn bộ nhớ.

Kết Luận

Bằng cách kết hợp Express, xác thực JWT, và Vercel AI SDK, chúng ta đã xây dựng một backend chatbot với các giới hạn tần suất khác nhau cho Khách, người dùng Miễn phí và người dùng Cao cấp.

Điều này đảm bảo kiểm soát chi phí, sử dụng công bằng và trải nghiệm tốt hơn cho tất cả người dùng.

Mã nguồn: GitHub - chatbot-throttle

⭐ Nếu bạn thấy dự án này hữu ích, đừng quên đánh dấu sao cho repository trên GitHub!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào