2017-04-04 27 views
10

Có thể sử dụng mô đun cụm trong các hàm lambda không? Tôi đã thử điều này:Cụm NodeJS trên AWS Lambda

'use strict'; 
var cluster = require('cluster'); 
var http = require('http'); 
var os  = require('os'); 

var numCPUs = os.cpus().length; 
console.log('Number of Cores : ', numCPUs); 

exports.test = (event, context, callback) => { 
    if (cluster.isMaster) { 
     for (var i = 0; i < numCPUs; ++i) { 
      cluster.fork(); 
     } 
    } else { 
     console.log('child process '); 
    } 
} 

số lõi luôn là 2, nhưng tôi không bao giờ thấy nhật ký quy trình con.

Cập nhật ví dụ bình luận:

tôi đã cố gắng thực hiện các mô hình nhắn tin nhưng tôi vẫn không nhận được tin nhắn được gửi bởi trẻ em. Vòng lặp for vòng lặp chính xác thông qua các công nhân cụm nhưng không bao giờ tìm thấy một thông báo.

'use strict'; 
var cluster = require('cluster'); 
var http = require('http'); 
var os  = require('os'); 

var numCPUs = os.cpus().length; 
console.log('Number of Cores : ', numCPUs); 

exports.test = (event, context, callback) => { 
    if (cluster.isMaster) { 
     for (var i = 0; i < numCPUs; ++i) { 
      cluster.fork(); 
     } 
     for (const id in cluster.workers) { 
      cluster.workers[id].on('message', messageHandler); 
     } 
    } else { 
     process.send('running'); 
    } 
}; 

function messageHandler(msg) { 
    console.log(msg); 
} 
+0

Bạn đã thấy lợi ích về hiệu suất về điều này chưa? Tại sao bạn muốn thực hiện nó? – kbariotis

+0

Tôi đã thử nghiệm hiệu suất. Cuối cùng tôi đã đi với một lambda duy nhất thay vì một cụm. Nếu bạn quan tâm tôi có thể đào các kết quả sao lưu từ các bài kiểm tra hiệu suất. –

+0

Tuyệt đối! Cảm ơn bạn – kbariotis

Trả lời

1

Vấn đề dường như không có gì để gọi hàm exports.test cho từng quy trình con. cluster.fork() gọi một phiên bản mới của tệp với các thông số khác nhau bắt đầu ngay từ đầu, không giống như gọi hệ thống trong C sao chép quy trình hiện tại và tiếp tục từ cùng một dòng trong cả quá trình cha và con.

Đối với quy trình gốc, AWS lambda sẽ gọi hàm này, nhưng quá trình con chỉ xác định hàm và sau đó chờ.

Tôi sẽ lật logic của bạn xung quanh để kiểm tra cluster.isMaster xảy ra xung quanh mọi thứ khác; Tôi đã thử nghiệm các địa phương sau:

'use strict'; 
let cluster = require('cluster') 
let http = require('http') 
let os = require('os') 

let numCPUs = os.cpus().length 

if (cluster.isMaster) { 
    console.log('Number of Cores : ', numCPUs); 
    exports.test = (event, context, callback) => { 
    for (let i = 0; i < numCPUs; ++i) { 
     cluster.fork(); 
    } 
    for (const id in cluster.workers) { 
     cluster.workers[id].on('message', messageHandler); 
    } 
    } 
} else { 
    process.send('running'); 
} 

function messageHandler(msg) { 
    console.log(msg); 
} 

// The following used for local test 

exports.test && exports.test(); 
+0

Đẹp. Cảm ơn bạn! –

2

Mã của bạn có vẻ chính xác, ngoại trừ bạn giả định rằng cuộc gọi đến console.log() từ nhân viên hiển thị trên bảng điều khiển cho quy trình tổng thể của bạn. Đây không phải luôn luôn như vậy, vì các cuộc gọi sẽ không lan truyền lên cây xử lý.

Sau cuộc gọi của bạn để fork(), quăng đoạn này để nhận một tin nhắn từ một quá trình con:

for (var id in cluster.workers) { 
    cluster.workers[id].on('message',function() { 
    console.log('got message from ' + id + ': ' + msg); 
    }); 
} 

Sau đó, trong trường hợp thứ hai bạn của bạn if/else (nơi thu mua quá trình lao động được lưu trữ), thêm này để thông báo cho các bậc thầy:

process.send('running'); 

Bạn cũng có thể gửi cho các đối tượng (thích hợp) thông qua process.send(), tôi chỉ sử dụng một string như một ví dụ. Có thông tin chi tiết hơn về tài liệu chính thức: Cluster - How it works

+0

cảm ơn vì phản hồi. vui lòng xem bài đăng cập nhật của tôi. –

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