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

Xây dựng Trình rút ngắn URL hiệu suất cao với bộ nhớ đệm phân tán của Node.js và Redis

Xây dựng Trình rút ngắn URL hiệu suất cao với bộ nhớ đệm phân tán của Node.js và Redis

Trong hướng dẫn này, chúng ta sẽ xây dựng một dịch vụ rút ngắn URL có thể mở rộng bằng cách sử dụng Node.js và Redis. Dịch vụ này sẽ tận dụng bộ nhớ đệm phân tán để xử lý lưu lượng truy cập cao một cách hiệu quả, giảm độ trễ và mở rộng quy mô một cách liền mạch. Chúng ta sẽ khám phá các khái niệm chính như băm nhất quán, chiến lược vô hiệu hóa bộ nhớ đệm và phân mảnh để đảm bảo hệ thống luôn hoạt động nhanh và đáng tin cậy.

Đến cuối hướng dẫn này, bạn sẽ có dịch vụ rút ngắn URL đầy đủ chức năng sử dụng bộ nhớ đệm được phân phối để tối ưu hóa hiệu suất. Chúng tôi cũng sẽ tạo một bản demo tương tác nơi người dùng có thể nhập URL và xem các số liệu theo thời gian thực như số lần truy cập và bỏ lỡ bộ nhớ đệm.

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

  • Cách xây dựng dịch vụ rút ngắn URL bằng Node.jsRedis .

  • Cách triển khai bộ nhớ đệm phân tán để tối ưu hóa hiệu suất.

  • Hiểu băm nhất quánchiến lược vô hiệu hóa bộ đệm .

  • Sử dụng Docker để mô phỏng nhiều phiên bản Redis để phân chia và mở rộng quy mô.

Đ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

  • Người đưa tin

  • Kiến thức cơ bản về JavaScript, Node.js và Redis.

Mục lục

  • Tổng quan dự án

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

  • Bước 2:Thiết lập phiên bản Redis

  • Bước 3:Triển khai Dịch vụ rút ngắn URL

  • Bước 4:Thực hiện vô hiệu hóa bộ đệm

  • Bước 5:Theo dõi số liệu bộ đệm

  • Bước 6:Kiểm tra ứng dụng

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

Tổng quan dự án

Chúng tôi sẽ xây dựng dịch vụ rút ngắn URL trong đó:

  1. Người dùng có thể rút ngắn các URL dài và lấy lại các URL gốc.

  2. Dịch vụ sử dụng Bộ nhớ đệm Redis để lưu trữ ánh xạ giữa URL rút gọn và URL gốc.

  3. Bộ đệm được phân phối trên nhiều phiên bản Redis để xử lý lưu lượng truy cập cao.

  4. Hệ thống sẽ hiển thị lần truy cập bộ nhớ đệmbỏ lỡ trong thời gian thực.

Kiến trúc hệ thống

Để đảm bảo khả năng mở rộng và hiệu suất, chúng tôi sẽ chia dịch vụ của mình thành các thành phần sau:

  1. Máy chủ API :Xử lý các yêu cầu rút ngắn và truy xuất URL.

  2. Lớp bộ đệm Redis :Sử dụng nhiều phiên bản Redis cho bộ nhớ đệm phân tán.

  3. Docker :Mô phỏng môi trường phân tán với nhiều vùng chứa Redis.

Bước 1:Thiết lập dự án

Hãy thiết lập dự án của chúng ta bằng cách khởi tạo ứng dụng Node.js:

mkdir scalable-url-shortener
cd scalable-url-shortener
npm init -y

Bây giờ, hãy cài đặt các phần phụ thuộc cần thiết:

npm install express redis shortid dotenv
  • express :Một khung máy chủ web nhẹ.

  • redis :Để xử lý bộ nhớ đệm.

  • shortid :Để tạo ID ngắn, duy nhất.

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

