【问题标题】:How do you deploy Throng or Cluster with Angular Fullstack?如何使用 Angular Fullstack 部署 Throng 或 Cluster?
【发布时间】:2016-06-18 10:02:23
【问题描述】:

文档看起来非常简单,可以实现 Throng 以使用 Heroku 创建额外的 webworkers。话虽如此,它给我留下了几个问题:

1) 我还需要安装集群吗?从我读到的 Throng 是 Cluster 的抽象,但我没有看到 Cluster 包含在下载中。我错过了什么还是 Throng 准备好开箱即用了吗?

2) 我将这几行代码放在哪里? Angular Fullstack 有一个 server 目录和 server 目录中的 app.js 文件。这是我最好的选择,但我可以想象将它放在 config 目录甚至其他地方会更好。

3) 我需要按什么顺序要求 Throng?我明白,如果事情出了问题,就会把事情搞砸。如果 app.js 是放置 var throng = require('throng') 的正确位置。

以下链接是我在 Throng 上的指示参考: https://github.com/goodeggs/heroku-web-cluster

我将以下代码放在“启动服务器”下的 app.js 文件中:

var throng = require('throng');
var WORKERS = process.env.WEB_CONCURRENCY || 1;
var start = function(){
  process.on('SIGTERM', function() {
    console.log('Worker exiting');
    process.exit();
  });
}
throng(start, {
  workers: 1,
  lifetime: Infinity,
});

当我这样做时,我的终端在本地部署时会收到一个快速重复的错误:

Error: bind EADDRINUSE
    at exports._errnoException (util.js:746:11)
    at cb (net.js:1178:33)
    at rr (cluster.js:592:14)
    at Worker.<anonymous> (cluster.js:563:9)
    at process.<anonymous> (cluster.js:692:8)
    at process.emit (events.js:129:20)
    at handleMessage (child_process.js:324:10)
    at Pipe.channel.onread (child_process.js:352:11)
Debugger listening on port 5889
events.js:85
      throw er; // Unhandled 'error' event

        ^

【问题讨论】:

    标签: javascript node.js multithreading heroku


    【解决方案1】:
    var express = require('express');
    var cluster = require('cluster'); //no need to download anything
    var os = require('os'); //no need to download anything
    
    if(cluster.isMaster) {
       var numWorkers = os.cpus().length;
       console.log('Master cluster setting up ' + numWorkers + ' workers...');
    
       for(var i = 0; i < numWorkers; i++) {
           cluster.fork();
       }
    
       cluster.on('online', function(worker) {
           console.log('Worker ' + worker.process.pid + ' is online');
       });
    
       cluster.on('exit', function(worker, code, signal) {
           console.log('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal);
           console.log('Starting a new worker');
           cluster.fork();
       });
    } else {
       var app = require('express')();
       var server = require('http').createServer(app);
       require('./config/express')(app);
       require('./routes')(app);
    
       // Start server
       server.listen(config.port, config.ip, function () {
         console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
       });
    }
    

    【讨论】:

    • 这不是在使用 throng ... 使用 throng 没有意义吗?我正在尝试遵循 heroku 对 throng 的建议...
    • @Lion789。抱歉我才看到这个。已经三个月了,所以我不记得任何关于 Throng 的详细信息,只是说我决定不使用它,并发现 Cluster 足够简单,以至于 Throng 添加的抽象不会为我的用例增加价值。从我的 POV 来看,我认为 Throng 没有任何附加值,我认为 Heroku 提出的使用此解决方案的建议具有误导性。
    • @rashadb 这里也一样。默认实现是如此简单和明确,以至于大量抽象只是增加了一层不需要的复杂性
    猜你喜欢
    • 2015-04-29
    • 2016-05-09
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多