cluster-dispatch
解决Node.js在Cluster模式下的连接/资源复用问题
你会不会有这么一种场景, 比如创建一个TCP连接并且监听一个configserver的配置变动, 当变动的时候同时调整配置, 当你的应用运行在cluster模式下这个TCP连接就会是N个, 但是你并不需要N个因为浪费系统和你的服务方资源, 你只需要有一个TCP连接就够了.
这个模块就是解决这个问题诞生的.
他用了这样一个进程模型
Master -> fork Library
| |
| Agent
Cluster |
Wokrer, Wokrer, Woker....
你可以把需要复用的资源放在Library进程中, Agent来负责跨进程的调用
Installation
$ npm i cluster-dispatch --save
Example
$ git clone
$ npm i
$ npm run example
API
Master
master作为守护进程也是应用的入口, 负责启动appWokrer和libraryWorker
const Master = Master; /* * @param {Object} options * - {String} baseDir - 工程根路径 * - {String} appPath - app进程入口文件, 可以是一个相对路径 * - {String} libraryPath - 第三方库入口文件, 具体参照exmaple/lib/index.js, 可以是一个相对路径 * - {Number} appWorkerCount - 需要启动的app进程数 * - {Funcion} logging - log * - {Boolean} needLibrary - 是否需要启动library进程 * - {Boolean} needAgent - 是否需要自动启动代理 */const master = baseDir: __dirname logging: debug appWorkerCount; { await master; // 初始化 master;}
Agent
agent负责跨进程的调度, 这个agent实例每个appWorker都有, 默认会在appWorker初始化时创建好
在appWorker中通过Agent.getAgent()就可以拿到agent实例
// agent/index.js'use strict'; const Agent = Agent; moduleexports = Agent;
通过agent调用和正常调用是一样的, 只是得通过agent对象调用
eg
// agent/lib/demo.jsmoduleexports = { return { }; } // index.jsconst agent = { const name = await agentdemo console // "get name"}
不过因为是跨进程的所以任何调用都是异步的, 即使你调用的原本是个同步方法
启动流程
- 启动master进程
- master fork 出 library worker
- library worker 根据实例化master传递的libraryPath参数拿到下面对象签名, 然后触发ready事件给master
- master接到ready事件后开始已cluster模式启动app worker
- app worker初始化完成后会向library worker请求对象签名, 拿到对象签名后开始初始化agent
- agent遍历对象签名, 并且把对象的每个key重写, 类似这样的逻辑
agent { return client}
等于拿到你的调用方法后, 把参数原样返回回去, 实际执行还是在library worker中
- done