我在 azure 上有一个 nodejs webapp,我可以用 100 个并发用户以 50 rps 在本地测试代码 10 分钟,并且我收到零错误。每个请求都在调用数据库并写入。
但是,当部署在 Azure 上时,我会不断收到请求超时、连接重置和连接超时,而且负载也较小(平均每分钟约 1000 个请求)。
流量的主要来源是一个将事件发布到我的端点的 Azure 函数。然后我进行查找以查看我的表中是否有用户/事件,然后存储该事件。
有人想帮助我诊断什么信息?
我正在使用全局共享连接池(我将其传递给每个请求):
应用程序.js
const winston = require('winston');
var sql = require('mssql');
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var db = require('./utils/db_utils.js');
var https = require('https');
const logger = new(winston.Logger)({
transports: [
new (winston.transports.Console)({
'timestamp':true
})
]
})
const config = {
user: **dbuser**,
password: **dbpass**,
server: **dbserver**,
database: **dbname**,
options: {
encrypt: true
},
pool: {
max: process.env.APPSETTING_max_pool || 500,
min: 0
}
}
const pool = new sql.ConnectionPool(config);
pool.connect(err => {
if (err) {
logger.info("Connection error: ", err);
} else {
logger.info("sql is running!");
var server = app.listen(process.env.PORT || 3000, () => {
var port = server.address().port;
logger.info('app listening on port: ', port);
});
return;
}
});
pool.on('error', function (err) {
logger.info("sql error: ", err);
})
app.post('/event', function(req, res) {
var azureEvent = req.body;
res.status(200);
res.send("Message received");
db.getUsersandTokens(pool, azureEvent.uniqueid, function(err, result) {
if (err) {
logger.error("error getting users");
} else {
var users = result.recordset;
if (result.recordset.length < 1) {
return;
} else {
logger.info("event for known device received: ", JSON.stringify(azureEvent));
db.addEvent(pool, azureEvent.sequenceNumber, azureEvent.event, azureEvent.receivedTime, azureEvent.queuedTime, azureEvent.uniqueid, azureEvent.messageType, function() {
if (azureEvent.messageType == "SystemSwitch") {
db.updateMode(pool, azureEvent.event, azureEvent.uniqueid, function() {
return;
});
} else {
return;
}
});
}
}
});
});
db_util.js
var sql = require('mssql');
exports.getUsersandTokens = function(pool, uniqueid, callback) {
var request = new sql.Request(pool);
request.input('macId', sql.NVarChar, macId);
request.query('SELECT DISTINCT Users.User_Id, Devices.uniqueid, Devices.User_Id, Users.tokenb, Users.tokena, Users.region, Devices.device_id, Devices.Mode FROM dbo.Devices INNER JOIN Users ON Devices.uniqueid = @macId and Devices.User_Id=Users.User_Id', function(err, result) {
if (err) {
logger.error("error getting users: ", err);
callback(err);
} else {
callback(null, result);
}
})
}
这些是最常见的错误:
错误:BadRequestError:请求中止
获取用户时出错:TimeoutError: ResourceRequest 超时
sql 错误:ConnectionError:无法连接到此处的服务器地址- 写入ECONNRESET