2012-02-29 39 views
37

NodeJS có phải là một khung công tác tốt cho một ứng dụng phía máy chủ lớn không? Những gì tôi đang tìm kiếm để phát triển là một ứng dụng lớn sẽ yêu cầu giao dịch HTTP (tiểu bang) và số lượng lớn người dùng đồng thời.Sử dụng NodeJS cho một dự án lớn

Từ những gì tôi đã đọc trực tuyến, NodeJS không phải là công cụ tốt nhất để sử dụng khi nói đến các chương trình lớn. Những gì tôi đã gặp phải là như sau:

  • NodeJS chạy trên JavaScript chạy trên các vòng sự kiện không hiệu quả khi được sử dụng hàng loạt.
  • NodeJS có thể không bị chặn, nhưng tất cả các yêu cầu được xử lý trong một chuỗi duy nhất để điều này có thể gây ra một chút tắc nghẽn khi nhiều yêu cầu được xử lý.
  • NodeJS được xây dựng trên máy chủ HTTP của riêng mình để việc bảo trì trong tương lai sẽ yêu cầu bộ lai sysadmin/nhà phát triển của riêng mình để xử lý ứng dụng.
  • Không có nhiều phần mềm được thử nghiệm và đa dạng sẵn có cho NodeJS giúp bạn xây dựng một ứng dụng lớn hơn.

Tôi đang thiếu cái gì? NodeJS có thực sự mạnh mẽ như nó có thể không?

+0

Sau khi làm việc trên các dự án thực trong một thời gian, tôi đã cập nhật câu trả lời của mình với những phát hiện mới nhất. – bryanmac

Trả lời

41

NodeJS là một khung/mã cơ sở tốt cho ứng dụng phía máy chủ lớn phải không?

Câu hỏi đó hơi chủ quan nhưng tôi bao gồm các điểm khách quan thực tế giải quyết các vấn đề thực sự khi làm việc với nút trong một dự án lớn.

Cập nhật sau khi làm việc trên dự án cho một lúc:

