如果以前接觸過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 疫情期間 學點東西#