Я пишу несколько сценариев функций Azure, которые читают и записывают из / во внутреннюю базу данных и отображают соответствующую информацию на веб-странице.
Я заметил чрезмерную медлительность или даже тайм-аут в веб-интерфейсе при загрузке веб-страницы, которая вызывает сценарий функции Azure. После дальнейшего расследования я понял, что следующее:
- Скриптам функций Azure иногда требуется от 10 секунд до более 1 минуты для подключения к базе данных SQL.
- Иногда сценарии запускаются за несколько миллисекунд, а иногда для полного запуска сценария требуется более 3 минут.
Вот мой сценарий функции Azure:
module.exports = function(context, req) {
context.log("Function Started: " + new Date());
// Import package
const sql = require('mssql');
var _ = require('underscore-node');
var moment = require('moment');
var Promise = require('promise');
// Create a configuration object for our Azure SQL connection parameters
var config = {
server: "***", // Use your SQL server name
database: "***", // Database to connect to
user: "***", // Use your username
password: "***", // Use your password
port: ***,
// Since we're on Windows Azure, we need to set the following options
options: {
encrypt: true
},
multipleStatements: true,
parseJSON: true
};
var flagDefinitionId = null;
if (req.query.Id == null || req.query.Id == "" || req.query.Id.length == 0) {
context.res = {
// status: 200, /* Defaults to 200 */
body: "No have flagDefinitionId "
};
context.done();
// return;
}
var listTicketsFlag = [];
flagDefinitionId = req.query.Id;
sql.close();
var DBSchema = "b8akjsms2_st.";
sql.connect(config).then(function() {
context.log("SQL Connected: " + new Date());
var getAllEventTicketGoToMarket = new Promise(function(resolve, reject) {
var queryGetEvent = ";WITH EventLog1 AS(" +
" SELECT MD1, max([DateTime]) as LTime from " + DBSchema + "EventLog" +
" where ([Event] = 'Ticket_Go_To_Market' OR [Event] = 'Acknowledge_Timeout')" +
" group by MD1 )" +
" SELECT * from ( SELECT EV.MD1 , EV.MD2," +
" (SELECT COUNT(*) from " + DBSchema + "EventLog where MD1 = EV.MD1 and [Event] = 'Market_Ticket_Clear') as TotalClear" +
" FROM " + DBSchema + "[Ticket] T" +
" JOIN (SELECT E.* from " + DBSchema + "EventLog E join EventLog1 E1 on E.MD1 = E1.MD1 and E.[DateTime] = E1.LTime) EV ON T.Id = EV.MD1" +
" WHERE T.IsInMarket = 1 and EV.MD2 <> ''" +
" AND T.Id NOT IN (Select TicketId from " + DBSchema + "TicketFlag where FlagDefinitionId = " + flagDefinitionId + ")" +
" ) R where R.TotalClear > 0";
context.log("get event log - Ticket_Go_To_Market" + queryGetEvent);
new sql.Request().query(queryGetEvent, (err, result) => {
context.log("this is --------> EventLog " + result.recordset.length);
resolve(result.recordset);
});
});
Promise.all([getAllEventTicketGoToMarket]).then(function(values) {
var ticketGoToMarket = values[0];
context.log("this is --------> values: " + values[0].length + " ==+++++==== " + JSON.stringify(values[0], null, 2));
if (ticketGoToMarket.length != 0) {
listTicketsFlag = _.filter(ticketGoToMarket, function(num) {
var countSP = num.MD2.split(',');
// context.log("countSP =====> " + countSP.length + "num.TotalClear ==>" + num.TotalClear)
if (num.TotalClear > countSP.length) {
return num.MD1;
}
});
// context.log("listTicketsFlag =====> " + JSON.stringify(listTicketsFlag, null, 2));
}
insertTicketFlag();
});
function insertTicketFlag() {
context.log("this is ----- ===> Insert: " + listTicketsFlag);
// insert
var insertTicketFlagPromise = new Promise(function(resolve, reject) {
context.log("listTicketFlag ----- ===> " + listTicketsFlag.length);
if (listTicketsFlag.length == 0) {
context.log(" -------------------- No have ticket need FLAG");
resolve();
} else {
// insert new data to TicketFlag FlagTickets
var listTicketInsert = ""; //convertArrayToSQLString(listTicketsFlag, true, flagDefinitionId);
var len = listTicketsFlag.length - 1;
for (var j = 0; j <= len; j++) {
listTicketInsert += '(\'' + listTicketsFlag[j] + '\', \'' + flagDefinitionId + '\')';
if (j != len) {
listTicketInsert += ",";
}
}
context.log("HERE : " + listTicketInsert);
var insertQuery = 'Insert into ' + DBSchema + '[TicketFlag] (TicketId, FlagDefinitionId) values ' + listTicketInsert + '';
context.log("this is --------> InsertQuery" + insertQuery);
// return;
context.log("read data of FlagRule");
new sql.Request().query(insertQuery, (err, result) => {
context.log("this is --------> insertQuery");
resolve(result);
});
}
});
Promise.all([insertTicketFlagPromise]).then(function(values) {
context.log("DONE ALL");
sql.close();
context.done();
})
}
}).catch(function(err) {
console.log(err);
context.done();
});
};
Как решить эту проблему с медлительностью?