Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

Xây dựng Bộ giới hạn tỷ lệ phân phối có thể mở rộng với Redis &Lua – Hướng dẫn từng bước

Xây dựng Bộ giới hạn tỷ lệ phân phối có thể mở rộng với Redis &Lua – Hướng dẫn từng bước

Trong hướng dẫn toàn diện này, bạn sẽ xây dựng bộ giới hạn tốc độ phân tán bằng cách sử dụng tập lệnh Redis và Lua để kiểm soát yêu cầu của người dùng trong môi trường có lưu lượng truy cập cao.

Giới hạn tốc độ là rất quan trọng trong bất kỳ hệ thống nào để ngăn chặn lạm dụng, quản lý lưu lượng truy cập và bảo vệ tài nguyên của bạn. Bằng cách tận dụng Redis và Lua, bạn sẽ xây dựng một hệ thống giới hạn tốc độ hiệu quả, có thể mở rộng, có thể xử lý số lượng lớn yêu cầu trong khi vẫn giữ an toàn cho các dịch vụ phụ trợ của bạn.

Chúng tôi cũng sẽ bao gồm một bản demo tương tác nơi người dùng có thể mô phỏng lưu lượng truy cập, quan sát các giới hạn tỷ lệ đang được thực thi và xem nhật ký các yêu cầu bị chặn.

Bạn sẽ học được gì

  • Cách xây dựng hệ thống giới hạn tỷ lệ bằng Redis.

  • Cách sử dụng tập lệnh Lua với Redis để đạt được các hoạt động nguyên tử.

  • Hiểu cấu trúc dữ liệu Redis để theo dõi yêu cầu hiệu quả.

  • Kỹ thuật xử lý lưu lượng truy cập cao trong hệ thống phân tán.

  • Sử dụng Docker để mô phỏng và mở rộng bộ giới hạn tốc độ phân tán.

Điều kiện tiên quyết

Trước khi bắt đầu, hãy đảm bảo bạn đã cài đặt các phần mềm sau:

  • Node.js (v14 trở lên)

  • Làm lại

  • Docker (để mô phỏng môi trường phân tán)

  • Hiểu biết cơ bản về tập lệnh Node.js, Redis và Lua.

Mục lục

  • Bạn sẽ học được gì

  • Điều kiện tiên quyết

  • Tổng quan dự án

  • Bước 1:Cách thiết lập dự án

  • Bước 2:Cách thiết lập Redis

  • Bước 3:Cách triển khai Bộ giới hạn tốc độ với Redis và Lua

  • Bước 4:Cách tạo máy chủ API Node.js

  • Bước 5:Cách kiểm tra bộ giới hạn tỷ lệ

  • Bước 6:Cách trực quan hóa các số liệu giới hạn tỷ lệ

  • Bước 7:Cách triển khai với Docker

  • Kết luận:Những gì bạn đã học được

Tổng quan dự án

Trong hướng dẫn này, bạn sẽ:

  1. Xây dựng bộ giới hạn tốc độ bằng Redis và Lua để thực thi hạn mức yêu cầu.

  2. Sử dụng tập lệnh Lua để đảm bảo hoạt động nguyên tử, tránh tình trạng chạy đua.

  3. Triển khai thuật toán nhóm mã thông báo để giới hạn tốc độ.

  4. Tạo bản demo tương tác để mô phỏng lưu lượng truy cập cao và trực quan hóa hoạt động giới hạn tỷ lệ.

Kiến trúc hệ thống

Bạn sẽ xây dựng hệ thống với các thành phần sau:

  1. Máy chủ API :Xử lý các yêu cầu đến của người dùng.

  2. Redis :Lưu trữ dữ liệu yêu cầu và thực thi các giới hạn tốc độ.

  3. Tập lệnh Lua :Đảm bảo cập nhật nguyên tử cho Redis để giới hạn tốc độ.

  4. Docker :Mô phỏng môi trường phân tán với nhiều phiên bản.

Bước 1:Cách thiết lập dự án

Hãy bắt đầu bằng cách thiết lập dự án Node.js của chúng ta:

