0

我已将问题提交到 github repo,以便在那里进行跟踪!

我正在运行一个集群应用程序,它可以在具有 N 个内核的机器上。假设我在本地运行 2 个应用程序实例进行测试,实际上模拟了 2 个不同的盒子。因此,使用该模块的 N 台机器上的 N 个内核cluster(实际上,N 台机器是静态的,例如,仅在 AWS 负载均衡器后面 2 个)。

  1. 如何为此正确配置collective.js “all_hosts”选项?我会process.id以某种方式与 IP 一起使用吗?

运行代码片段将类似于 2 个 bash 终端:

1号航站楼

coffee cluster1

2号航站楼

coffee cluster2

注意:下面的代码有效,但实际上并不有效,因为我不太清楚配置;每次我记录数据时,它都是特定于流程的。

cluster1.coffee

cluster = require 'cluster'
numCPUs = require('os').cpus().length

if cluster.isMaster

  i = 0 
  cluster.setupMaster 
    exec: './server1'

  console.log "App 1 clustering with: #{numCPUs} clusters"

  while i < numCPUs
    cluster.fork()
    i++

  cluster.on 'fork', (worker) ->
    console.log 'Forked App 1 server worker ' + worker.process.pid

server1.coffee

Collective = require 'collective'

all_hosts = [
    host: 'localhost', port: 8124 # Wrong
]

collective = new Collective(
  host: 'localhost'
  port: 8124
, all_hosts, (collective) ->

)

collectiveUpsert = () ->

  num = Math.floor((Math.random()*10000)+1)

  data = 
    num: num

  console.log process.pid + ' sees current num as: ' + JSON.stringify(collective.get('foo.bar'))
  console.log process.pid + ' setting num to: ' + JSON.stringify(data)

  collective.set 'foo.bar', data

setInterval (->
  collectiveUpsert()
), 5 * 1000

cluster2.coffee

cluster = require 'cluster'
numCPUs = require('os').cpus().length

if cluster.isMaster

  i = 0 
  cluster.setupMaster 
    exec: './server2'

  console.log "App 2 clustering with: #{numCPUs} clusters"

  while i < numCPUs
    cluster.fork()
    i++

  cluster.on 'fork', (worker) ->
    console.log 'Forked App 2 server worker ' + worker.process.pid

server2.coffee

Collective = require 'collective'

all_hosts = [
    host: 'localhost', port: 8124 # Wrong
]

collective = new Collective(
  host: 'localhost'
  port: 8124
, all_hosts, (collective) ->

)

collectiveUpsert = () ->

  num = Math.floor((Math.random()*10000)+1)

  data = 
    num: num

  console.log process.pid + ' sees current num as: ' + JSON.stringify(collective.get('foo.bar'))
  console.log process.pid + ' setting num to: ' + JSON.stringify(data)

  collective.set 'foo.bar', data

setInterval (->
  collectiveUpsert()
), 5 * 1000
4

1 回答 1

0

为了在和/或多个服务器上使用collective.jscluster您需要在每个Node.js 子进程上启动它。将其视为一个http模块,您必须在每个子/从属设备上创建侦听器,而不是在主设备上创建侦听器(http://nodejs.org/api/cluster.html#cluster_cluster)。按照类似的逻辑,对于collective.js,你应该做这样的事情(单服务器):

if (cluster.isMaster) {
    // fork n children
} else {
    var current_host = {host: "localhost", port: 10000};
    current_host.port += cluster.worker.id; // this is incremented for every new process.

    var all_hosts = [
        {"host": "localhost", "port": 10001},
        {"host": "localhost", "port": 10002},
        {"host": "localhost", "port": 10003},
        {"host": "localhost", "port": 10004},
        {"host": "localhost", "port": 10005},
        {"host": "localhost", "port": 10006}
        // must be the same amount as is the child process count.
    ];

    var collective = new modules.collective(current_host, all_hosts, function (collective) {
        // Do your usual stuff. Start http listener, etc...
    });
}

如果您想在不同的服务器上使用它,您应该将localhost修改为您的 IP 地址并确保端口正确增加。

有关任何其他信息,您可以在test/index.js查看粗略测试

希望有帮助!如果您需要任何进一步的帮助 - 请询问。

PS 诚然,这种方式比较繁琐,需要更清晰的解释。我希望在不久的将来找出一个更清洁、更容易的初始化过程。除此之外,澄清自述文件并提供一些完整的示例。

于 2013-04-07T09:19:12.847 回答