Quay lại danh sách case study
Xử lý sự cố tràn bộ nhớ trên hệ thống thanh toán hàng triệu giao dịch
Giải quyết bài toán tràn bộ nhớ định kỳ (OOM) trên dịch vụ thanh toán cốt lõi viết bằng Node.js trong mùa cao điểm mua sắm.
Bối cảnh
Hệ thống thanh toán xử lý hơn 5000 request mỗi giây trong đợt flash sale. Các pod Kubernetes liên tục bị khởi động lại do lỗi Out of Memory.
Vấn đề cần xử lý
Ứng dụng bị rò rỉ bộ nhớ nghiêm trọng trong module xử lý báo cáo giao dịch thời gian thực. Các mảng dữ liệu lớn được lưu trữ trong closure và bộ nhớ đệm cache nội bộ không có giới hạn kích thước.
Hướng xử lý đề xuất
Áp dụng cơ chế LRU Cache có giới hạn phần tử, tái cấu trúc việc đọc file log lớn bằng Async Iterators thay vì đọc toàn bộ vào bộ nhớ, và tích hợp Clinic.js HeapProfiler vào môi trường staging để khoanh vùng vị trí rò rỉ.
Câu trả lời mẫu khi phỏng vấn
Khi đối mặt với sự cố OOM trên hệ thống thanh toán, việc đầu tiên tôi làm là thiết lập cảnh báo APM và trích xuất heap dump từ pod bị lỗi để phân tích. Chúng tôi phát hiện một cache cục bộ lưu trữ trạng thái giao dịch không bao giờ được dọn dẹp. Tôi đã đề xuất thay thế bằng Redis có giới hạn TTL, đồng thời chuyển đổi việc xử lý file báo cáo lớn từ mảng thông thường sang stream bất đồng bộ. Kết quả là lượng RAM tiêu thụ ổn định ở mức 400MB thay vì tăng phi mã.
Trade-off
Việc sử dụng Redis làm cache tăng thêm độ trễ mạng nhỏ cho mỗi request nhưng đổi lại sự ổn định tuyệt đối và khả năng scale ngang cho tầng ứng dụng.
Kết quả kỳ vọng
Hệ thống vượt qua chiến dịch flash sale với 0% lỗi OOM, giảm độ trễ trung bình xuống 30% và cải thiện độ tin cậy của toàn bộ cụm dịch vụ.
Bài học khi trả lời phỏng vấn
Không bao giờ lưu trữ trạng thái vô hạn trong bộ nhớ ứng dụng Node.js (in-memory state) mà không có chính sách tự hủy hoặc giới hạn dung lượng rõ ràng.