forked from CITKParus/P8-ExchangeService
Исправление "Сonnection storms" при интенсивных нагрузках по входу (и выходу тоже)
This commit is contained in:
parent
66628f5824
commit
db977f2bb7
16
config.js
16
config.js
@ -40,7 +40,13 @@ let outGoing = {
|
|||||||
//Количество одновременно обрабатываемых исходящих сообщений
|
//Количество одновременно обрабатываемых исходящих сообщений
|
||||||
nMaxWorkers: 3,
|
nMaxWorkers: 3,
|
||||||
//Интервал проверки наличия исходящих сообщений (мс)
|
//Интервал проверки наличия исходящих сообщений (мс)
|
||||||
nCheckTimeout: 1000
|
nCheckTimeout: 1000,
|
||||||
|
//Минимальный размер пула подключений к БД для обработчика исходящих сообщений
|
||||||
|
nPoolMin: 4,
|
||||||
|
//Максимальный размер пула подключений к БД для обработчика исходящих сообщений
|
||||||
|
nPoolMax: 4,
|
||||||
|
//Шаг инкремента подключений к БД в пуле обработчика исходящих сообщений
|
||||||
|
nPoolIncrement: 0
|
||||||
};
|
};
|
||||||
|
|
||||||
//Параметры обработки очереди входящих сообщений
|
//Параметры обработки очереди входящих сообщений
|
||||||
@ -50,7 +56,13 @@ let inComing = {
|
|||||||
//Максимальный размер входящего сообщения (мб)
|
//Максимальный размер входящего сообщения (мб)
|
||||||
nMsgMaxSize: 10,
|
nMsgMaxSize: 10,
|
||||||
//Каталог размещения статических ресурсов
|
//Каталог размещения статических ресурсов
|
||||||
sStaticDir: "static"
|
sStaticDir: "static",
|
||||||
|
//Минимальный размер пула подключений к БД для обработчика входящих сообщений
|
||||||
|
nPoolMin: 10,
|
||||||
|
//Максимальный размер пула подключений к БД для обработчика входящих сообщений
|
||||||
|
nPoolMax: 10,
|
||||||
|
//Шаг инкремента подключений к БД в пуле обработчика входящих сообщений
|
||||||
|
nPoolIncrement: 0
|
||||||
};
|
};
|
||||||
|
|
||||||
//Параметры отправки E-Mail уведомлений
|
//Параметры отправки E-Mail уведомлений
|
||||||
|
@ -40,7 +40,13 @@ let outGoing = {
|
|||||||
//Количество одновременно обрабатываемых исходящих сообщений
|
//Количество одновременно обрабатываемых исходящих сообщений
|
||||||
nMaxWorkers: 1,
|
nMaxWorkers: 1,
|
||||||
//Интервал проверки наличия исходящих сообщений (мс)
|
//Интервал проверки наличия исходящих сообщений (мс)
|
||||||
nCheckTimeout: 500
|
nCheckTimeout: 500,
|
||||||
|
//Минимальный размер пула подключений к БД для обработчика исходящих сообщений
|
||||||
|
nPoolMin: 4,
|
||||||
|
//Максимальный размер пула подключений к БД для обработчика исходящих сообщений
|
||||||
|
nPoolMax: 4,
|
||||||
|
//Шаг инкремента подключений к БД в пуле обработчика исходящих сообщений
|
||||||
|
nPoolIncrement: 0
|
||||||
};
|
};
|
||||||
|
|
||||||
//Параметры обработки очереди входящих сообщений
|
//Параметры обработки очереди входящих сообщений
|
||||||
@ -50,7 +56,13 @@ let inComing = {
|
|||||||
//Максимальный размер входящего сообщения (мб)
|
//Максимальный размер входящего сообщения (мб)
|
||||||
nMsgMaxSize: 10,
|
nMsgMaxSize: 10,
|
||||||
//Каталог размещения статических ресурсов
|
//Каталог размещения статических ресурсов
|
||||||
sStaticDir: "static"
|
sStaticDir: "static",
|
||||||
|
//Минимальный размер пула подключений к БД для обработчика входящих сообщений
|
||||||
|
nPoolMin: 10,
|
||||||
|
//Максимальный размер пула подключений к БД для обработчика входящих сообщений
|
||||||
|
nPoolMax: 10,
|
||||||
|
//Шаг инкремента подключений к БД в пуле обработчика входящих сообщений
|
||||||
|
nPoolIncrement: 0
|
||||||
};
|
};
|
||||||
|
|
||||||
//Параметры отправки E-Mail уведомлений
|
//Параметры отправки E-Mail уведомлений
|
||||||
|
@ -199,7 +199,14 @@ class ParusAppServer {
|
|||||||
`Версия сервера приложений: ${prms.config.common.sVersion}, релиз: ${prms.config.common.sRelease}`
|
`Версия сервера приложений: ${prms.config.common.sVersion}, релиз: ${prms.config.common.sRelease}`
|
||||||
);
|
);
|
||||||
//Создаём подключение к БД
|
//Создаём подключение к БД
|
||||||
this.dbConn = new db.DBConnector({ connectSettings: prms.config.dbConnect });
|
this.dbConn = new db.DBConnector({
|
||||||
|
connectSettings: {
|
||||||
|
...prms.config.dbConnect,
|
||||||
|
nPoolMin: prms.config.inComing.nPoolMin,
|
||||||
|
nPoolMax: prms.config.inComing.nPoolMax,
|
||||||
|
nPoolIncrement: prms.config.inComing.nPoolIncrement
|
||||||
|
}
|
||||||
|
});
|
||||||
//Создаём модуль рассылки уведомлений
|
//Создаём модуль рассылки уведомлений
|
||||||
this.notifier = new ntf.Notifier({ logger: this.logger, mail: prms.config.mail });
|
this.notifier = new ntf.Notifier({ logger: this.logger, mail: prms.config.mail });
|
||||||
//Создаём обработчик очереди исходящих
|
//Создаём обработчик очереди исходящих
|
||||||
|
@ -151,7 +151,12 @@ class OutQueue extends EventEmitter {
|
|||||||
//Отдаём команду дочернему процессу обработчика на старт исполнения
|
//Отдаём команду дочернему процессу обработчика на старт исполнения
|
||||||
prms.proc.send({
|
prms.proc.send({
|
||||||
nQueueId: prms.queue.nId,
|
nQueueId: prms.queue.nId,
|
||||||
connectSettings: this.dbConn.connectSettings,
|
connectSettings: {
|
||||||
|
...this.dbConn.connectSettings,
|
||||||
|
nPoolMin: this.outGoing.nPoolMin,
|
||||||
|
nPoolMax: this.outGoing.nPoolMax,
|
||||||
|
nPoolIncrement: this.outGoing.nPoolIncrement
|
||||||
|
},
|
||||||
service: _.find(this.services, { nId: prms.queue.nServiceId }),
|
service: _.find(this.services, { nId: prms.queue.nServiceId }),
|
||||||
function: _.find(_.find(this.services, { nId: prms.queue.nServiceId }).functions, {
|
function: _.find(_.find(this.services, { nId: prms.queue.nServiceId }).functions, {
|
||||||
nId: prms.queue.nServiceFnId
|
nId: prms.queue.nServiceFnId
|
||||||
@ -354,7 +359,7 @@ class OutQueue extends EventEmitter {
|
|||||||
async restartDetectingLoop() {
|
async restartDetectingLoop() {
|
||||||
//Включаем опрос очереди только если установлен флаг работы
|
//Включаем опрос очереди только если установлен флаг работы
|
||||||
if (this.bWorking) {
|
if (this.bWorking) {
|
||||||
this.nDetectingLoopTimeOut = await setTimeout(async () => {
|
this.nDetectingLoopTimeOut = setTimeout(async () => {
|
||||||
await this.outDetectingLoop();
|
await this.outDetectingLoop();
|
||||||
}, this.outGoing.nCheckTimeout);
|
}, this.outGoing.nCheckTimeout);
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,24 @@ const validateInComingPort = val => val >= 0 && val <= 65535 && Number.isInteger
|
|||||||
//Функция проверки значения порта сервера обслуживания входящих сообщений
|
//Функция проверки значения порта сервера обслуживания входящих сообщений
|
||||||
const validateMsgMaxSize = val => val >= 1 && val <= 1000 && Number.isInteger(val);
|
const validateMsgMaxSize = val => val >= 1 && val <= 1000 && Number.isInteger(val);
|
||||||
|
|
||||||
|
//Функция проверки значения минимального размера пула подключений к БД для обработчика исходящих сообщений
|
||||||
|
const validatePoolMinOutGoing = val => val >= 0 && val <= 10;
|
||||||
|
|
||||||
|
//Функция проверки значения максимального размера пула подключений к БД для обработчика исходящих сообщений
|
||||||
|
const validatePoolMaxOutGoing = val => val >= 1 && val <= 10;
|
||||||
|
|
||||||
|
//Функция проверки значения шага инкремента подключений к БД в пуле обработчика исходящих сообщений
|
||||||
|
const validatePoolIncrementOutGoing = val => val >= 0 && val <= 10;
|
||||||
|
|
||||||
|
//Функция проверки значения минимального размера пула подключений к БД для обработчика входящих сообщений
|
||||||
|
const validatePoolMinInComing = val => val >= 0 && val <= 1000;
|
||||||
|
|
||||||
|
//Функция проверки значения максимального размера пула подключений к БД для обработчика входящих сообщений
|
||||||
|
const validatePoolMaxInComing = val => val >= 1 && val <= 1000;
|
||||||
|
|
||||||
|
//Функция проверки значения шага инкремента подключений к БД в пуле обработчика входящих сообщений
|
||||||
|
const validatePoolIncrementInComing = val => val >= 0 && val <= 1000;
|
||||||
|
|
||||||
//Схема валидации общих параметров сервера приложений
|
//Схема валидации общих параметров сервера приложений
|
||||||
const common = new Schema({
|
const common = new Schema({
|
||||||
//Версия сервера приложений
|
//Версия сервера приложений
|
||||||
@ -160,6 +178,48 @@ const outGoing = new Schema({
|
|||||||
validateCheckTimeout: path =>
|
validateCheckTimeout: path =>
|
||||||
`Значение интервала проверки наличия исходящих сообщений (${path}) должно быть целым числом в диапазоне от 100 до 60000`
|
`Значение интервала проверки наличия исходящих сообщений (${path}) должно быть целым числом в диапазоне от 100 до 60000`
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
//Минимальный размер пула подключений к БД для обработчика исходящих сообщений
|
||||||
|
nPoolMin: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
use: { validatePoolMinOutGoing },
|
||||||
|
message: {
|
||||||
|
type: path =>
|
||||||
|
`Минимальный размер пула подключений к БД для обработчика исходящих сообщений (${path}) имеет некорректный тип данных (ожидалось - Number)`,
|
||||||
|
required: path =>
|
||||||
|
`Не указан минимальный размер пула подключений к БД для обработчика исходящих сообщений (${path})`,
|
||||||
|
validatePoolMinOutGoing: path =>
|
||||||
|
`Значение минимального размера пула подключений к БД для обработчика исходящих сообщений (${path}) должно быть целым числом в диапазоне от 0 до 10`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
//Максимальный размер пула подключений к БД для обработчика исходящих сообщений
|
||||||
|
nPoolMax: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
use: { validatePoolMaxOutGoing },
|
||||||
|
message: {
|
||||||
|
type: path =>
|
||||||
|
`Максимальный размер пула подключений к БД для обработчика исходящих сообщений (${path}) имеет некорректный тип данных (ожидалось - Number)`,
|
||||||
|
required: path =>
|
||||||
|
`Не указан максимальный размер пула подключений к БД для обработчика исходящих сообщений (${path})`,
|
||||||
|
validatePoolMaxOutGoing: path =>
|
||||||
|
`Значение максимального размера пула подключений к БД для обработчика исходящих сообщений (${path}) должно быть целым числом в диапазоне от 1 до 10`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
//Шаг инкремента подключений к БД в пуле обработчика исходящих сообщений
|
||||||
|
nPoolIncrement: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
use: { validatePoolIncrementOutGoing },
|
||||||
|
message: {
|
||||||
|
type: path =>
|
||||||
|
`Шаг инкремента подключений к БД в пуле обработчика исходящих сообщений (${path}) имеет некорректный тип данных (ожидалось - Number)`,
|
||||||
|
required: path =>
|
||||||
|
`Не указан шаг инкремента подключений к БД в пуле обработчика исходящих сообщений (${path})`,
|
||||||
|
validatePoolIncrementOutGoing: path =>
|
||||||
|
`Значение шага инкремента подключений к БД в пуле обработчика исходящих сообщений (${path}) должно быть целым числом в диапазоне от 0 до 10`
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -200,6 +260,48 @@ const inComing = new Schema({
|
|||||||
`Каталог размещения статических ресурсов (${path}) имеет некорректный тип данных (ожидалось - String)`,
|
`Каталог размещения статических ресурсов (${path}) имеет некорректный тип данных (ожидалось - String)`,
|
||||||
required: path => `Не указан каталог размещения статических ресурсов (${path})`
|
required: path => `Не указан каталог размещения статических ресурсов (${path})`
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
//Минимальный размер пула подключений к БД для обработчика входящих сообщений
|
||||||
|
nPoolMin: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
use: { validatePoolMinInComing },
|
||||||
|
message: {
|
||||||
|
type: path =>
|
||||||
|
`Минимальный размер пула подключений к БД для обработчика входящих сообщений (${path}) имеет некорректный тип данных (ожидалось - Number)`,
|
||||||
|
required: path =>
|
||||||
|
`Не указан минимальный размер пула подключений к БД для обработчика входящих сообщений (${path})`,
|
||||||
|
validatePoolMinInComing: path =>
|
||||||
|
`Значение минимального размера пула подключений к БД для обработчика входящих сообщений (${path}) должно быть целым числом в диапазоне от 0 до 1000`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
//Максимальный размер пула подключений к БД для обработчика входящих сообщений
|
||||||
|
nPoolMax: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
use: { validatePoolMaxInComing },
|
||||||
|
message: {
|
||||||
|
type: path =>
|
||||||
|
`Максимальный размер пула подключений к БД для обработчика входящих сообщений (${path}) имеет некорректный тип данных (ожидалось - Number)`,
|
||||||
|
required: path =>
|
||||||
|
`Не указан максимальный размер пула подключений к БД для обработчика входящих сообщений (${path})`,
|
||||||
|
validatePoolMaxInComing: path =>
|
||||||
|
`Значение максимального размера пула подключений к БД для обработчика входящих сообщений (${path}) должно быть целым числом в диапазоне от 1 до 1000`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
//Шаг инкремента подключений к БД в пуле обработчика входящих сообщений
|
||||||
|
nPoolIncrement: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
use: { validatePoolIncrementInComing },
|
||||||
|
message: {
|
||||||
|
type: path =>
|
||||||
|
`Шаг инкремента подключений к БД в пуле обработчика входящих сообщений (${path}) имеет некорректный тип данных (ожидалось - Number)`,
|
||||||
|
required: path =>
|
||||||
|
`Не указан шаг инкремента подключений к БД в пуле обработчика входящих сообщений (${path})`,
|
||||||
|
validatePoolIncrementInComing: path =>
|
||||||
|
`Значение шага инкремента подключений к БД в пуле обработчика входящих сообщений (${path}) должно быть целым числом в диапазоне от 0 до 1000`
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -28,9 +28,11 @@ const readCursorData = cursor => {
|
|||||||
rows.push(row);
|
rows.push(row);
|
||||||
});
|
});
|
||||||
queryStream.on("error", err => {
|
queryStream.on("error", err => {
|
||||||
|
queryStream.destroy();
|
||||||
reject(new Error(err.message));
|
reject(new Error(err.message));
|
||||||
});
|
});
|
||||||
queryStream.on("close", () => {
|
queryStream.on("close", () => {
|
||||||
|
queryStream.destroy();
|
||||||
resolve(rows);
|
resolve(rows);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -44,6 +46,9 @@ const connect = async prms => {
|
|||||||
password: prms.sPassword,
|
password: prms.sPassword,
|
||||||
connectString: prms.sConnectString,
|
connectString: prms.sConnectString,
|
||||||
queueTimeout: 600000,
|
queueTimeout: 600000,
|
||||||
|
poolMin: prms.nPoolMin ? prms.nPoolMin : 4,
|
||||||
|
poolMax: prms.nPoolMax ? prms.nPoolMax : 4,
|
||||||
|
poolIncrement: prms.nPoolIncrement ? prms.nPoolIncrement : 0,
|
||||||
sessionCallback: (connection, requestedTag, callback) => {
|
sessionCallback: (connection, requestedTag, callback) => {
|
||||||
if (prms.sSessionAppName) connection.module = prms.sSessionAppName;
|
if (prms.sSessionAppName) connection.module = prms.sSessionAppName;
|
||||||
connection.execute(`ALTER SESSION SET CURRENT_SCHEMA=${prms.sSchema}`).then(
|
connection.execute(`ALTER SESSION SET CURRENT_SCHEMA=${prms.sSchema}`).then(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user