如何跨节点集群共享一个资源

Posted

技术标签:

【中文标题】如何跨节点集群共享一个资源【英文标题】:How can I share one resource across Node clusters 【发布时间】:2018-09-06 13:43:43 【问题描述】:

我正在使用节点cluster模块,每个worker加载一个数据库连接。

index.js

const cluster = require('cluster');
const database = require('./db.js');
if (cluster.isMaster) 
   cluster.fork();
   cluster.fork();
 else ...

db.js

const mysql = require('mysql');
const pool = new mysql.pool(config);
module.exports = function(query)
    return pool.query(query);

我的理解是每次产生一个worker,都会初始化db.js,这会创建一个新的池/连接到mysql。

是否有另一种方式来构造它,以便所有工作人员共享同一个 mysql 池?

【问题讨论】:

【参考方案1】:

Node.js worker 和 master 之间不能共享资源。其中每一个都是一个新流程,您所能做的就是通过消息进行交流(文档here)。

基于 Node.js 文档:

工作进程是使用 child_process.fork() 方法生成的,因此它们可以通过 IPC 与父进程通信并来回传递服务器句柄。

对于每个child_process,我们有:

重要的是要记住,生成的 Node.js 子进程独立于父进程,但两者之间建立的 IPC 通信通道除外。每个进程都有自己的内存,有自己的 V8 实例。由于需要额外的资源分配,因此不建议生成大量子 Node.js 进程。

根据您的应用程序架构,您可能能够将要共享的资源移动到主服务器,然后将工作分配给工作人员。

【讨论】:

以上是关于如何跨节点集群共享一个资源的主要内容,如果未能解决你的问题,请参考以下文章

如何跨 EMR 集群中的节点运行 python 代码

如何添加跨域资源共享请求标头? [复制]

dockers-k8s本地共享仓库

跨 terraform 环境共享资源

YARN应用场景原理与资源调度

如何使用 Joomla 作为服务器配置跨域资源共享 (CORS)?