Node.js khác với các khung công tác phía máy chủ khác như thế nào?


21

Tôi đã nhận thấy rằng Node.js đã trở nên rất phổ biến và tôi đã thấy một số trường hợp mọi người thực hiện các dự án quy mô nhỏ trong đó.

Tôi cũng đã xem các danh sách ưu và nhược điểm để có ý tưởng về những gì Node.js có thể làm, nhưng tôi vẫn chưa rõ nó khác với công nghệ phía máy chủ trưởng thành hơn như PHP, Perl hoặc Ruby trên như thế nào Đường ray.

Điều gì, cụ thể, phân biệt Node.js với các lựa chọn thay thế hiện tại và tại sao?


1
@downvoter - Tại sao downvote? ngoại trừ paragragh thứ hai (bạn thực sự không thể hỏi tại sao bắt đầu một cái gì đó khi người khác đã làm nó bởi vì bạn luôn có thể làm nó tốt hơn), tôi thấy câu hỏi này rất hấp dẫn. Tôi thường nghĩ về điều này.
David Peterman

Đó là một nit nhỏ để chọn, nhưng nếu bạn google trên cụm từ được trích dẫn "node.js", bạn sẽ nhận được khoảng 3 triệu lượt truy cập.
Peter Rowell

@Peter, yeah, tôi đã thử nó, và bạn đã đúng. Nhưng 3 triệu vẫn là hai. Bạn có thể quay lại một năm sau đó, và con số này có thể lên tới 10 triệu. :)
Saeed Neamati

3
@Mark, cảm ơn vì chỉnh sửa xuất sắc. Bây giờ thì rõ ràng hơn.
Saeed Neamati

Câu trả lời:


18

Có hai điều quan trọng làm cho Node.js khác với các khung công tác phía máy chủ hiện có, các sự kiện không đồng bộ và sử dụng JavaScript làm ngôn ngữ lập trình.

Sự kiện không đồng bộ

Mặc dù hầu hết các khung công tác phía máy chủ hiện tại sử dụng kiến ​​trúc đồng bộ, Node.js sử dụng kiến trúc không đồng bộ , JavaScript có thể xử lý tốt. Điều này có nghĩa là máy chủ phản ứng với các sự kiện và gửi các sự kiện (tin nhắn) đến ví dụ cơ sở dữ liệu. Phong cách lập trình này rất khác với phong cách đồng bộ và có thể khó sử dụng với các ngôn ngữ khác. Node.js sử dụng kiểu không đồng bộ với IO không đồng bộ và có thể mở rộng tốt.

Xem thêm Kiến trúc hướng sự kiện

JavaScript

JavaScript là ngôn ngữ lập trình mà các ứng dụng web đang sử dụng trên máy khách. Sử dụng cùng một ngôn ngữ ở phía máy chủ có nghĩa là nhà phát triển có thể áp dụng kiến ​​thức JavaScript của mình cả trên máy khách và máy chủ và sử dụng các chức năng tương tự khi cần.

Tôi muốn giới thiệu bản trình bày Giới thiệu về Node.js với Ryan Dahl , nơi anh giải thích kiến ​​trúc hướng sự kiện của Node.js chi tiết hơn.


2
Đây dễ dàng là câu trả lời tốt nhất cho đến nay, nhưng tôi đặt sự kiện Asynchromous lên hàng đầu, vì đó thực sự là điều khiến Node.js trở nên hấp dẫn như một khung công tác phía máy chủ. Mặc dù công việc tốt, đề cập đến I / O không đồng bộ và khả năng mở rộng. Đó là trái tim của nó.
Adam Crossland

Chà @Jonas, tôi vẫn không hiểu. ASP.NET cũng dựa trên sự kiện. Vậy thì sự khác biệt giữa Node.js và ASP.NET là gì? Có phải chỉ vì nó không đồng bộ? Trong trường hợp đó, tôi nghĩ rằng việc sử dụng đa luồng trong ASP.NET có thể làm như vậy, phải không?
Saeed Neamati

3
@Saeed: ASP.NET được phân luồng và đồng bộ, ví dụ: khi truy cập cơ sở dữ liệu, luồng bị chặn và đang chờ phản hồi từ cơ sở dữ liệu. Và khi sử dụng nhiều luồng (ví dụ một luồng cho mỗi yêu cầu), rất nhiều bộ nhớ được sử dụng (mỗi luồng cần dung lượng bộ nhớ khá lớn), đó có thể là một nút cổ chai. Node.js gửi tin nhắn và phản ứng với các sự kiện, vì vậy nó không bao giờ (hy vọng) chặn chuỗi. Với node.js, bạn đang sử dụng cùng một mô hình lập trình như ở phía máy khách với Ajax ( javascript và XML không đồng bộ ) và cùng một ngôn ngữ.
Jonas

