Node。js平台环境Node。jsv16。15。1pnpm7。12。2 数据库MySQL8。x 框架库Express4。18。1mysql22。3。3pino8。6。1 说明 使用集群模式启动服务程序,进程数为CPU逻辑核心数量 Node。js平台测试程序包含基本框架、数据库驱动库和日志库,数据源为数据库中的两个逻辑关联表,程序先查询表1最新的1000条数据,然后使用关联列id数组作为查询参数查询表2的数据,在程序中合并两个表的数据,最后返回给客户端。 数据库为远程线上数据库,为了与Go平台默认设置相同,数据库连接池的维持链接数量设置为0。 使用库外关联数据的原因为降低数据库参与程度,同时将测试结果用来对比在不同vm编译器环境下各个web框架的综合性能。 创建express工程mkdirexpresscdexpresspnpminitpnpmaddexpressmysql2pinopinopretty 代码 部分代码复用自Koa工程mkdirsrccdsrcloggerpino。mjsahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a库设置exportconstloggerpino(pretty({colorize:true,translateTime:true,}));storagemysql。mjsmysql2设置importmysqlfrommysql2;exportconstpoolmysql。createPool({host:process。env。DBHOSTlocalhost,port:process。env。DBPORT3306,user:process。env。DBUSERroot,password:process。env。DBPASSWORD,database:process。env。DATABASE,waitForConnections:true,connectionLimit:PROC21,默认10queueLimit:0,});数据库连接参数从操作系统环境变量中读取,也可以使用dotenv库设置import{pool}from。storagemysql。exportconstappexpress();constfilterSubscribersasync(){constclientpool。promise();constqselectid,uuid,name,emailfrombillboard。commonuserorderbyiddesclimit1000;const〔result〕awaitclient。query(q);}constfilterCvsByIdsasync(ids){constclientpool。promise();constqselectid,uuid,commonuserid,status,name,school,major,education,dateendfrombillboard。resumewherecommonuseridin({ids});const〔result〕awaitclient。query(q);}app。route(octoapicv)。get(async(req,res){constsubscribersawaitfilterSubscribers();constidssubscribers。map((s)s。id);constcvsawaitfilterCvsByIds(ids。join(,));constlistcvs。map((c){constsubscribersubscribers。filter((s)s〔id〕c〔commonuserid〕);if(subscribersubscriber。length0){c〔subscriber〕subscriber〔0〕;}});res。json(list);});importcluster,{isMaster}import{logger}from。loggerpino。constportparseInt(process。env。PORT,10)8421;if(isMaster){logger。info(主进程PID:{process。pid});for(leti0;iparseInt(process。env。PROC1,10);i1){cluster。fork();}cluster。on(online,(worker){logger。info(子进程PID:{worker。process。pid},端口:{port});});cluster。on(exit,(worker,code,signal){logger。error(子进程PID:{worker。process。pid}终止,错误代码:{code},信号:{signal});logger。info(由主进程(PID:{process。pid})创建新的子进程);cluster。fork();});}else{import(。app。mjs)。then(({app}){http。createServer(app)。listen(port);});}package。json{scripts:{dev:nodesrcserver。mjs}} 启动程序pnpmrundev