2011-11-16 14 views
5

Với nodej, hoặc eventlet hoặc bất kỳ máy chủ không chặn khác, điều gì sẽ xảy ra khi một yêu cầu nhất định mất nhiều thời gian, sau đó có chặn tất cả các yêu cầu khác không?Điều gì sẽ xảy ra khi một yêu cầu duy nhất mất nhiều thời gian với các máy chủ io không chặn này?

Ví dụ, yêu cầu đến và mất 200ms để tính toán, điều này sẽ chặn các yêu cầu khác từ ví dụ: nodejs sử dụng một chuỗi đơn.

Có nghĩa là 15K/giây của bạn sẽ giảm đáng kể b/c trong thời gian thực tế cần để tính toán phản hồi cho một yêu cầu nhất định.

Nhưng điều này dường như sai với tôi, vì vậy tôi hỏi những gì thực sự xảy ra vì tôi không thể tưởng tượng đó là cách mọi thứ hoạt động.

Trả lời

1

Bạn chính xác. Các nhà phát triển Nodejs phải nhận thức được điều đó hoặc ứng dụng của họ sẽ hoàn toàn không thực hiện được, nếu mã chạy dài không phải là không đồng bộ.

Mọi thứ cần thực hiện 'lâu dài' cần được thực hiện không đồng bộ.

1

Mọi thứ trong node.js chạy song song trong nội bộ. Tuy nhiên, mã của riêng bạn chạy đúng serially. Nếu bạn ngủ một giây trong node.js, máy chủ sẽ ngủ trong một giây. Nó không thích hợp cho các yêu cầu đòi hỏi nhiều tính toán. I/O là song song, và mã của bạn làm I/O thông qua callbacks (vì vậy mã của bạn không chạy trong khi chờ I/O).

Trên hầu hết các nền tảng hiện đại, node.js hiện chủ đề của chúng tôi cho I/O. Nó sử dụng libev, sử dụng các chủ đề hoạt động tốt nhất trên nền tảng.

+0

Có một lời giải thích tuyệt vời [ở đây] (http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/) về cơ bản những gì bạn đã nói, nhưng giải thích thêm một chút. –

1

Điều này về cơ bản là đúng, ít nhất là nếu bạn không sử dụng tính năng cluster mới cân bằng các kết nối đến giữa nhiều công nhân được tạo tự động. Tuy nhiên, nếu bạn sử dụng nó, hầu hết các yêu cầu khác sẽ vẫn hoàn thành nhanh chóng.

Chỉnh sửa: Công nhân là các quy trình.

1

Bạn có thể nghĩ vòng lặp sự kiện là 10 người đang chờ xếp hàng để thanh toán hóa đơn của họ. Nếu ai đó đang tiến hành quá nhiều thời gian thanh toán hóa đơn của mình (do đó ngăn chặn vòng lặp sự kiện), những người khác sẽ chỉ phải treo xung quanh chờ đến lượt của mình để đi .. và chờ đợi ...

In other words:

Vì vòng lặp sự kiện đang chạy trên một chuỗi đơn, rất quan trọng là chúng tôi không chặn thực thi bằng cách thực hiện các phép tính nặng trong chức năng gọi lại hoặc I/O đồng bộ. Đi qua một bộ sưu tập lớn các giá trị/đối tượng hoặc thực hiện các tính toán tốn thời gian trong hàm gọi lại ngăn vòng lặp sự kiện từ tiếp tục xử lý các sự kiện khác trong hàng đợi.

6

Có hay không "chặn" phụ thuộc vào định nghĩa của bạn về "chặn". Thông thường block có nghĩa là CPU của bạn về cơ bản là nhàn rỗi, nhưng thread hiện tại không thể làm bất cứ điều gì với nó bởi vì nó đang chờ I/O hoặc tương tự. Đó là loại điều không có xu hướng xảy ra trong node.js trừ khi bạn sử dụng các chức năng I/O đồng bộ không được khuyến nghị. Thay vào đó, các hàm trả về một cách nhanh chóng và khi nhiệm vụ I/O mà chúng bắt đầu hoàn thành, hàm gọi lại của bạn được gọi và bạn lấy nó từ đó. Trong thời gian này, các yêu cầu khác có thể được xử lý.

Nếu bạn đang làm một cái gì đó tính toán nặng trong nút, không có gì khác sẽ có thể sử dụng CPU cho đến khi nó được thực hiện, nhưng vì một lý do rất khác nhau: CPU thực sự bận rộn. Thông thường, đây không phải là những gì mọi người có ý nghĩa khi họ nói "chặn", thay vào đó, nó chỉ là một tính toán dài.

200ms là một thời gian dài cho việc cần thực hiện nếu nó không liên quan đến I/O và hoàn toàn là tính toán. Đó có lẽ không phải là thứ bạn nên làm trong nút, thành thật mà nói. Một giải pháp nhiều hơn trong tinh thần của nút sẽ là có loại đó crunching xảy ra trong một (không javascript) chương trình được gọi là bởi nút, và gọi callback của bạn khi hoàn thành. Giả sử bạn có một máy đa lõi (hoặc chương trình khác đang chạy trên một máy tính khác), nút có thể tiếp tục đáp ứng các yêu cầu trong khi chương trình khác lại bị bẻ khóa.

Có những trường hợp cụm (như những người khác đã đề cập) có thể hữu ích, nhưng tôi nghi ngờ bạn thực sự là một trong số đó. Các cụm thực sự được tạo ra khi bạn có rất nhiều và rất nhiều yêu cầu cùng nhau nhiều hơn một lõi của CPU có thể xử lý, không phải cho trường hợp bạn có các yêu cầu đơn lẻ mất hàng trăm mili giây.