mkdir distributed-rate-limiter
cd distributed-rate-limiter
npm init -y

Tiếp theo, cài đặt các phần phụ thuộc cần thiết:

npm install express redis dotenv
  • chuyển phát nhanh :Một khung máy chủ web nhẹ.

  • làm lại :Để tương tác với Redis.

  • dotenv :Để quản lý các biến môi trường.

Tạo một .env tập tin có nội dung sau:

REDIS_HOST=localhost
REDIS_PORT=6379
PORT=3000
RATE_LIMIT=5
TIME_WINDOW=60

Các biến này xác định máy chủ Redis, cổng, giới hạn tốc độ (số lượng yêu cầu được phép) và khoảng thời gian (tính bằng giây).

Bước 2:Cách thiết lập Redis

Trước khi chúng ta đi sâu vào mã, hãy đảm bảo rằng Redis đã được cài đặt và chạy trên hệ thống của bạn. Nếu chưa cài đặt Redis, bạn có thể sử dụng Docker để thiết lập nhanh:

docker run -p 6379:6379 --name redis-rate-limiter -d redis

Bước 3:Cách triển khai Bộ giới hạn tốc độ với Redis và Lua

Để xử lý hiệu quả giới hạn tốc độ, chúng tôi sẽ sử dụng thuật toán nhóm mã thông báo. Trong thuật toán này:

  1. Mỗi người dùng có một “nhóm” mã thông báo.

  2. Mỗi yêu cầu tiêu tốn một mã thông báo.

  3. Token được nạp lại định kỳ theo tỷ lệ đã đặt.

Để đảm bảo tính nguyên tử và tránh tình trạng xung đột, chúng tôi sẽ sử dụng tập lệnh Lua với Redis. Các tập lệnh Lua trong Redis thực thi nguyên tử, nghĩa là chúng không thể bị gián đoạn bởi các hoạt động khác trong khi chạy.

Cách tạo tập lệnh Lua để giới hạn tốc độ

Tạo một tệp có tên rate_limiter.lua :

local key = KEYS[1]
local limit = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local current = redis.call("get", key)
if current and tonumber(current) >= limit then
 return 0
else
 if current then
 redis.call("incr", key)
 else
 redis.call("set", key, 1, "EX", window)
 end
 return 1
end
  1. Đầu vào :

    • TỪ KHÓA[1] :Khóa Redis đại diện cho số lượng yêu cầu của người dùng.

    • ARGV[1] :Giới hạn tốc độ (số lượng yêu cầu tối đa được phép).

    • ARGV[2] :Khoảng thời gian (tính bằng giây) cho giới hạn tốc độ.

  2. Lý thuyết :

    • Nếu người dùng đã đạt đến giới hạn tốc độ, hãy trả về 0 (yêu cầu bị chặn).

    • Nếu người dùng ở trong giới hạn, hãy tăng số lượng yêu cầu của họ hoặc đặt số lượng mới có thời hạn nếu đó là yêu cầu đầu tiên.

    • Return 1 (cho phép yêu cầu).

Bước 4:Cách tạo máy chủ API Node.js

Tạo một tệp có tên server.js :

require('dotenv').config();
const express = require('express');
const redis = require('redis');
const fs = require('fs');
const path = require('path');
const app = express();
const client = redis.createClient({
 host: process.env.REDIS_HOST,
 port: process.env.REDIS_PORT
});
const rateLimitScript = fs.readFileSync(path.join(__dirname, 'rate_limiter.lua'), 'utf8');
const RATE_LIMIT = parseInt(process.env.RATE_LIMIT);
const TIME_WINDOW = parseInt(process.env.TIME_WINDOW);
// Middleware for rate limiting
async function rateLimiter(req, res, next) {
 const ip = req.ip;
 try {
 const allowed = await client.eval(rateLimitScript, 1, ip, RATE_LIMIT, TIME_WINDOW);
 if (allowed === 1) {
 next();
 } else {
 res.status(429).json({ message: 'Too many requests. Please try again later.' });
 }
 } catch (err) {
 console.error('Error in rate limiter:', err);
 res.status(500).json({ message: 'Internal server error' });
 }
}
app.use(rateLimiter);
app.get('/', (req, res) => {
 res.send('Welcome to the Rate Limited API!');
});
const PORT = process.env.PORT;
app.listen(PORT, () => {
 console.log(`Server running on port ${PORT}`);
});
  1. Phần mềm trung gian giới hạn tốc độ :

    • Truy xuất địa chỉ IP của khách hàng và kiểm tra xem chúng có nằm trong giới hạn tốc độ hay không bằng cách sử dụng tập lệnh Lua.

    • Nếu người dùng vượt quá giới hạn, 429 phản hồi được gửi đi.

  2. Điểm cuối API :

    • Điểm cuối gốc bị giới hạn tốc độ nên người dùng chỉ có thể truy cập điểm cuối đó với số lần giới hạn trong cửa sổ được chỉ định.

