mediasoup 學習筆記【一】 worker

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章