0

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

  • Which price tier of service plan are you using? – Aaron Chen Oct 10 '17 at 05:36
  • The web app is on Standard: 2 Small. But the CPU has never been above 50% and memory sits around 60% under load. The database is S1 Standard (20 DTU). I've found that when I deploy to the cloud, if I set an abnormally high timeout (2 minutes) on connections and DB requests it helps, but doesn't eliminate the problem. – SuperGeek133 Oct 10 '17 at 15:23

0 Answers0