Quay lại danh sách
Tin tức công nghệ

Ứng dụng Valkey để xây dựng hệ thống Rate Limiting phân tán cho cụm Microservices trên VPS Linux

4 tháng 6, 2026

Giới thiệu về bài toán kiểm soát lưu lượng trong kiến trúc Microservices

Trong kỷ nguyên của kiến trúc Microservices, việc đảm bảo tính ổn định và tính sẵn sàng của hệ thống là một thách thức lớn đối với các kỹ sư vận hành và phát triển phần mềm. Khi một hệ thống được chia nhỏ thành hàng chục hoặc hàng trăm dịch vụ độc lập phối hợp với nhau, một đợt tăng đột biến lưu lượng (traffic spike) hoặc một cuộc tấn công từ chối dịch vụ (DoS/DDoS) nhắm vào một endpoint duy nhất có thể gây ra hiện tượng "thác đổ" (cascading failure), làm sập toàn bộ hệ thống.

Để giải quyết bài toán này, Rate Limiting (Giới hạn tốc độ thiết lập yêu cầu) đóng vai trò như một lá chắn phòng thủ vòng ngoài cốt lõi. Nó kiểm soát số lượng yêu cầu mà một người dùng, một IP hoặc một ứng dụng đối tác có thể gửi đến hệ thống trong một khoảng thời gian nhất định. Tuy nhiên, khi triển khai ứng dụng trên nhiều máy chủ ảo VPS Linux dưới dạng một cụm phân tán, giải pháp Rate Limiting cục bộ (local rate limiting) trên từng node không còn hiệu quả. Chúng ta cần một giải pháp Rate Limiting phân tán (Distributed Rate Limiting) để chia sẻ trạng thái giới hạn một cách đồng nhất và chính xác giữa tất cả các instance.

Valkey là gì? Tại sao lựa chọn Valkey thay vì Redis?

Trong nhiều năm qua, Redis là lựa chọn mặc định cho lưu trữ cấu trúc dữ liệu trên bộ nhớ trong (in-memory data store) nhờ tốc độ xử lý vượt trội, cực kỳ phù hợp cho bài toán Rate Limiting. Tuy nhiên, sau sự thay đổi đột ngột về giấy phép mã nguồn mở của Redis sang RSALv2 và SSPLv1 vào đầu năm 2024, cộng đồng công nghệ đã tìm kiếm một giải pháp thay thế thực sự mở và bền vững. Đó chính là sự ra đời của Valkey.

Valkey là dự án mã nguồn mở được bảo trợ bởi Linux Foundation với sự đóng góp mạnh mẽ từ các tập đoàn công nghệ hàng đầu như AWS, Google Cloud, Oracle và Ericsson. Valkey tiếp tục phát triển dựa trên nền tảng Redis mã nguồn mở phiên bản 7.2.4, đảm bảo khả năng tương thích ngược hoàn toàn (drop-in replacement). Dưới đây là những lý do cốt lõi để lựa chọn Valkey cho hệ thống Rate Limiting trên VPS Linux:

  • Mã nguồn mở hoàn toàn: Valkey sử dụng giấy phép BSD 3-Clause, loại bỏ hoàn toàn rủi ro pháp lý và chi phí bản quyền cho doanh nghiệp.
  • Hiệu năng vượt trội: Các tối ưu hóa trong các phiên bản mới của Valkey giúp cải thiện luồng xử lý đa luồng (multi-threading), giảm độ trễ (latency) xuống mức microsecond và tối ưu hóa dung lượng bộ nhớ sử dụng.
  • Khả năng tương thích: Chạy mượt mà trên môi trường Linux (Ubuntu, CentOS, Debian) và hỗ trợ hoàn hảo tất cả các cấu trúc dữ liệu cần thiết cho Rate Limiting như String, Sorted Set, và kịch bản Lua Script.

Các thuật toán Rate Limiting phổ biến và ứng dụng trong Valkey

