2012-03-04 34 views
32

Tôi mới sử dụng Node.js và hiện đang đặt câu hỏi về độ tin cậy của nó.Độ tin cậy của Node.js cho ứng dụng lớn

Dựa trên những gì tôi đã thấy cho đến nay, có vẻ như là một lỗ hổng lớn: bất kỳ lỗi/ngoại lệ vô tình nào gặp sự cố máy chủ. Chắc chắn, bạn có thể cố gắng chống đạn mã của bạn hoặc đặt thử/nắm bắt trong các lĩnh vực quan trọng, nhưng sẽ hầu như luôn luôn có lỗi mà trượt qua vết nứt. Và có vẻ như nguy hiểm nếu một yêu cầu có vấn đề có thể ảnh hưởng đến tất cả các yêu cầu khác. Có 2 cách giải quyết mà tôi đã tìm thấy:

  1. Sử dụng daemon hoặc mô-đun như forever để tự động khởi động lại máy chủ khi gặp sự cố. Điều tôi không thích về điều này là máy chủ vẫn còn xuống trong một hoặc hai giây (đối với một trang web lớn, có thể là hàng trăm (hàng nghìn?) Yêu cầu).

  2. Bắt ngoại lệ không bắt buộc bằng cách sử dụng process.on('uncaughtException'). Vấn đề với cách tiếp cận này (theo như tôi biết) là không có cách nào để có được một tham chiếu đến yêu cầu gây ra ngoại lệ. Vì vậy, yêu cầu cụ thể đó là treo trái (người dùng thấy chỉ báo tải cho đến khi hết thời gian chờ). Nhưng ít nhất trong trường hợp này, các yêu cầu không có vấn đề khác vẫn có thể được xử lý.

Có thể quảng cáo chiêu hàng kỳ cựu nào của Node.js không?

+5

Tôi không mua một chút về "hàng trăm nghìn" yêu cầu bị mất trên một trang web lớn. Một trang web lớn sẽ được thu nhỏ theo chiều ngang nên một quá trình đơn lẻ sẽ chỉ ảnh hưởng đến một phần nhỏ trong tổng lưu lượng truy cập. – Kevin

+1

các bản sao có thể có: http://stackoverflow.com/questions/7310521/node-js-best-practice-exception-handling http://stackoverflow.com/questions/9181027/node-js-doesnt-display-entire- error-message-on-uncaughtexception-is-it-possibl mặc dù tôi có vẻ hiểu câu trả lời được chấp nhận là không thỏa mãn? – Dirk

+1

@Kevin có thể vẫn nằm trong hàng trăm hoặc bất kỳ cách nào đơn giản là không thể chấp nhận được –

Trả lời

1

Ngoại lệ không làm hỏng máy chủ, chúng sẽ tăng ngoại lệ.

Lỗi trong node.js làm giảm toàn bộ quá trình là một câu chuyện khác.

Đặt cược tốt nhất của bạn (bạn nên làm với công nghệ bất kỳ công nghệ) nào, chỉ cần thử nghiệm ứng dụng của bạn càng sớm càng tốt để xem nó có phù hợp không.

2

Bạn có toàn quyền kiểm soát quy trình cơ sở và đó là một tính năng.

Nếu bạn so sánh nút với thiết lập Apache/PHP, máy chủ Node đơn giản chỉ tương đương với một máy chủ Node đơn giản gửi mỗi yêu cầu đến tới quá trình riêng của nó được chấm dứt sau khi yêu cầu được xử lý.

Bạn có thể thực hiện thiết lập đó trong Nút nếu bạn muốn và trong nhiều trường hợp, điều gì đó giống như vậy có thể là một ý tưởng hay. Điều tuyệt vời về Node là bạn có thể phá vỡ mẫu này, ví dụ bạn có thể có quá trình chính hoặc một quy trình vĩnh viễn khác thực hiện xử lý phiên trước khi yêu cầu được truyền cho trình xử lý của nó.

Nút là một công cụ rất linh hoạt, tốt nếu bạn cần sự linh hoạt này, nhưng phải mất một số kỹ năng để xử lý.

+1

Vâng, đó là một thanh kiếm hai cạnh ... hầu hết những người được rút ra để Node không nhất thiết phải có kiến ​​thức hoặc mong muốn xây dựng các thiết lập máy chủ "đúng" đúng cách. Cũng giống như không ai thực sự quan tâm nhiều đến những lỗi bảo mật Ruby gần đây cho đến khi có chuyện gì đó xảy ra. Cá nhân tôi bị thu hút bởi Node bởi vì tôi rất quen thuộc với Javascript. Tôi cảm thấy như có nhiều hương vị của Node out-of-the-box để xử lý các kịch bản khác nhau. – pixelfreak