Bạn đã quên cộng đồng nguồn mở tuyệt vời đằng sau nó.
Raynos

3
Khi C # 5 lăn lộn với những asyncthứ mới mặc dù điều đó có thể thay đổi. Vấn đề không phải là bạn không thể viết mã không đồng bộ có thể mở rộng bằng các ngôn ngữ khác, điều đó khó thực hiện hơn (chính xác) nếu không có hỗ trợ mức độ ngôn ngữ tốt.
Davy8

6

Nó khác nhau bởi vì nó hướng sự kiện . Điều này làm cho máy chủ có khả năng mở rộng cao.

Tóm lại;

Mô hình chủ đề

  1. Khách hàng yêu cầu một cái gì đó
  2. Máy chủ tắt và xử lý yêu cầu
  3. Cung cấp lại cho khách hàng
  4. Sẵn sàng xử lý yêu cầu mới

Mô hình sự kiện

  1. Khách hàng yêu cầu một cái gì đó
  2. Máy chủ chuyển yêu cầu trên để xử lý. Sẵn sàng xử lý yêu cầu mới
  3. Máy chủ xử lý nhiều yêu cầu hơn khi chúng đến
  4. Máy chủ trả lại dữ liệu cho khách hàng khi yêu cầu đã xử lý xong

@Tom, ý của bạn là gì khi điều khiển sự kiện? ASP.NET WebForms cũng là hướng sự kiện và bạn có thể thấy xử lý như Session_Startedhay Context_Authenticatedhay Page_Load?
Saeed Neamati

1
Gọi nó theo hướng sự kiện là mơ hồ hơn mức cần thiết và nó không thực sự đi vào trung tâm của Node.JS: I / O không đồng bộ.
Adam Crossland

2

Tôi đã có ấn tượng rằng sự phổ biến của nó là do việc sử dụng JavaScript. Vì nhiều nhà phát triển web biết JavaScript, đây là điểm bán hàng mà giờ đây họ có thể phát triển mã phía máy chủ bằng cùng một ngôn ngữ. Điều này có một vài lợi thế mà tôi có thể nghĩ đến:

  • Các tệp mã có thể được chia sẻ giữa máy chủ và máy khách, ngăn chặn sự trùng lặp nỗ lực chỉ để xử lý hai mặt của hệ thống.
  • Các nhà phát triển không cần phải chuyển đổi tinh thần giữa các ngôn ngữ. (không phải là một vấn đề lớn theo ý kiến ​​của tôi)
  • Kiến trúc sư không cần chọn nhiều ngôn ngữ khi kiến ​​trúc một giải pháp web.
  • Một số người chưa bao giờ phát triển mã phía máy chủ có thể làm như vậy mà không cần học một ngôn ngữ khác. (Không có khả năng là một đối số có giá trị, IMHO)

Node.JS là phổ biến vì nó nhanh và quy mô tốt. Đó là trong JavaScript là tốt, nhưng phần lớn là ngẫu nhiên.
Adam Crossland

2
Điều đáng giá hơn là các nhà phát triển phía máy chủ có thể viết mã phía máy khách bằng cùng một ngôn ngữ và bạn có thể chia sẻ các mô-đun phía máy chủ với máy khách. Không phải hướng ngược lại. Tôi không muốn chuyển mã phía máy khách bị hack sang máy chủ, điều đó tự bắn vào chân bạn.
Raynos

@Adam: Tại sao node.js trở nên phổ biến khi đã có các công nghệ phù hợp với mô tả "nhanh và quy mô tốt"? - Bởi vì đó là JavaScript.
John Fisher

@John Việc viết các ứng dụng không có quy mô tốt trong Node.js. Nếu ứng dụng của bạn sử dụng nhiều ổ đĩa / mạng hơn CPU (hầu hết là vậy), bạn có thể dễ dàng hỗ trợ các kết nối đồng thời nhiều lần hơn trên một lõi so với hầu hết các máy chủ khác trừ khi bạn viết một số mã luồng rất phức tạp.
Davy8

@ Davy8: Tôi đoán rằng tất cả phụ thuộc vào các khung / hệ thống khác mà bạn đã sử dụng. Khả năng mở rộng dễ dàng mà bạn mô tả đã đơn giản với các công cụ tôi sử dụng. Điều duy nhất Node.js cung cấp theo quan điểm của tôi là hương vị JavaScript, không hấp dẫn.
John Fisher
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.