Tốt nhất là như một máy chủ kết thúc/API trước đó là I/O bound (máy chủ front end nhất/api là). Nếu bạn có nhu cầu tính toán phụ trợ (xử lý vv ...), nó có thể được ghép nối với các công nghệ khác (C# lõi ròng, đi, Java vv ... nút công nhân)

Tôi đã tạo dự án này làm mẫu minh họa hầu hết các điểm - Sane Node Phát triển: https://github.com/bryanmacfarlane/sanenode

NodeJS không được xây dựng trên đỉnh máy chủ http riêng của mình. Nó được xây dựng trên đỉnh động cơ javascript Chrome chrome và không giả định một máy chủ http. Có một mô đun http được xây dựng trong cũng như phổ biến express web server nhưng cũng có các mô-đun ổ cắm (cũng như socket.io). Nó không chỉ là một máy chủ http.

Chủ đề duy nhất không gây tắc nghẽn vì tất cả I/O được đặt và không đồng bộ. Liên kết này giải thích rõ ràng: http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/

Theo mô-đun phần mềm, bạn có thể tìm kiếm tại npm registry. Luôn luôn xem có bao nhiêu người khác sử dụng nó (tải xuống) và truy cập repo github để xem liệu nó có đang được duy trì hay không (hoặc có một loạt vấn đề không bao giờ được chú ý).

Về "dự án lớn" những gì tôi đã tìm thấy quan trọng cho sự phát triển lành mạnh là:

  1. hỗ trợ biên dịch thời gian (và IntelliSense): Tìm vấn đề khi bạn biên dịch. Nếu bạn không nghĩ rằng bạn cần điều này như tôi đã làm khi tôi bắt đầu, bạn sẽ thay đổi tâm trí của bạn sau đó refactor lớn đầu tiên.

  2. Loại bỏ gọi lại Địa ngục: Giữ hiệu suất quan trọng (đã lưu ý ở trên) nhưng loại bỏ mã gọi lại. Sử dụng async/await để viết mã tuyến tính và giữ nguyên không đồng bộ. Tích hợp với lời hứa nhưng tốt hơn nhiều so với chỉ sử dụng lời hứa.

  3. Dụng cụ: Rất nhiều tùy chọn nhưng tôi thấy tốt nhất là Typecript (ES6/7 hôm nay), VS Code (intellisense), Mocha (thử nghiệm đơn vị).

  4. Thiết bị/ghi nhật ký: Nhận thông tin chi tiết về ứng dụng của bạn bằng truy tìm và thiết bị là rất quan trọng.

  5. Xây dựng trên các khuôn khổ được kiểm tra kỹ lưỡng: Tôi sử dụng thể hiện như một ví dụ nhưng đó là sở thích và có các tùy chọn khác.

+4

Đây là tất cả những điểm rất hay, tuy nhiên câu hỏi đặt ra là: * NodeJS có phải là một khung công tác tốt cho một ứng dụng phía máy chủ lớn không? *. Điều này không trả lời câu hỏi. – Maroshii

+2

@Maroshii - Đó là một câu hỏi khá chủ quan và mơ hồ - tôi sẽ đề xuất đóng cửa dựa trên câu hỏi đó. Nhưng, yhe op liệt kê các điểm cụ thể tại sao nó có thể không được chấp nhận và tôi đã giải quyết những điểm đó. – bryanmac

+0

// nếu nó đang được duy trì tích cực (hoặc có một loạt vấn đề không bao giờ được chú ý). phần này thực sự đáng sợ: /, điều gì sẽ xảy ra nếu công cụ bảo trì dừng lại trong tương lai:/ – AVI

15

Node.js là một công cụ rất tốt để xây dựng các dịch vụ mạng được phân phối. Thiết kế ứng dụng quy mô lớn của bạn là gì hơn là một câu hỏi 'công cụ để sử dụng'. Rất nhiều người sử dụng node.js theo cách rất không đồng nhất cùng với ruby, php, erlang, apache & nginx & HAproxy. Nếu bạn không biết tại sao bạn cần nút bạn có thể không cần nó. Lý do có thể phải xem xét nút:

  • bạn muốn chia sẻ mã Javascript chung giữa máy chủ và máy khách
  • bạn mong đợi tải đồng thời cao (hàng ngàn đến hàng trăm ngàn kết nối đồng thời trên mỗi máy chủ)
  • bạn (hoặc nhóm của bạn) là nhiều thành thạo hơn với JavaScript hơn so với bất kỳ ngôn ngữ có sẵn/khuôn khổ khác
  • nếu one of 7600+ modules đang thực hiện phần lớn các chức năng cần thiết
+3

+1 - đặc biệt là máy chủ và mã khách hàng sharng. Thật hấp dẫn khi chia sẻ các thư viện JavaScript (chẳng hạn như xác thực) giữa trình duyệt của trình duyệt và máy chủ (API REST, v.v.) – bryanmac

+0

đồng ý với @bryanmac. Cũng chia sẻ các mẫu html cho các ứng dụng trang đơn là tuyệt vời. – Maroshii

8

Thực sự NodeJ mạnh mẽ theo cách riêng của nó, Một số thông tin khác,

  1. Bạn có thể chạy nhiều phiên bản ứng dụng của bạn dưới sự cân bằng tải để xử lý yêu cầu lớn.
  2. Chọn NodeJ để đọc 2000 tệp thay vì tính số nguyên tố thứ 20.
  3. Đặt NodeJs bận rộn với việc đọc/ghi trong các tệp hoặc cổng.
  4. Rất hữu ích khi bạn cần phát phản hồi của mình cho nhiều khách hàng.
  5. Không quan tâm đến khóa chết trong NodeJs, Nhưng hãy quan tâm đến mức độ thường xuyên bạn làm cùng một thao tác.
  6. Điều quan trọng nhất là, các giá trị sống trong động cơ V8 cho đến khi quá trình chấm dứt. Hãy chắc chắn bao nhiêu dòng mã, bạn sẽ ăn trong NodeJs.
2

Tôi thấy điều quan trọng nhất là sử dụng thời gian CPU ít nhất có thể. Nếu ứng dụng của bạn cần sử dụng CPU mạnh mẽ, độ trễ của vòng lặp sự kiện sẽ tăng lên và ứng dụng sẽ không trả lời bất kỳ yêu cầu nào khác.

9

Một "vấn đề" với NodeJS, là việc xây dựng một ứng dụng lớn đòi hỏi kỷ luật đối với một phần của nhà phát triển/nhóm.

Điều này đặc biệt đúng đối với nhiều nhóm trong cùng một công ty. Các khung công tác hiện có hơi lỏng lẻo và các nhóm khác nhau sẽ đưa ra các cách tiếp cận khác nhau để giải quyết vấn đề.

KrakenJS là một khuôn khổ, được xây dựng trên đầu trang của thể hiện. Nó bổ sung thêm một lớp quy ước và cấu hình để làm cho nó dễ dàng (er) để xây dựng các dự án lớn, liên quan đến nhiều nhóm.

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