5

Tôi không phải là một chủ node.js, vì vậy tôi muốn có thêm quan điểm về điều này.Xây dựng một ứng dụng node.js có hiệu suất cao với cluster và nút-webworker

Tôi đang tạo một máy chủ web HTTP node.js không phải xử lý không chỉ nhiều kết nối đồng thời mà còn thực hiện các công việc dài. Theo mặc định node.js chạy trên một tiến trình và nếu có một đoạn mã mất nhiều thời gian để thực thi bất kỳ kết nối nào sau đó phải đợi cho đến khi mã kết thúc những gì nó đang thực hiện trên kết nối trước đó.

Ví dụ:

var http = require('http'); 
http.createServer(function (req, res) { 

    doSomething(); // This takes a long time to execute 

    // Return a response 
}).listen(1337, "127.0.0.1"); 

Vì vậy, tôi đã suy nghĩ để chạy tất cả các công việc chạy dài trong chủ đề riêng biệt bằng cách sử dụng node-webworker thư viện:

var http = require('http'); 
var sys = require('sys'); 
var Worker = require('webworker'); 
http.createServer(function (req, res) { 

    var w = new Worker('doSomething.js'); // This takes a long time to execute 

    // Return a response 
}).listen(1337, "127.0.0.1"); 

Và để làm cho toàn bộ điều performant hơn, tôi cũng nghĩ sử dụng cluster để tạo quy trình nút mới cho mỗi lõi CPU. Bằng cách này, tôi mong muốn cân bằng các kết nối khách hàng thông qua các quá trình khác nhau với cluster (giả sử 4 quy trình nút nếu tôi chạy nó trên quad-core), và sau đó thực hiện công việc dài chạy trên các chủ đề riêng biệt với node-webworker.

Có vấn đề gì với cấu hình này?

Trả lời

0

Bạn có thể muốn kiểm tra Q-Oper8 thay vì nó sẽ cung cấp một kiến ​​trúc linh hoạt hơn cho loại điều này. Đầy đủ thông tin tại địa chỉ:

https://github.com/robtweed/Q-Oper8

+1

Cập nhật lần cuối 2 năm trước –

3

tôi thấy rằng bài viết này là một vài tháng tuổi, nhưng tôi muốn cung cấp một lời nhận xét này trong trường hợp có ai đó đến cùng.

"Theo mặc định node.js chạy trên một quy trình và nếu có một đoạn mã mất nhiều thời gian để thực thi bất kỳ kết nối nào sau đó phải đợi cho đến khi mã kết thúc hoạt động trên kết nối trước đó."

^- Điều này không hoàn toàn đúng. Nếu doSomething(); được yêu cầu hoàn thành trước khi bạn gửi trả lời, sau đó có, nhưng nếu không, bạn có thể sử dụng chức năng Không đồng bộ có sẵn cho bạn trong lõi của Node.js và quay lại ngay lập tức, trong khi mục này xử lý trong lý lịch.

Một ví dụ nhanh chóng của những gì tôi đang giải thích có thể được nhìn thấy bằng cách thêm đoạn mã sau vào máy chủ của bạn:

setTimeout(function(){ 
    console.log("Done with 5 second item"); 
}, 5000); 

Nếu bạn nhấn máy chủ một vài lần, bạn sẽ nhận được một phản ứng ngay lập tức trên máy khách bên cạnh, và cuối cùng nhìn thấy giao diện điều khiển điền vào với các tin nhắn giây sau khi phản hồi được gửi đi.

1

Tại sao bạn không chỉ cần sao chép và dán mã của bạn vào một tập tin và chạy nó trên JXcore như

$ jx mt-keep:4 mysourcefile.js 

và xem cách nó thực hiện. Nếu bạn cần một đa luồng thực mà không để lại sự an toàn của luồng đơn thử JX. tương thích 100% node.JS 0.12+ của nó. Bạn có thể sinh ra các luồng và chạy một ứng dụng toàn bộ node.js bên trong mỗi luồng riêng biệt.

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