diff --git a/src/config.ts b/src/config.ts index 6a939f1..dc86962 100644 --- a/src/config.ts +++ b/src/config.ts @@ -141,6 +141,8 @@ addDefaults(config, { getTimeout: 40, maxConnections: 15000, maxWriteConnections: 1000, + stopWritingAfterResponseTime: 20, + responseTimePause: 1000, disableHashCache: false }, redisRead: { diff --git a/src/types/config.model.ts b/src/types/config.model.ts index 08729d8..2fa6106 100644 --- a/src/types/config.model.ts +++ b/src/types/config.model.ts @@ -7,6 +7,8 @@ interface RedisConfig extends redis.RedisClientOptions { getTimeout: number; maxConnections: number; maxWriteConnections: number; + stopWritingAfterResponseTime: number; + responseTimePause: number; disableHashCache: boolean; } diff --git a/src/utils/redis.ts b/src/utils/redis.ts index 330f863..13002c6 100644 --- a/src/utils/redis.ts +++ b/src/utils/redis.ts @@ -39,6 +39,7 @@ let writeRequests = 0; const readResponseTime: number[] = []; const writeResponseTime: number[] = []; +let lastResponseTimeLimit = 0; const maxStoredTimes = 200; if (config.redis?.enabled) { @@ -69,8 +70,13 @@ if (config.redis?.enabled) { activeRequests--; resolve(reply); - readResponseTime.push(Date.now() - start); + const responseTime = Date.now() - start; + readResponseTime.push(responseTime); if (readResponseTime.length > maxStoredTimes) readResponseTime.shift(); + if (config.redis.stopWritingAfterResponseTime + && responseTime > config.redis.stopWritingAfterResponseTime) { + lastResponseTimeLimit = Date.now(); + } }).catch((err) => { if (chosenGet === get) { lastClientFail = Date.now(); @@ -85,7 +91,9 @@ if (config.redis?.enabled) { const setFun = >(func: (...args: T) => Promise, params: T): Promise => new Promise((resolve, reject) => { - if (config.redis.maxWriteConnections && activeRequests > config.redis.maxWriteConnections) { + if ((config.redis.maxWriteConnections && activeRequests > config.redis.maxWriteConnections) + || (config.redis.responseTimePause + && Date.now() - lastResponseTimeLimit < config.redis.responseTimePause)) { reject("Too many active requests to write"); return; }