Tạo một .env tập tin trong thư mục gốc của dự án của bạn:

PORT=3000
REDIS_HOST_1=localhost
REDIS_PORT_1=6379
REDIS_HOST_2=localhost
REDIS_PORT_2=6380
REDIS_HOST_3=localhost
REDIS_PORT_3=6381

Các biến này xác định máy chủ và cổng Redis mà chúng tôi sẽ sử dụng.

Bước 2:Thiết lập phiên bản Redis

Chúng tôi sẽ sử dụng Docker để mô phỏng môi trường phân tán với nhiều phiên bản Redis.

Chạy các lệnh sau để khởi động ba vùng chứa Redis:

docker run -p 6379:6379 --name redis1 -d redis
docker run -p 6380:6379 --name redis2 -d redis
docker run -p 6381:6379 --name redis3 -d redis

Điều này sẽ thiết lập ba phiên bản Redis chạy trên các cổng khác nhau. Chúng tôi sẽ sử dụng những trường hợp này để triển khai băm nhất quán và phân mảnh.

Bước 3:Triển khai Dịch vụ rút ngắn URL

Hãy tạo tệp ứng dụng chính của chúng ta, index.js :

require('dotenv').config();
const express = require('express');
const redis = require('redis');
const shortid = require('shortid');
const app = express();
app.use(express.json());
const redisClients = [
 redis.createClient({ host: process.env.REDIS_HOST_1, port: process.env.REDIS_PORT_1 }),
 redis.createClient({ host: process.env.REDIS_HOST_2, port: process.env.REDIS_PORT_2 }),
 redis.createClient({ host: process.env.REDIS_HOST_3, port: process.env.REDIS_PORT_3 })
];
// Hash function to distribute keys among Redis clients
function getRedisClient(key) {
 const hash = key.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);
 return redisClients[hash % redisClients.length];
}
// Endpoint to shorten a URL
app.post('/shorten', async (req, res) => {
 const { url } = req.body;
 if (!url) return res.status(400).send('URL is required');
 const shortId = shortid.generate();
 const redisClient = getRedisClient(shortId);
 await redisClient.set(shortId, url);
 res.json({ shortUrl: `http://localhost:${process.env.PORT}/${shortId}` });
});
// Endpoint to retrieve the original URL
app.get('/:shortId', async (req, res) => {
 const { shortId } = req.params;
 const redisClient = getRedisClient(shortId);
 redisClient.get(shortId, (err, url) => {
 if (err || !url) {
 return res.status(404).send('URL not found');
 }
 res.redirect(url);
 });
});
app.listen(process.env.PORT, () => {
 console.log(`Server running on port ${process.env.PORT}`);
});

Như bạn có thể thấy trong đoạn mã này, chúng ta có:

  1. Băm nhất quán :

    • Chúng tôi phân phối khóa (URL rút ngắn) trên nhiều ứng dụng khách Redis bằng cách sử dụng hàm băm đơn giản.

    • Hàm băm đảm bảo rằng các URL được phân bổ đồng đều trên các phiên bản Redis.

  2. Rút ngắn URL :

    • /rút ngắn điểm cuối chấp nhận một URL dài và tạo ID ngắn bằng cách sử dụng shortid thư viện.

    • URL rút ngắn được lưu trữ ở một trong các phiên bản Redis bằng hàm băm của chúng tôi.

  3. Chuyển hướng URL :

    • /:shortId điểm cuối truy xuất URL gốc từ bộ đệm và chuyển hướng người dùng.

    • Nếu không tìm thấy URL trong bộ đệm, 404 phản hồi được trả về.

Bước 4:Thực hiện vô hiệu hóa bộ đệm

Trong ứng dụng thực tế, URL có thể hết hạn hoặc thay đổi theo thời gian. Để xử lý vấn đề này, chúng tôi cần triển khai vô hiệu hóa bộ đệm .

