Quay lại danh sách case study
Tối ưu hiệu năng khi lọc danh sách lớn ở Backend
Tình huống xử lý mảng dữ liệu lớn bằng JavaScript gây chậm phản hồi API.
Bối cảnh
Trong một hệ thống quản lý nhân sự, API trả về danh sách hàng chục ngàn nhân viên và thực hiện lọc dữ liệu trực tiếp trên RAM bằng các hàm như filter và map.
Vấn đề cần xử lý
Khi số lượng người dùng đồng thời tăng lên, CPU của máy chủ Node.js bị quá tải do JavaScript chạy đơn luồng (single-threaded), làm tăng thời gian phản hồi API lên vài giây.
Hướng xử lý đề xuất
Tôi đề xuất chuyển phần lọc dữ liệu nặng từ ứng dụng Node.js xuống tầng cơ sở dữ liệu bằng cách sử dụng câu lệnh truy vấn SQL tối ưu có phân trang (pagination).
Câu trả lời mẫu khi phỏng vấn
Dạ, vì Node.js chạy đơn luồng nên việc xử lý các mảng dữ liệu quá lớn trên RAM sẽ làm nghẽn event loop. Giải pháp của em là đẩy việc lọc và phân trang dữ liệu về phía Database bằng câu lệnh LIMIT và OFFSET, đồng thời chỉ trả về những trường dữ liệu thực sự cần thiết.
Trade-off
Việc này đòi hỏi viết lại câu lệnh SQL phức tạp hơn và tăng một chút tải cho database server, nhưng bù lại ứng dụng Node.js hoạt động mượt mà hơn rất nhiều.
Kết quả kỳ vọng
Thời gian phản hồi API giảm từ 2 giây xuống dưới 200 milliseconds, hệ thống ổn định ngay cả trong giờ cao điểm.
Bài học khi trả lời phỏng vấn
Tôi hiểu rằng không nên lạm dụng các phương thức mảng của JavaScript để xử lý lượng dữ liệu lớn mà cần tận dụng sức mạnh indexing và querying của database.