Thứ tư, 09/04/2025 Ngọc Hân
Mytel Reverse Auction - Error: NJS-040: connection request timeout
Dịch vụ Mytel Reverse Auction
Error: NJS-040: connection request timeout. Request exceeded queueTimeout of 10000
1. Mô tả lỗi
Khi dịch vụ có lượng truy cập đột biến, nhiều khách hàng truy cập cùng 1 thời điểm thì xuất hiện lỗi này khiến cho web dịch vụ của 1 số khách hàng bị lỗi, chậm, không lấy được dữ liệu từ API để hiển thị.
2. Phạm vi ảnh hưởng
Các chức năng gọi lên API lấy dữ liệu trực tiếp từ database: Đăng nhập (Username/Password, OTP, Auto), Thông tin user, Số lượt bid, Chơi sự kiện
3. Nguyên nhân
Có 4 nguyên nhân chính dẫn đến lỗi này:
- Dùng thư viện kết nối database phiên bản cũ (Release năm 2022).
- Cấu hình kết nối database, cụ thể là tham số poolMax đang quá nhỏ.
- Server API hiện tại đang chạy 2 node chưa đủ đáp ứng khi lượng truy cập đột biến.
- Phần đăng nhập có nhiều kết nối trực tiếp đến database (Nhiều nhất là 8 query - Thấp nhất là 6 query)
5. Phương án xử lý
Dựa theo các nguyên nhân gây ra lỗi thì có các phương án xử lý như sau:
- Nâng cấp thư viện kết nối database lên phiên bản mới nhất (fix nhiều bug và cải tiến performance).
- Tăng cấu hình poolMax lên 100. Giúp API xử lý được nhiều kết nối hơn.
- Dùng pm2 cluster tạo ra nhiều process song song (đa nhân CPU): Tận dụng tối đa core CPU, Load balancing nội bộ, tăng hiệu năng và tính khả dụng cao.
- Tối ưu lại code đăng nhập: Lưu dữ liệu user đăng nhập vào redis, gộp các query cùng cấu trúc thành 1 query tổng giúp giảm kết nối tới database, lưu thêm dữ liệu đánh dấu vào redis để lần sau khách hàng đăng nhập không gọi thẳng vào database.
6. Bài học rút ra
- Dev cần chú ý hơn về cách xử lý logic khi kết nối trực tiếp với database, tránh sử dụng query tràn làn, thừa thãi.
- Cần test tải, hiệu suất cho các chức năng thêm mới hoặc chức năng mới tối ưu lại để tránh bỏ sót trường hợp mạng chậm hoặc nhiều người sử dụng cùng thời điểm.
- Thường xuyên theo dõi, kiểm tra website dịch vụ, báo cáo, thống kê để phát hiện bất thường và xử lý (nếu có).