How I Handled 5GB+ File Uploads Without Breaking My Node.js Server
Khi người dùng bắt đầu tải lên file vượt 5GB qua tính năng đính kèm trong Slack, máy chủ Node.js đang dùng middleware body‑parser mặc định cố gắng đọc toàn bộ payload vào RAM, khiến bộ nhớ tăng đột ngột và process bị kill khi vượt quá giới hạn heap. Nguyên nhân kỹ thuật là việc không sử dụng streaming parser, vì mỗi kết nối tiêu tốn khoảng 5–6 GB RAM trong thời gian xử lý upload, làm giảm khả năng xử lý song song và gây ra timeout cho các request khác. Hệ quả là server thường xuyên restart, perda dữ liệu upload chưa hoàn thành và thời gian phản hồi tăng lên tới 30 giây cho các truy vấn API bình thường. Để khắc phục, tác giả đã thay body‑parser bằng busboy (hoặc multiparty) và pipe dữ liệu trực tiếp vào một file tạm trên đĩa hoặc vào multipart upload của Amazon S3, đồng thời đặt giới hạn kích thước phần qua highWaterMark và bật chế độ tự động dọn dẹp file tạm sau khi hoàn thành. Bài học là đối với file lớn hơn vài trăm MB, Node.js không nên đọc toàn bộ payload vào bộ nhớ; thay vào đó, cần sử dụng streaming, lưu trữ tạm hoặc truyền trực tiếp tới dịch vụ lưu trữ đối tượng, và nếu cần xử lý sau upload thì offload sang worker thread hoặc dịch vụ nền.