3

Để tự động khởi động lại và cân bằng tải, tôi khuyên bạn nên kiểm tra số dư Learnboost's up.

Nó cho phép bạn tải lại một nhân viên phía sau bộ cân bằng tải mà không làm rơi bất kỳ yêu cầu nào. Nó ngừng chỉ đạo các yêu cầu mới đối với người lao động, nhưng đối với các yêu cầu hiện có đang được phục vụ, nó cung cấp thời gian ân hạn workerTimeout để chờ yêu cầu hoàn tất trước khi thực sự tắt quy trình.

Bạn có thể điều chỉnh chiến lược này cũng được kích hoạt bởi sự kiện uncaughtException.

+0

trong nhiều trường hợp, tốt hơn là để cho nút bị lỗi trên các ngoại lệ không mong muốn và với một số thứ như khởi động lại của bạn có thể ẩn đối với khách truy cập. Khi tôi đang sử dụng nginx cho các trang php tôi đã học được rằng công nhân php sụp đổ tất cả các thời gian và bạn không biết điều này như là một người sử dụng apache bởi vì apache làm điều tương tự như lên, rõ ràng.Làm cho tôi nghĩ rằng apache có thể được cấu hình cho nút hmmm .... –

1

Một ngoại lệ không bắt buộc sẽ, nếu không bị bắt, hãy báo lỗi máy chủ. Một cái gì đó như gọi một hàm sai chính tả. Tôi sử dụng process.on('uncaughtException') để nắm bắt các ngoại lệ như vậy.Nếu bạn sử dụng điều này thì có, lỗi được gửi đến process.on('uncaughtException') ít thông tin hơn.

Tôi thường bao gồm một mô-đun như nomnom để cho phép cờ dòng lệnh. Tôi bao gồm một tên gọi là --exceptions, khi được đặt, bỏ qua process.on('uncaughtException'). Về cơ bản, nếu tôi thấy rằng ngoại lệ chưa được bắt đầu xảy ra thì tôi, trong quá trình phát triển, khởi động ứng dụng với --exceptions để khi lỗi đó được nâng lên, nó sẽ không bị bắt, khiến cho Node nhổ ra dấu vết ngăn xếp và sau đó chết. Điều này cho bạn biết những gì nó xảy ra trên dòng, và trong những tập tin.

Ghi lại các ngoại lệ là một cách để giải quyết. Nhưng, như bạn đã nói, điều đó có nghĩa là nếu một lỗi xảy ra, điều đó có thể khiến người dùng không nhận được phản hồi, v.v. Tôi thực sự khuyên bạn nên để lỗi xảy ra với máy chủ. (Tôi sử dụng process.on('uncaughtException') trong ứng dụng, không phải máy chủ web). Và sử dụng forever. Thực tế là có khả năng máy chủ web sẽ gặp sự cố tốt hơn và sau đó hiển thị những gì bạn cần khắc phục.

Giả sử bạn đã sử dụng PHP thay vì Nút. PHP không đột ngột sụp đổ máy chủ (vì nó không thực sự phục vụ). Nó phun ra những lỗi thực sự xấu xí. Chắc chắn, nó không dẫn đến một máy chủ toàn bộ đi xuống và sau đó phải trở lại. Không ai muốn khách hàng của họ có thời gian chết. Nhưng nó cũng có nghĩa là một vấn đề sẽ tồn tại và sẽ ít đáng chú ý hơn. Chúng tôi đã thấy tất cả các trang web đã nói lỗi và chúng không được vá rất nhanh. Nếu một lỗi như vậy là lấy tất cả mọi thứ xuống cho một đốm nhỏ (mà thực sự nó không phải tất cả những gì xấu trong bức tranh lớn hơn) thì nó chắc chắn sẽ kêu gọi sự chú ý đến chính nó. Bạn sẽ thấy nó xảy ra và sẽ theo dõi lỗi đó.

Thực tế là các lỗi sẽ tồn tại trong bất kỳ hệ thống nào, không phụ thuộc vào ngôn ngữ hoặc nền tảng. Và nó được cho là tốt hơn cho họ để được gây tử vong để cho bạn biết họ đã xảy ra. Và theo thời gian nó khiến bạn trở nên ý thức hơn về cách những lỗi này xảy ra. Tôi không biết về bạn, nhưng tôi biết rất nhiều nhà phát triển PHP, những người mắc phải những sai lầm phổ biến giống nhau theo thời gian.

+0

IMO trang web không bao giờ nên đi xuống. – wayofthefuture

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