Trước khi bắt tay vào cấu hình hệ thống trên VPS Linux, chúng ta cần hiểu rõ bản chất toán học và cấu trúc dữ liệu của các thuật toán Rate Limiting để đưa ra lựa chọn phù hợp nhất cho mô hình kinh doanh.

1. Thuật toán Cửa sổ cố định (Fixed Window Counter)

Đây là thuật toán đơn giản nhất. Hệ thống chia thời gian thành các khoảng cố định (ví dụ: 1 phút). Mỗi người dùng có một bộ đếm (counter) tăng dần sau mỗi request. Nếu bộ đếm vượt ngưỡng, request bị chặn. Khi sang phút tiếp theo, bộ đếm được reset.

Triển khai trên Valkey: Sử dụng lệnh INCR kết hợp với EXPIRE. Tuy nhiên, thuật toán này có nhược điểm chí mạng là hiện tượng Bursting ở ranh giới giữa hai cửa sổ thời gian (người dùng có thể gửi gấp đôi số lượng request cho phép chỉ trong vài giây ở thời điểm giao thoa).

2. Thuật toán Cửa sổ trượt (Sliding Window Log / Counter)

Thuật toán này khắc phục nhược điểm của Fixed Window bằng cách tính toán chính xác số lượng request trong khoảng thời gian trượt (ví dụ: đúng 60 giây gần nhất tính từ thời điểm hiện tại).

Triển khai trên Valkey: Sử dụng cấu trúc dữ liệu Sorted Set (ZSET). Mỗi request được lưu với score và value là mốc thời gian Unix timestamp. Khi có request mới, hệ thống dùng lệnh ZREMRANGEBYSCORE để xóa các log cũ ngoài khoảng thời gian, sau đó dùng ZCARD để đếm số lượng request hiện tại.

3. Thuật toán Thùng chứa mã báo (Token Bucket)

Thuật toán Token Bucket duy trì một chiếc thùng chứa tối đa N token. Token được nạp vào thùng theo một tốc độ cố định R token/giây. Mỗi request đến hệ thống sẽ tiêu thụ 1 token. Nếu thùng hết token, request bị từ chối.

Thuật toán Token Bucket là lựa chọn tối ưu nhất cho phần lớn các hệ thống Microservices hiện nay nhờ khả năng xử lý linh hoạt các đợt lưu lượng tăng đột biến một cách mượt mà (allow bursting) mà vẫn duy trì được tốc độ trung bình ổn định trong dài hạn.

Kiến trúc hệ thống Rate Limiting phân tán với Valkey trên VPS Linux

Trong mô hình cụm Microservices triển khai trên VPS Linux, kiến trúc tiêu chuẩn bao gồm các thành phần:

  1. API Gateway (Reverse Proxy): Điểm tiếp nhận request đầu tiên (ví dụ: Nginx, Kong, hoặc Envoy).
  2. Microservices Nodes: Các thực thể ứng dụng chạy trên một hoặc nhiều VPS Linux khác nhau.
  3. Valkey Cluster / Sentinel: Cụm máy chủ lưu trữ dữ liệu tập trung đảm bảo tính sẵn sàng cao (High Availability).

Khi một request từ Client gửi đến API Gateway, gateway hoặc một middleware chuyên dụng tại Microservice sẽ gửi một truy vấn nhanh đến Valkey để kiểm tra xem Client này (định danh qua IP, API Key hoặc JWT) có vượt quá giới hạn hay không. Toàn bộ quá trình kiểm tra này phải diễn ra dưới 2-5 milliseconds để không ảnh hưởng đến trải nghiệm người dùng tổng thể.

Hướng dẫn triển khai chi tiết trên VPS Linux

Sau đây là các bước thực tế để cài đặt và cấu hình giải pháp Rate Limiting phân tán sử dụng Valkey trên môi trường Ubuntu Server Linux.

Bước 1: Cài đặt Valkey trên VPS Linux

Cập nhật hệ thống và tiến hành build Valkey từ mã nguồn hoặc sử dụng kho lưu trữ chính thức:

