찾다

 >  Q&A  >  본문

node.js - Node Cluster 如何共享数据?

初学者提个问题,Node Cluster 如何共享数据?

创建一个简单的 http 服务,目的是统计请求数,该例子中 fork 4 个进程,如下:

var http = require('http')
var cluster = require('cluster')

var pv = 0

if (cluster.isMaster) {
  for (var i = 0; i < 4; i++) {
    var worker = cluster.fork()
  }
} else {
  http.createServer((req, res) => {
    pv++
    console.log(`pid: ${process.pid}, pv: ${pv}`)
    res.end('okay')
  }).listen(4010)
}

结果:

pid: 70445, pv: 1
pid: 70445, pv: 2
pid: 70445, pv: 3
pid: 70445, pv: 4
pid: 70445, pv: 5
pid: 70445, pv: 6
pid: 70445, pv: 7
pid: 70445, pv: 8
pid: 70444, pv: 1
pid: 70444, pv: 2
pid: 70444, pv: 3
pid: 70444, pv: 4
pid: 70444, pv: 5

因为 fork 出来的每个进程都有自己单独的内存空间,所以这样统计 pv 显然是不行的。

所以有什么好的解决方案吗?

我看了一下 ioredis,尝试后发现它的 api 也是异步化的,并没能解决我的问题。

阿神阿神2875일 전339

모든 응답(2)나는 대답할 것이다

  • 阿神

    阿神2017-04-17 16:00:03

    클러스터 포크는 스레드가 아닌 프로세스입니다. 프로세스는 서로 독립적이며 각각 자체 메모리 공간을 가지고 있습니다. 일반적으로 한 프로세스는 다른 프로세스의 메모리 공간에 액세스할 수 없으므로 유사한 공유 기능을 달성하려는 경우 변수와 같은 것은 프로세스 통신에만 의존할 수 있습니다.
    클러스터 모듈의 공식 문서에서 실제로 프로세스 통신과 관련된 API를 볼 수 있습니다.
    물론 데이터를 데이터베이스(예: redis)에 저장하여 달성할 수도 있습니다. 공유하지만 저는 그게 더 귀찮은 것 같아요. . .

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-17 16:00:03

    Redis에 쓰시겠습니까?

    회신하다
    0
  • 취소회신하다