0

我在 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

4

0 回答 0