I have a nodejs webapp on azure, that I can test the code locally at 50 rps with 100 concurrent users for 10 minutes, and I receive zero errors. And each of those requests is calling the db and writing.
However when deployed on Azure, I constantly get request timeouts, connection resets, and connection timeouts, under less load as well (~1000 requests a minute on average).
The main source of traffic is an Azure Function that posts events to my endpoint. I then do a lookup to see if I have the user/event in my table and then store the event.
What info would anyone like to help me diagnose?
I'm using a global shared connection pool (I pass this to each request):
app.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);
}
})
}
These are the most common errors:
error: BadRequestError: request aborted
error getting users: TimeoutError: ResourceRequest timed out
sql error: ConnectionError: Failed to connect to serveraddresshere - write ECONNRESET