如果以前接触过nodejs,应该对cluster有所了解,不管是 expressjs, eggjs 等等框架,都启用了多进程方案以提升性能。当然mediasoup也不例外。
今天再一起回忆下,cluster这个node模块。
官网给的例子,开代码就可以清楚,
这里区分主进程和子进程,主进程不负责业务代码部分,只负责子进程的监控方面的工作。
cluster fork 就是 起个进程 再次执行非 master的 代码部分;
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
//something
console.log(process.pid)
}
进程之间的通信方式,或者是共享数据方式,当然真正的方法 用数据库或者 redis等等方式。
拿一个实际的例子,用户进入房间,房间当前人数的案例。
比如说有四个人进入同一个房间,很有可能不是同一个进程处理的,这样就需要一个集中整理房间以及房间人数的地方。
可以看下面代码
let users = new Map()
if(cluster.isMaster){
const worker = cluster.fork()
worker.send('other something');
worker.on('message', function(message){
switch(message.action){
case 'join':
users.set(messages.data.userId, message.data)
break;
case 'leave':
users.delete(message.data.userId);
break;
default:
log('unknow action name')
}
})
} else {
//这里是业务代码
users是可以直接获取的读取的,
process.on('message', reciveMessageHandle) //接收主进程的消息
//当房间有人进来的时候
process.send({action:'join',data:{userId}});
}
看完代码应该比较好理解了,当然这仅仅是个示意demo代码。
再扩展下大家可以进一步考虑下,守护进程做一个永远都不会挂掉的服务(当然有点夸张);主进程监听到子进程异常退出之后立即 fork 当然这是暴力方式,不过可以在方法里面增加报警的通知(短信、邮件)等等。
mediasoup createWorker 相关参数
- logLevel : “debug”, “warn”, “error” and “none”, //这个就不多说了
- logTags :‘info’,‘ice’,‘dtls’,‘rtp’,‘srtp’,‘rtcp’,‘rtx’,‘bwe’,‘score’,‘simulcast’,‘svc’,‘sctp’
- rtcMinPort: 最小端口
- rtcMaxPort:最大端口
- dtlsCertificateFile,dtlsPrivateKeyFile 证书相关
- appData
const mediasoup = require('mediasoup');
const worker = mediasoup.createWorker({...options})
#2020 疫情期间 学点东西#