Thêm thời hạn vào URL được lưu trong bộ nhớ đệm

Hãy sửa đổi index.js của chúng tôi file để đặt thời gian hết hạn cho mỗi mục được lưu trong bộ nhớ đệm:

// Endpoint to shorten a URL with expiration
app.post('/shorten', async (req, res) => {
 const { url, ttl } = req.body; // ttl (time-to-live) is optional
 if (!url) return res.status(400).send('URL is required');
 const shortId = shortid.generate();
 const redisClient = getRedisClient(shortId);
 await redisClient.set(shortId, url, 'EX', ttl || 3600); // Default TTL of 1 hour
 res.json({ shortUrl: `http://localhost:${process.env.PORT}/${shortId}` });
});
  • TTL (Thời gian tồn tại) :Chúng tôi đặt thời gian hết hạn mặc định là 1 giờ cho mỗi URL rút ngắn. Bạn có thể tùy chỉnh TTL cho từng URL nếu cần.

  • Vô hiệu hóa bộ đệm :Khi TTL hết hạn, mục nhập sẽ tự động bị xóa khỏi bộ đệm.

Bước 5:Giám sát số liệu bộ đệm

Để theo dõi lần truy cập bộ đệmbỏ lỡ , chúng tôi sẽ thêm một số tính năng ghi nhật ký vào điểm cuối của mình trong index.js :

app.get('/:shortId', async (req, res) => {
 const { shortId } = req.params;
 const redisClient = getRedisClient(shortId);
 redisClient.get(shortId, (err, url) => {
 if (err || !url) {
 console.log(`Cache miss for key: ${shortId}`);
 return res.status(404).send('URL not found');
 }
 console.log(`Cache hit for key: ${shortId}`);
 res.redirect(url);
 });
});

Đây là những gì đang diễn ra trong mã này:

  • Lần truy cập bộ đệm :Nếu tìm thấy một URL trong bộ nhớ đệm thì đó là lỗi bộ nhớ đệm.

  • Bộ nhớ đệm bị thiếu :Nếu không tìm thấy URL thì đó là lỗi bộ nhớ đệm.

  • Việc ghi nhật ký này sẽ giúp bạn theo dõi hiệu suất của bộ nhớ đệm được phân phối.

Bước 6:Kiểm tra ứng dụng

  1. Bắt đầu phiên bản Redis của bạn :
docker start redis1 redis2 redis3
  1. Chạy máy chủ Node.js :
node index.js
  1. Kiểm tra điểm cuối sử dụng curl hoặc Người đưa thư:

    • Rút ngắn URL:

       POST http://localhost:3000/shorten
       Body: { "url": "https://example.com" }
      
    • Truy cập URL rút gọn:

       GET http://localhost:3000/{shortId}
      

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 dịch vụ rút ngắn URL có thể mở rộng với bộ nhớ đệm được phân phối sử dụng Node.js và Redis. Trong suốt hướng dẫn này, bạn đã học được cách:

  1. Triển khai băm nhất quán để phân phối các mục bộ đệm trên nhiều phiên bản Redis.

  2. Tối ưu hóa ứng dụng của bạn bằng chiến lược vô hiệu hóa bộ đệm để giữ cho dữ liệu luôn được cập nhật.

  3. Sử dụng Docker để mô phỏng môi trường phân tán với nhiều nút Redis.

  4. Giám sát các lần truy cập và bỏ lỡ bộ nhớ đệm để tối ưu hóa hiệu suất.

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

  • Thêm cơ sở dữ liệu :Lưu trữ URL trong cơ sở dữ liệu để duy trì lâu dài ngoài bộ nhớ đệm.

  • Triển khai phân tích :Theo dõi số lần nhấp chuột và phân tích cho các URL rút ngắn.

  • Triển khai lên đám mây :Triển khai ứng dụng của bạn bằng Kubernetes để tự động mở rộng quy mô và khả năng phục hồi.

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