UNPKG

@sex-pomelo/sex-pomelo

Version:

[![NPM version][npm-image-pomelo]][npm-url-pomelo] [![NPM version][npm-image-down]][npm-url-pomelo]

48 lines (43 loc) 1.5 kB
"use strict"; /** * Filter for toobusy. * if the process is toobusy, just skip the new request * @access private */ const reFilename = __filename.substring(__filename.indexOf("node_modules")); const conLogger = require('@sex-pomelo/sex-pomelo-logger').getLogger('con-log', reFilename); let toobusy = null; const DEFAULT_MAXLAG = 70; module.exports = function(maxLag) { return new FilterHandlerTooBusy(maxLag || DEFAULT_MAXLAG); }; /** * This filter is used to detected whether node.js event loop is busy or not. * Once toobusy is triggered, then the filter toobusy will refuse sequential requests, * and call next(err, resp) to pass err to error handler, indicating that server is too busy. * <br/> * 这个filter中,一旦检测到node.js中事件循环的请求等待队列过长,超过一个阀值时,就会触发toobusy。 * 一旦触发了toobusy,那么toobusy的filter中将终止此请求处理链,并在next调用中,传递错误参数 * * @class * @implements {Filter} */ let FilterHandlerTooBusy = function(maxLag) { try { toobusy = require('toobusy'); } catch(e) { } if(!!toobusy) { toobusy.maxLag(maxLag); } }; FilterHandlerTooBusy.prototype.before = function(msg, session, next) { if (!!toobusy && toobusy()) { conLogger.warn('[toobusy] reject request msg: ' + msg); let err = new Error('Server toobusy!'); err.code = 500; next(err); } else { next(); } };