Hỏi cách khắc phục lỗi Blocking the event loop (chặn sự kiện lặp)



  • Em có đọc qua 1 bài viết 10 Lỗi thường gặp khi lập trình Node.js
    Trong đó có lỗi đầu tiên mà bài viết đề cập là Blocking the event loop (chặn sự kiện lặp), lỗi này trong trường hợp Node.js có hàng ngàn máy khách kết nối tới có thể chặn vòng lặp, khiến cho tất cả các máy khách khác phải chờ.

    Vậy hướng giải quyết khắc phục cho vấn đề này là như thế nào ạ.
    Vì trang của e thiết kế là khi 1 người dùng đăng nhập, Server sẽ lấy dữ liệu session để Query vào DB lấy ra (Danh sách bạn bè, dòng thời gian, tất cả thông báo, ảnh đại diện....nói chung là lấy ra rất nhiều thứ), sau khi lấy xong mới đưa dữ liệu này về phía ClientReder ra trang index.

    Tính tổng thời gian e lấy ví dụ để lấy hết đống dữ liệu đó và render ra cho 1 người hết 1s,
    vậy nếu có 2 người cùng đăng nhập thì người thứ 2 sẽ phải đợi là 2s mới có thể render ra index.

    Mong mọi người cho e hướng giả quyết và các khắc phục lỗi này với ạ



  • Giảm xử lý CPU của event xuống. Ví dụ của bạn có vẻ k hợp với lỗi này (cái thời gian để lấy data k hề bị block nha). Lỗi này say ra khi bên trong event có nhiều xử lý (vòng lặp). Đầu vào của event queue từ API nhanh hơn đầu ra từ event queue vào callstack



  • https://stackoverflow.com/questions/33768726/blocking-event-loop
    cách này chuyển 1 phần của xử lý xuống eventqueue bằng setTimeout 0



  • Blocking the event loop: nghĩa là bạn nên tránh chạy đoạn lệnh mà nó cần quá nhiều thời gian để xử lý, bởi vì NodeJS là luồng đơn khi một hàm hay một đoạn lệnh chiếm CPU để xử lý thì tất cả các request đến sẽ bị tạm dừng có thể tạm dừng rất lâu và gây request timeout. Tốt nhất là tìm cách chia nhỏ việc xử lý theo cơ chế bất đồng bộ.



  • bạn cứ gọi các hàm bất đồng bộ và sử dụng callback để hứng kết quả. đối với các vòng lặp thì nên sử dụng async để thực hiện lặp bất đồng bộ ('async.each()')



  • Bạn hãy code thử xem sao. Mình đoán là server vẫn phục vụ bình thường. Request của người thứ 2 sẽ không phải chờ người thứ nhất thực hiện xong mới được xử lý. Bởi vì thời gian delay trong trường hợp của bạn, theo mình thấy là do mất t.g truy vấn dữ liệu chứ không phải là do độ phức tạp/độ lớn của thuật toán chạy trên NodeJS. Việc block sẽ không có hoặc gần như không cảm nhận được. Tất nhiên là trừ khi có rất nhiều client truy cập đồng thời đến server của bạn. Khi đó giải pháp là nâng cấp phần cứng thôi, hoặc sử dụng các kĩ thuật phân tán, chia tải.

    • . ^
    0


  • @Anh-Anh-Tran222 Bạn có thể debug bằng hậu tố --trace-warnings --trace-sync-io để tìm các module, đoạn code chặn sự kiện. Cố gắng loại bỏ các module, đoạn code chặn sự kiện càng nhiều càng tốt.
    Với nodejs ít có chuyện người sau phải đợi người trc lắm. Bạn google về http request diagram của node xem, bạn sẽ thấy rõ điều đó.


Log in to reply