2013-06-05 44 views
21

node.js có thể mở rộng, điều đó có nghĩa là gì? Phần nào của máy chủ node.js có thể mở rộng được. Tôi đọc rằng nó là một công nghệ đơn luồng không thích hợp cho các ứng dụng cần nhiều tài nguyên CPU. Những sự kiện này không phù hợp với khả năng mở rộng, vậy điều đó có nghĩa là gì?Tại sao Node.js có thể mở rộng?

+0

Bản sao của: [Scaling node.js] (http://stackoverflow.com/questions/4710420/scaling-node-js). –

+0

@ Jason Tôi không tìm kiếm các câu trả lời mã hóa kỹ thuật – vuvu

+1

Bài đăng đó làm nổi bật khả năng mở rộng, bao gồm cân bằng tải và redis. –

Trả lời

15

Nút javascript chạy là luồng đơn, nhưng rất nhiều thứ bạn gọi trong nút - chẳng hạn như mạng hoặc tệp io - chạy trong chủ đề nền. Xem bài đăng này cho một cái nhìn tổng quan cơ bản: Node is not single threaded

Nếu bạn cần các chi tiết gritty, bạn nên xem xét libuv đó là 'ma thuật' mảnh chuyển đổi chủ đề thành sự kiện bẹ: http://nikhilm.github.io/uvbook/basics.html#event-loops

Ngoài ra, nếu bạn cần để làm một cái gì đó CPU chuyên sâu trong nút chính nó, bạn có thể dễ dàng gửi này cho một quá trình con - xem http://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options để biết chi tiết

+0

Các hoạt động như đọc từ cơ sở dữ liệu hoặc cập nhật chúng, chặn hoặc không chặn? Đây là w.r.t đến RDBMS. Bạn có đề xuất Nút cho các ứng dụng như vậy không? – LearningToCode

2

có thể mở rộng do cân bằng tải. Về cơ bản bạn có thể có nhiều công việc cho nút để xử lý và nó có thể xử lý nó mà không có gánh nặng đáng kể. Điều này làm cho nó có thể mở rộng.

+6

Cân bằng tải được thực hiện như thế nào? – vuvu

3

Đó không phải là khả năng mở rộng hơn "mỗi lần". Tất cả những gì bạn làm là (I/O) có thể mở rộng mà không phải làm gì đặc biệt.

I/O an toàn hơn và dễ dàng hơn để làm song song, vì nó có xu hướng không chia sẻ dữ liệu giữa các chuỗi thực thi. Node.js cho phép bạn làm điều đó bằng cách sử dụng lập trình sự kiện đơn giản, thanh lịch và dễ sử dụng. Là một mô hình lập trình cũ và đã được chứng minh, được sử dụng trong nhiều năm qua GUI và các ứng dụng đồ họa chuyên sâu khác như trò chơi chẳng hạn.

Trên thực tế ít khả năng mở rộng hơn các ngôn ngữ chính thức như C++, c, java, v.v. có thể mở rộng tốt hơn nhiều nhờ sử dụng đa luồng đầy đủ. Điều này cho phép để quy mô CPU quá, nhưng cũng mở ra một thể của sâu. Để chia sẻ CPU, bạn phải chia sẻ dữ liệu và đó là một câu chuyện khác (semaphores, locks, etc ...)

Bạn có thể làm giống như node.js với bất kỳ ngôn ngữ nào ở trên, nhưng không phải là một phần của chính ngôn ngữ đó, vì vậy bạn phải tự cuộn hoặc sử dụng các thư viện cung cấp cho bạn. Điều đó nói rằng, không phải là khó, nhưng chắc chắn khó hơn trong node.js.

Hầu hết các dịch vụ web, đều bị ràng buộc IO, vì vậy Node.js phù hợp tốt và là Ok đối với hầu hết các trường hợp. Nhưng một khi bạn bắt đầu sử dụng CPU làm việc chuyên sâu, các sự kiện không được phục vụ và tất cả các điểm dừng. Trong trường hợp đó, hãy sử dụng ngôn ngữ khác tốt hơn. Không có giải pháp tốt nào ở Node cho điều đó. Bạn có thể sinh ra nhiều quy trình, nhưng sau đó bạn sẽ không thể chia sẻ dữ liệu giữa chúng. Nếu không có dữ liệu chia sẻ, không có cách nào để mở rộng CPU hiệu quả, vì vậy tốt hơn không nên thử.

Sử dụng Node.js cho IO và một số ngôn ngữ phù hợp hơn với đa luồng thích hợp cho công việc chuyên sâu của CPU.

0

Tất cả các API của nút được viết là cách chúng hỗ trợ gọi lại.

Ví dụ: chức năng đọc tệp có thể bắt đầu đọc tệp và trả về điều khiển cho môi trường thực thi một cách vô cùng để có thể thực hiện lệnh tiếp theo. Khi tệp I/O hoàn tất, nó sẽ gọi hàm gọi lại trong khi truyền hàm gọi lại, nội dung của tệp dưới dạng tham số. Vì vậy, không có ngăn chặn hoặc chờ đợi cho File I/O. Điều này làm cho Node.js có khả năng mở rộng cao, vì nó có thể xử lý số lượng yêu cầu cao mà không cần đợi bất kỳ hàm nào trả về kết quả. - Hướng dẫn của điểm.

Các vấn đề liên quan