CodeReady
Quay lại danh sách case study

Tối ưu hóa truy vấn bất đồng bộ đồng thời gây quá tải Database

Xử lý lỗi quá tải cơ sở dữ liệu khi gọi hàng loạt Promise.all lấy dữ liệu quan hệ.

Bối cảnh

Trong một API báo cáo doanh thu, hệ thống cần lấy dữ liệu của hàng nghìn cửa hàng cùng lúc bằng cách dùng Promise.all gọi đồng thời hàng nghìn câu lệnh truy vấn tới cơ sở dữ liệu PostgreSQL.

Vấn đề cần xử lý

Việc bắn ra hàng nghìn kết nối đồng thời làm cạn kiệt connection pool của cơ sở dữ liệu, dẫn đến lỗi kết nối timeout và làm sập cả hệ thống backend.

Hướng xử lý đề xuất

Chúng tôi áp dụng kỹ thuật batching và phân đoạn (chunking) kết hợp thư viện giới hạn độ đồng thời như p-limit để chỉ thực hiện tối đa một số lượng query nhất định tại một thời điểm.

Câu trả lời mẫu khi phỏng vấn

Khi đối mặt với việc quá tải DB do Promise.all gọi quá nhiều request song song, tôi đã áp dụng giải pháp chia nhỏ mảng dữ liệu thành các batch nhỏ hơn và giới hạn độ đồng thời bằng p-limit, giúp cân bằng giữa tốc độ xử lý và khả năng chịu tải của database.

Trade-off

Thời gian hoàn thành toàn bộ tác báo cáo sẽ lâu hơn một chút so với việc bắn tất cả cùng lúc, nhưng đổi lại cơ sở dữ liệu an toàn và không bị sập.

Kết quả kỳ vọng

Hệ thống báo cáo chạy ổn định, không còn lỗi connection timeout và tận dụng tối ưu tài nguyên phần cứng sẵn có.

Bài học khi trả lời phỏng vấn

Sức mạnh của bất đồng bộ trong JavaScript rất lớn, nhưng luôn phải kiểm soát độ đồng thời (concurrency) khi giao tiếp với các tài nguyên hữu hạn như Database hay Third-party API.