sudo apt update && sudo apt install -y build-essential tcl libjemalloc-dev
git clone https://github.com/valkey-io/valkey.git
cd valkey
make
sudo make install

Cấu hình file /etc/valkey/valkey.conf để tối ưu hóa bộ nhớ cho môi trường production:

maxmemory 2gb
maxmemory-policy volatile-lru
protected-mode yes

Bước 2: Sử dụng Lua Script tối ưu hóa hiệu năng Rate Limiting

Để tránh hiện tượng Race Condition (xung đột dữ liệu khi nhiều microservices cùng ghi vào Valkey một lúc) và giảm thiểu số lượng Network Round-Trip, chúng ta sẽ đóng gói logic thuật toán Token Bucket vào một đoạn Lua Script. Valkey sẽ thực thi đoạn script này một cách nguyên tử (atomic operation) trực tiếp trên RAM.

Dưới đây là mã nguồn mẫu Lua Script triển khai Token Bucket trên Valkey:

local key = KEYS[1]
local capacity = tonumber(ARGV[1])
local refill_rate = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
local requested = tonumber(ARGV[4])

local bucket = valkey.call('hgetall', key)
local last_update, tokens

if #bucket == 0 then
    tokens = capacity
    last_update = now
else
    local data = {}
    for i = 1, #bucket, 2 do
        data[bucket[i]] = bucket[i+1]
    end
    last_update = tonumber(data['last_update'])
    tokens = tonumber(data['tokens'])
end

-- Tính toán số token được nạp thêm theo thời gian trôi qua
local elapsed = math.max(0, now - last_update)
local tokens_to_add = elapsed * refill_rate
tokens = math.min(capacity, tokens + tokens_to_add)

if tokens >= requested then
    tokens = tokens - requested
    valkey.call('hset', key, 'tokens', tokens, 'last_update', now)
    valkey.call('expire', key, math.ceil(capacity / refill_rate))
    return 1 -- Chấp nhận request
else
    valkey.call('hset', key, 'tokens', tokens, 'last_update', now)
    return 0 -- Từ chối request
end

Giải pháp đảm bảo tính sẵn sàng cao và khả năng mở rộng (Scaling)

Khi lưu lượng hệ thống Microservices tăng trưởng vượt ngưỡng tải của một VPS Linux đơn lẻ, doanh nghiệp cần nâng cấp kiến trúc tầng lưu trữ Valkey theo các mô hình sau:

  • Valkey Sentinel: Cung cấp cơ chế tự động chuyển vùng khi có sự cố (Automatic Failover). Nếu VPS chứa node Master bị sập, Sentinel sẽ tự động đưa một node Replica lên làm Master, đảm bảo hệ thống Rate Limiting không bị gián đoạn.
  • Valkey Cluster: Phân mảnh dữ liệu (Sharding) tự động trên nhiều VPS Linux khác nhau dựa trên thuật toán Hash Slot. Giải pháp này giúp mở rộng băng thông xử lý (throughput) tuyến tính và khả năng lưu trữ hàng triệu keys định danh người dùng cùng lúc.

Kết luận

Xây dựng một hệ thống Rate Limiting phân tán mạnh mẽ là bước đi không thể thiếu để bảo vệ toàn diện cụm Microservices. Với sự trỗi dậy của Valkey, các kỹ sư hệ thống hiện đã có trong tay một công cụ mã nguồn mở tối ưu, kế thừa trọn vẹn sức mạnh của Redis nhưng được cải tiến mạnh mẽ về mặt hiệu năng và tính tự do công nghệ. Triển khai Valkey kết hợp với Lua Script trên hạ tầng VPS Linux giúp doanh nghiệp tối ưu chi phí, nâng cao khả năng chịu tải và đảm bảo an toàn tuyệt đối trước các nguy cơ quá tải hệ thống.

Ứng dụng Valkey để xây dựng hệ thống Rate Limiting phân tán cho cụm Microservices trên VPS Linux | DPTCloud