5 mẹo hiệu suất thực tế cho Express.js REST API
Việc áp dụng nhanh chóng kiến trúc microservice đã củng cố vai trò của API là phương tiện giao tiếp chính cho sự phát triển hiện đại. API cung cấp phương tiện trao đổi dữ liệu hiệu quả giữa máy khách và ứng dụng phía máy chủ, cũng như giữa các hệ thống phụ trợ khác nhau.
Express.js cung cấp một giải pháp tinh tế để xây dựng API RESTful. Nhưng điều cần thiết là ưu tiên các biện pháp hiệu suất trong suốt quá trình phát triển.
Điều này đảm bảo rằng các API của bạn không chỉ hoạt động hiệu quả mà còn hoạt động tối ưu. Cuối cùng, một ứng dụng web hoạt động tốt sẽ mang lại trải nghiệm người dùng tốt hơn và cơ hội thành công cao hơn.
Mục Lục
Tối ưu hóa hiệu suất cho Express.js REST API
Express.js sử dụng bản chất không đồng bộ và kiến trúc hướng sự kiện của Node.js để đạt được mức tốc độ và hiệu suất vượt trội.
Tuy nhiên, việc tối ưu hóa các API REST của Express.js có thể mang lại nhiều lợi ích hơn nữa. Chúng bao gồm thời gian phản hồi được cải thiện đáng kể, độ tin cậy được nâng cao và hiệu quả của các ứng dụng của bạn tăng lên, dẫn đến trải nghiệm người dùng liền mạch và hấp dẫn.
Bằng cách ưu tiên hiệu suất của API, bạn mở đường cho sự thành công của toàn bộ phần mềm của mình.
Dưới đây là một số mẹo bạn có thể sử dụng để nâng cao hiệu suất của các API REST của mình.
1. Tối ưu hóa truy vấn cơ sở dữ liệu
Việc truy xuất và thao tác dữ liệu từ cơ sở dữ liệu một cách hiệu quả có thể tác động đáng kể đến hiệu suất của các API REST.
Bằng cách tối ưu hóa các truy vấn cơ sở dữ liệu, bạn có thể giảm đáng kể thời gian thực hiện truy vấn và cắt giảm mức tiêu thụ tài nguyên. Điều này cuối cùng sẽ nâng cao hiệu suất của toàn bộ ứng dụng Express.js của bạn.
Dưới đây là một số mẹo hữu ích để tối ưu hóa các truy vấn cơ sở dữ liệu.
- Sử dụng chỉ mục cơ sở dữ liệu. Xác định các cột thường được sử dụng trong các truy vấn và tạo các chỉ mục thích hợp trên các cột đó. Điều này cho phép công cụ cơ sở dữ liệu nhanh chóng xác định vị trí và truy xuất dữ liệu cần thiết, dẫn đến việc thực hiện truy vấn nhanh hơn.
- Thực hiện phân trang. Khi xử lý các tập dữ liệu lớn, hãy sử dụng phân trang. Thay vì tìm nạp tất cả dữ liệu cùng một lúc, hãy giới hạn lượng dữ liệu được trả về trong mỗi truy vấn.
- Tránh các truy vấn dư thừa. Phân tích mã của bạn, xác định và bỏ qua mọi truy vấn dư thừa. Tái cấu trúc các truy vấn của bạn cho phù hợp có thể dẫn đến cải thiện hiệu suất đáng kể.
2. Sử dụng bộ nhớ đệm xuyên suốt ứng dụng của bạn
Bộ nhớ đệm là một kỹ thuật được sử dụng để lưu trữ dữ liệu được truy cập thường xuyên trong bộ đệm, một hệ thống lưu trữ tạm thời. Nói một cách đơn giản, khi máy khách yêu cầu dữ liệu, máy chủ sẽ kiểm tra bộ đệm của nó trước thay vì truy vấn trực tiếp cơ sở dữ liệu.
Nếu nó tìm thấy dữ liệu được yêu cầu trong bộ đệm, nó sẽ trả về dữ liệu đó ngay lập tức, bỏ qua nhu cầu xử lý thêm hoặc truy cập cơ sở dữ liệu thực tế. Điều này cải thiện đáng kể hiệu suất của API bằng cách giảm thời gian phản hồi và giảm thiểu tải cho ứng dụng, đặc biệt là khi xử lý nhiều truy vấn.
Đây là một ví dụ mã đơn giản minh họa cách triển khai bộ nhớ đệm.
const express = require('express');
const NodeCache = require('node-cache');const cache = new NodeCache();
const app = express();
app.get('/api/data', (req, res) => {
const cacheKey = 'data';
const cachedData = cache.get(cacheKey);
if (!cachedData) {
const fetchedData = fetchDataFromDatabase();
cache.set(cacheKey, fetchedData);
cachedData = fetchedData;
}
res.json(cachedData);
});
function fetchDataFromDatabase() {
return data;
}
Đoạn mã trên minh họa cách hoạt động của bộ nhớ đệm bằng thư viện nút-cache. Ban đầu, nó kiểm tra xem dữ liệu được yêu cầu đã được lưu trữ trong bộ đệm chưa. Nếu không có dữ liệu, nó sẽ kích hoạt chức năng tìm nạp dữ liệu từ cơ sở dữ liệu, sau đó, lưu trữ dữ liệu đã tìm nạp vào bộ đệm. Cuối cùng, trả về dữ liệu được yêu cầu cho máy khách dưới dạng phản hồi JSON.
3. Kích hoạt tính năng nén HTTP
Nén HTTP là kỹ thuật bạn có thể sử dụng để giảm kích thước dữ liệu được truyền giữa máy khách và máy chủ. Nó liên quan đến việc nén các phản hồi API ở phía máy chủ và giải nén chúng ở phía máy khách.
Bằng cách bật tính năng nén HTTP, kích thước của tải trọng phản hồi có thể giảm đáng kể, dẫn đến thời gian phản hồi nhanh hơn.
Đây là một ví dụ về mã minh họa cách kích hoạt tính năng nén HTTP bằng cách sử dụng nén phần mềm trung gian.
express = require('express');
const compression = require('compression');const app = express();
app.use(compression());
app.get('/api/data', (req, res) => {
});
Đoạn mã này sử dụng phần mềm trung gian để nén các phản hồi API trước khi trả về ứng dụng khách.
4. Triển khai xử lý song song bằng Promise.all
xử lý song song sử dụng Lời hứa.all phương pháp là một kỹ thuật được sử dụng để cải thiện hiệu suất của API bằng cách thực thi đồng thời nhiều tác vụ không đồng bộ.
Bằng cách tận dụng sức mạnh của các lời hứa JavaScript, Promise.all cho phép bạn thực hiện đồng thời một tập hợp các lời hứa, thay vì đợi từng lời hứa giải quyết theo trình tự.
Kỹ thuật này đặc biệt hữu ích khi bạn có các tác vụ độc lập có thể chạy đồng thời, chẳng hạn như thực hiện nhiều yêu cầu API liên quan đến các điểm cuối khác nhau. Bằng cách thực hiện song song các tác vụ này, bạn có thể giảm đáng kể thời gian thực hiện tổng thể và cải thiện khả năng phản hồi của API.
Đây là một ví dụ mã đơn giản minh họa cách triển khai xử lý song song bằng Promise.all.
const express = require('express');
const axios = require('axios');const app = express();
app.get('/api/data', async (req, res) => {
try {
const request1 = axios.get('https://api.example.com/endpoint1');
const request2 = axios.get('https://api.example.com/endpoint2');
const request3 = axios.get('https://api.example.com/endpoint3');
const [response1, response2, response3] = await Promise.all([
request1,
request2,
request3
]);
} catch (error) {
res.status(500).json({ error: 'error' });
}
});
Trong ví dụ này, mã tạo các yêu cầu API tới ba điểm cuối khác nhau. Bằng cách sử dụng hàm Promise.all, chuyển qua một loạt các lời hứa, mã sẽ đợi tất cả các lời hứa hoàn thành trước khi trả về các phản hồi trong một mảng.
Khi bạn đã nhận được tất cả các phản hồi, bạn có thể xử lý chúng theo yêu cầu. Tuy nhiên, bạn nên cẩn thận với phương pháp này và tránh sử dụng quá mức, vì nó có thể làm quá tải máy chủ gây tắc nghẽn phản hồi API.
5. Sử dụng tổng hợp kết nối cơ sở dữ liệu
Tổng hợp kết nối cơ sở dữ liệu là một phương pháp liên quan đến việc tạo một nhóm các kết nối cơ sở dữ liệu có thể tái sử dụng để xử lý nhiều yêu cầu của khách hàng một cách hiệu quả.
Thay vì thiết lập kết nối mới cho từng yêu cầu, ứng dụng sẽ sử dụng lại các kết nối hiện có từ nhóm, giảm chi phí thiết lập kết nối mới, giúp thực thi truy vấn nhanh hơn và hiệu quả hơn.
Đây là một ví dụ mã ngắn trình bày cách sử dụng kết nối cơ sở dữ liệu tổng hợp với Mongoose trong ứng dụng Express.js.
const mongoose = require('mongoose');
const { connection } = require('mongoose');const connectionOptions = {
poolSize: 10,
useNewUrlParser: true,
useUnifiedTopology: true
};
mongoose.connect('mongodb://localhost/mydatabase', connectionOptions);
Trong ví dụ này, thuộc tính kích thước nhóm kết nối được đặt thành 10—điều này chỉ định số lượng kết nối tối đa trong nhóm.
Bằng cách đặt cấu hình này, API có thể sử dụng lại các kết nối, giúp cải thiện hiệu suất API bằng cách giảm chi phí thiết lập kết nối mới cho từng yêu cầu.
Ưu tiên hiệu suất API để kiếm lợi nhuận
Bạn có thể thực hiện một số bước để tối ưu hóa hiệu suất của các API Express.js của mình. API đóng một vai trò quan trọng, do đó, điều cần thiết là bạn phải tập trung vào hiệu suất của chúng để đảm bảo thành công chung cho phần mềm của bạn.