当前位置: 首页 > 后端技术 > Node.js

探索PM2Cluster模式下的Log4js日志丢失

时间:2023-04-03 19:50:55 Node.js

Node应用是单线程应用。JS虽然可以使用异步I/O来避免线程阻塞,但是无法利用多核CPU来提高运行效率,还是需要多线程来提高吞吐量。NodeCluster可以生成多个worker线程共享同一个TCP连接,主线程通过IPC通道与worker线程通信,使用R??ound-robin负载均衡很好的处理线程间的压力。PM2Cluster使得Node更容易操作集群。PM2会根据服务器CPU核数生成相应的工作线程。直接启动应用如下:pm2startapp.js-i0但是PM2Cluster和Log4js碰撞的时候,崩溃了大坑,我踩进去了。踩坑:某天,服务器上有同学报了一个在线请求参数异常日志。为了追查异常原因,找遍了所有在线服务器,没有找到相关的日志。服务端异常日志不是伪造的,前端日志丢失不是偶然的。为了统计日志丢失率,在离线环境下量化发起了100次请求,但是只产生了25条日志。多次实验发现损失率稳定在3/4,太离谱了!热(好)爱(奇)技(心)技(重)我查看了Log4js的源码:configuration.addListener((config)=>{//清除listeners,因为已经调用了configurelisteners.length=0;禁用=config.disableClustering;pm2=config.pm2;pm2InstanceVar=config.pm2InstanceVar||'NODE_APP_INSTANCE';debug(`clusteringdisabled?${disabled}`);debug(`cluster.isMaster?${cluster.isMaster}`);debug(`pm2enabled?${pm2}`);debug(`pm2InstanceVar=${pm2InstanceVar}`);debug(`process.env[${pm2InstanceVar}]=${process.env[pm2InstanceVar]}`);//以防万一configure在关机后调用;}if(config.disableClustering){debug('不监听集群消息,因为集群被禁用。');}elseif(isPM2Master()){//PM2集群支持//PM2以工作人员的身份运行一切-安装pm2-intercom以使其工作。//我们只希望其中一个应用程序实例写入日志。debug('监听PM2广播消息');process.on('消息',接收者);}elseif(cluster.isMaster){debug('监听集群消息');cluster.on('消息',接收者);}else{debug('不监听消息,因为我们不是主进程。');}});请注意:PM2以工人的身份运行所有东西-安装pm2-intercom为此工作。Log4js在集群模式下,工人将日志发送至master,master现实日志写入文件但是在PM2Cluster模式下,所有进程都是worker:所以按照Log4js源码安装pm2-intercom进程间通信模块:还是不行,注意isPM2Master():constisPM2Master=()=>pm2&&过程。env[pm2InstanceVar]==='0';constisMaster=()=>禁用||集群.isMaster||isPM2Master();isPM2Master由Log4jsconfigure中的pm2和pm2InstanceVar参数决定,所以修改Log4js配置如下:Log4JS.configure({//...pm2:true,pm2InstanceVar:'INSTANCE_ID'});终于解决了PM2Cluster模式下Log4js日志丢失的问题。添加:自己实现NodeCluster:constOS=require('os');constCluster=require('集群');constKoa=require('koa');constApp=newKoa();if(Cluster.isMaster){for(leti=0;i