Bước 5:Cách kiểm tra bộ giới hạn tốc độ

  1. Bắt đầu Redis :

     docker start redis-rate-limiter
    
  2. Chạy máy chủ Node.js :

     node server.js
    
  3. Mô phỏng các yêu cầu :

    • Sử dụng curl hoặc Người đưa thư để kiểm tra bộ giới hạn tốc độ:

       curl http://localhost:3000
      
    • Gửi nhanh nhiều yêu cầu để xem hoạt động giới hạn tốc độ.

Bước 6:Cách trực quan hóa các chỉ số giới hạn tỷ lệ

Để giám sát các số liệu giới hạn tốc độ như số lần truy cập bộ đệm và các yêu cầu bị chặn, chúng tôi sẽ thêm tính năng ghi nhật ký vào phần mềm trung gian trong server.js :

async function rateLimiter(req, res, next) {
 const ip = req.ip;
 try {
 const allowed = await client.eval(rateLimitScript, 1, ip, RATE_LIMIT, TIME_WINDOW);
 if (allowed === 1) {
 console.log(`Allowed request from ${ip}`);
 next();
 } else {
 console.log(`Blocked request from ${ip}`);
 res.status(429).json({ message: 'Too many requests. Please try again later.' });
 }
 } catch (err) {
 console.error('Error in rate limiter:', err);
 res.status(500).json({ message: 'Internal server error' });
 }
}

Bước 7:Cách triển khai bằng Docker

Hãy đóng gói ứng dụng để chạy nó trong môi trường phân tán.

Tạo một Dockerfile :

FROM node:14
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3000
CMD ["node", "server.js"]

Xây dựng và chạy Docker Container:

docker build -t rate-limiter .
docker run -p 3000:3000 rate-limiter

Bây giờ bạn có thể mở rộng giới hạn tốc độ bằng cách chạy nhiều phiên bản.

Kết luận:Những điều bạn đã học được

Xin chúc mừng! Bạn đã xây dựng thành công bộ giới hạn tốc độ phân tán bằng cách sử dụng tập lệnh Redis và Lua. Trong suốt hướng dẫn này, bạn đã học được cách:

  1. Triển khai giới hạn tốc độ để kiểm soát yêu cầu của người dùng trong hệ thống phân tán.

  2. Sử dụng tập lệnh Lua trong Redis để thực hiện các thao tác nguyên tử.

  3. Áp dụng thuật toán nhóm mã thông báo để quản lý hạn mức yêu cầu.

  4. Theo dõi các chỉ số giới hạn tốc độ để tối ưu hóa hiệu suất.

  5. Sử dụng Docker để mô phỏng môi trường phân tán có thể mở rộng.

Các bước tiếp theo:

  1. Thêm giới hạn tỷ lệ theo ID người dùng :Mở rộng hệ thống để hỗ trợ giới hạn tốc độ cho mỗi người dùng.

  2. Tích hợp với Nginx :Sử dụng Nginx làm proxy ngược với giới hạn tốc độ được Redis hỗ trợ.

  3. Triển khai bằng Kubernetes :Mở rộng giới hạn tốc độ của bạn bằng Kubernetes để có tính sẵn sàng cao.

Chúc bạn viết mã vui vẻ!

Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu