DEV Community

Falo
Falo

Posted on

queue capacity tomcat

A. Rate-limit là gì ? Hiện trạng tại MB
Created by Nguyễn Huy Vương on Jul 11, 2024, viewed 76 times

  1. Rate limit là gì ? Rate limit là một pattern để hạn chế số lượng HTTP request được phục vụ của 1 service trong một đơn vị thời gian nhất định giây, phút, giờ, ngày, tháng hoặc năm. Việc sử dụng rate limit có thể giúp ngăn chặn tấn công DDOS, hạn chế tấn công brute force, kiểm soát các request vào service từ có thể làm tăng tính available của service. VD: - 1 API sẽ chỉ nhận max là 100 request/giây, còn lại sẽ từ chối luôn request
   - 1 API chỉ nhận 5 request ứng với mỗi địa chỉ client trên 1 giây, còn lại sẽ từ chối luôn request
Enter fullscreen mode Exit fullscreen mode
  1. Hiện trạng áp dụng rate-limit tại ABC. Rate-limit chủ yếu được triển khai trên các gateway, Hiện tại ở MB đang sử dụng APIGEE và Kraken làm 2 gateway chủ yếu. APIGEE:

Quota: Tổng số lượng request sẽ được serving trong 1 đơn vị thời gian. Có biến count để xác định còn quote hay không, nếu còn thì acceept còn không thì deny request.
Spike Arrest: Đảm bảo các request đến là đều nhau theo thời gian.
VD: Config spike arrest là 6 request 1 phút ==> Mỗi request sẽ cách nhau 10s. Nếu trong 10s mà xuất hiện 2 request thì request thứ 2 sẽ bị denied

KRAKEN:

max_rate: Tổng số lượng request có thể được serving trong 1 đơn vị thời gian trên 1 endpoint
client_max_rate: Tổng số lượng request có thể được serving trong 1 đơn vị thời gian trên 1 endpoint ứng với 1 client.
Hiện trạng cấu hình rate-limit trong nội tại các service tại MB:

Hiện tại phần lớn các service tại MB chưa cấu hình rate limit cụ thể. Chính vì vậy rate limit của các service đang vô tình được cấu hình theo cá thông số default mà tomcat server cung cấp.
Rate-limit = max-connection(default) + accept-count(default) = 10100/giây. (Công thức được giải thích kĩ hơn trong bài sau: Yêu cầu config tomcat để đạt được rate-limit)

Điều này sẽ khiến cho các request đi vào dịch vụ có thể phải đợi khi đi vào queue dẫn đến dịch vụ bị quá tải và tăng thời gia đợi cho các dịch vụ tích hợp vào.

Uploading image

maxThreads: Số lượng threads xử lý request đồng thời, default: 200
acceptCount: Số lượng request được queue trên OS, default: 100
maxConnections: số lương request được queue trên tomcat server: default: 10000, Cấu hình này thường phải lớn hơn hoặc bằng threadsMax để đảm bảo các thread làm việc tối đa.
Mỗi request đến service sẽ được xử lý bởi 1 thread trong pool của Connector trong tomcat tạo ra. Flow của các request sẽ như sau:

Khi số lượng request đồng thời vào service tăng dần, connector sẽ tạo ra các thread xử lý lượng request đồng thời đó cho đến khi đạt số lượng thread = maxThreads.
Các request khác tiếp tục gửi đồng thời vào mà chưa có thread nào free thì các request này sẽ được xếp vào server socket được tạo bởi Connector trong tomcat.Số lượng request lớn nhất có thể được xếp vào server socket là maxConnections. Sau khi có thread free thì sẽ lấy các request này ra xử lý lần lượt.
Nếu cả maxThreads và maxConnections đều đã đạt ngưỡng config thì lúc này các request tiếp theo sẽ được queue bởi OS. Số lượng queue của OS được cấu hình theo config acceptCount
Nếu request được queue vượt ngưỡng accept-count thì sẽ bị reject ngay lập tức.
Công thức chung:

Công thức tính rateLimit tại 1 thời điểm cho ứng dụng:
rateLimit = maxConnection + acceptCount

Công thức tính số lượng request phải đợi khi đạt rate limit:
requestWaiting = maxConnections – maxThreads + acceptCount

Thực nghiệm công thức:

Cấu hình ứng dụng: Cấu hình config như hình dưới để có được rate limit là 700

Top comments (0)