Quay lại danh sách case study
Xử lý nghẽn CPU khi xử lý JSON payload lớn trên API Gateway
Tối ưu hóa dịch vụ API Gateway Node.js bị đơ khi nhận payload JSON dung lượng lớn từ client.
Bối cảnh
Hệ thống của chúng tôi dùng Node.js làm API Gateway nhận dữ liệu từ các đối tác. Khi đối tác gửi lên các file JSON khổng lồ khoảng 50MB, server liên tục bị treo và không nhận request mới.
Vấn đề cần xử lý
Hàm JSON.parse() là một tác vụ đồng bộ nặng về CPU. Khi phân tích một chuỗi JSON 50MB, luồng chính của Node.js bị chiếm dụng hoàn toàn, gây ra hiện tượng nghẽn Event Loop.
Hướng xử lý đề xuất
Chúng tôi chuyển sang sử dụng thư viện streaming JSON parser (như stream-json) để phân tích dữ liệu theo từng mảnh, đồng thời giới hạn kích thước payload tối đa ở tầng Nginx và cấu hình phân rã tác vụ nặng sang Worker Threads.
Câu trả lời mẫu khi phỏng vấn
Khi gặp tình trạng này, nguyên nhân chính là JSON.parse chặn luồng chính. Giải pháp của tôi là không parse toàn bộ một lần mà dùng stream để đọc dữ liệu từng phần, hoặc đưa việc phân tích sang Worker Thread. Ngoài ra, cần thiết lập giới hạn payload ngay từ tầng Nginx để bảo vệ ứng dụng.
Trade-off
Việc dùng stream làm tăng độ phức tạp của code xử lý và khó debug hơn một chút so với gọi JSON.parse trực tiếp, nhưng đổi lại hệ thống cực kỳ ổn định và không bị nghẽn.
Kết quả kỳ vọng
Ứng dụng hoạt động mượt mà, không còn hiện tượng rớt request khi đối tác gửi dữ liệu lớn, thời gian phản hồi trung bình giảm 60%.
Bài học khi trả lời phỏng vấn
Không bao giờ thực hiện các tác vụ xử lý chuỗi hoặc tính toán nặng đồng bộ trên luồng chính của Node.js nếu dữ liệu lớn hơn vài MB.