2012-05-12 28 views
5

Tôi biết Node.js là tốt trong việc giữ số lượng lớn các kết nối liên tục đồng thời, ví dụ, một phòng trò chuyện cho nhiều chatter.nodejs - Tại sao Node.js có thể xử lý số lượng lớn các kết nối liên tục đồng thời?

Tôi tự hỏi làm thế nào nó đạt được điều này. Tôi có nghĩa là dù sao nó được sử dụng TCP/IP được đóng gói bởi hệ điều hành cơ bản, tại sao nó có thể xử lý các kết nối liên tục rất tốt mà những người khác không thể?

Điều ma thuật là gì?

+5

@MartinJames: Tôi nghĩ rằng chúng tôi đã rời khỏi thời điểm JS là miền của kiddies tập lệnh. Không cần snide ngôn ngữ nhận xét. – Amadan

+0

@Amadan Câu hỏi OP sắp được xúc tiến kinh doanh. Nó không giống như 'Một câu hỏi thực tế, có thể trả lời dựa trên những vấn đề thực tế phải đối mặt', (faq). Một nhận xét về ngôn ngữ có vẻ thích hợp. Tôi đã không downvote nó hoặc bỏ phiếu để đóng vì có một cơ hội mà nó là một câu hỏi chính hãng. –

+0

@MartinJames: Không, nếu bạn cảm thấy một câu hỏi không thuộc về SO, một con trỏ đến một câu hỏi thường gặp là thích hợp, không phải vậy. Bạn đã trả lời cùng một cách nếu câu hỏi là về [node.cs] (https://github.com/Rduerden/Node.cs), tất cả những thứ khác bằng nhau? – Amadan

Trả lời

6

Node.js làm cho tất cả I/O không đồng bộ. Nó chỉ chạy trong một chuỗi duy nhất, nhưng sẽ thực hiện các yêu cầu hoặc hoạt động khác trong khi chờ I/O.

Ngược lại, các máy chủ web cổ điển sẽ không phục vụ yêu cầu khác cho đến khi yêu cầu trước đó hoàn tất. Vì lý do này, Apache chạy một số quy trình cùng một lúc; giả sử có 10 httpd quy trình, điều đó thường có nghĩa là 10 yêu cầu có thể được phân phối cùng một lúc (*). Nếu quá trình mất nhiều thời gian hơn để hoàn thành, bạn sẽ phục vụ ít yêu cầu hơn - hoặc sẽ phải sinh ra nhiều quy trình hơn, ngay cả khi quá trình này không làm gì - như chờ cơ sở dữ liệu nhai và trả về dữ liệu.

Quy trình node.js, phải đối mặt với yêu cầu sẽ chuyển đến cơ sở dữ liệu, để cơ sở dữ liệu hoạt động trong khi nó đi để phục vụ một yêu cầu khác.

*) MPM làm cho điều này không hoàn toàn đúng, nhưng đủ cho tất cả các mục đích và mục đích.

+1

Tôi rất tò mò rằng nếu Node.js chỉ sử dụng IO không chặn, thì tại sao những người khổng lồ khác như Apache không thể tạo ra một thứ không bị chặn như vậy? Tại sao httpd không được sửa đổi thành loại khung này? và có thể họ? –

+1

Bảo mật. Apache làm những gì nó làm tốt; cô lập yêu cầu của nhau là một phần của nó. Tuy nhiên, bất cứ khi nào bạn không muốn yêu cầu bị cô lập, Apache không xử lý nó rất tốt; mặc dù Phusion Passenger và FastCGI giúp đỡ. Ghi nhớ: Apache chủ yếu phục vụ các trang tĩnh; mọi thứ khác đi qua CGI, hoặc thông qua các plugin (mô-đun Apache). Do đó, tối ưu hóa Apache cho I/O giống như tối ưu hóa ngỗng để kéo xe. (Mặt khác, khi nói về Ruby hoặc Python, cả hai có thể thực hiện cùng một điều node.js thông qua các thư viện asynch tương ứng của chúng - EventMachine hoặc Twisted.) – Amadan

0

Vâng, điều là hầu hết các máy chủ web (như apache vv ..) hoạt động bằng cách sử dụng tạo luồng, trong đó chúng xoay một luồng mới cho mọi yêu cầu HTTP đến. các chủ đề này đồng bộ và chặn trong tự nhiên => có nghĩa là chúng sẽ thực thi mã theo thứ tự được viết và mọi tính toán tiếp theo sẽ bị chặn bởi I/O hiện tại hoặc nhiệm vụ tính toán. Giống như nếu bạn muốn nghe một sự kiện như trò chuyện, bạn cần phải có một chuỗi chuyên dụng cho mỗi người dùng (mỗi người dùng là cần thiết để duy trì kết nối liên tục, có rất ít kỹ thuật tối ưu hóa nhưng bạn vẫn có thể giả định chủ đề người dùng) nghe sự kiện này và chủ đề này sẽ bị chặn chờ sự kiện này xảy ra. Vì vậy, đối với mọi chủ đề sinh sản và chặn máy chủ web

Javascript, mặt khác không bị chặn (và dẫn đến mã không đồng bộ) theo tự nhiên => tại đây bạn đăng ký gọi lại cho một sự kiện và bất cứ khi nào xảy ra một số chức năng gọi lại sẽ được thực hiện. Nó sẽ không chặn tại bất kỳ điểm nào chờ đợi sự kiện này.

Bạn có thể tìm hiểu thêm về điều này bằng cách đọc về máy chủ không bị chặn hoặc không đồng bộ.

+0

JavaScript không phải là không đồng bộ, node.js là. JavaScript chỉ dẫn đến phong cách mã hóa không đồng bộ (hoặc đúng hơn, kiểu chuyển tiếp tiếp tục), do quyền công dân hạng nhất của hàm; nhưng không có gì đặc biệt không đồng bộ trong chính JavaScript. – Amadan

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