优化自定义 API
Optimize Custom API
我正在使用 Node.js 开发 Azure 移动服务,因为它是后端,由于它的性质,我很难处理它的超时情况:
var Dict = require("collections/dict");
var q = require('q');
var async = require('async');
exports.post = function(request, response) {
console.log('body : ' + request.body);
mssql = request.service.mssql;
tables = request.service.tables;
//Get payload from request body
// extracted parameters;
var processRecords;
var sp = new Dict();
getA(longitude, latitude)
.then(function(results) {
async.each(results,
function(value, callback) {
var zc = value.zc;
var c = value.c;
processRecord(zc, c)
.then(function(record) {
sp.add({
zc: zc,
c: c,
B: record[0],
C: record[1],
D: record[2],
E: record[3],
F: record[4],
G: record[5]
}, zc);
callback();
})
.catch(function(err) {
console.log("error is: " + err);
callback(err);
});
},
function(err) {
if (err) {
response.send(statusCodes.INTERNAL_SERVER_ERROR, err);
} else {
response.send(statusCodes.OK, sp.values());
}
});
})
.catch(function(err) {
response.send(statusCodes.INTERNAL_SERVER_ERROR, err);
});
}
function processRecord(zc,c) {
return q.all([
getB(zc)
,getC(c)
,getD(zc)
,getE(zc,c)
,getF(zc,c)
,getG(zc,c)
]);
}
function getA(longitude, latitude) {
var deferred = q.defer();
var sql = "a query from table function";
mssql.query(sql, [longitude, latitude/*some param*/], {
success: function(results) {
deferred.resolve(results);
},
error: function(err) {
deferred.reject(err);
}
});
return deferred.promise;
}
function getB(zc) {
var deferred = q.defer();
var sql = " a queryy ";
mssql.query(sql, [zc, /*some param*/ ], {
success: function(results) {
deferred.resolve(results);
},
error: function(err) {
deferred.reject(err);
}
});
return deferred.promise;
}
function getC(c) {
var deferred = q.defer();
var sql = "query";
mssql.query(sql, [c /*some param*/], {
success: function(results) {
deferred.resolve(results);
},
error: function(err) {
deferred.reject(err);
}
});
return deferred.promise;
}
function getD(zc) {
var deferred = q.defer();
var sql = "query";
mssql.query(sql, [zc /*some param*/], {
success: function(results) {
deferred.resolve(results);
},
error: function(err) {
deferred.reject(err);
}
});
return deferred.promise;
}
function getE(zc, c) {
var deferred = q.defer();
var sql = "query";
mssql.query(sql, [zc,c /*some param*/], {
success: function(results) {
deferred.resolve(results);
},
error: function(err) {
deferred.reject(err);
}
});
return deferred.promise;
}
function getF(zc, c) {
var deferred = q.defer();
var sql = "query";
mssql.query(sql, [zc, c /*some param*/], {
success: function(results) {
deferred.resolve(results);
},
error: function(err) {
deferred.reject(err);
}
});
return deferred.promise;
}
function getG(zc, c) {
var deferred = q.defer();
var sql = "query";
mssql.query(sql, [zc, c /*some param*/], {
success: function(results) {
deferred.resolve(results);
},
error: function(err) {
deferred.reject(err);
}
});
return deferred.promise;
}
现在它是非常数据密集型自定义 API。我从 getA() 得到的结果从 2 到 200 不等,我想要你的建议来减少这些数据旅行。
我想过一些改进它的方法,让我知道你的想法:
- 限制 getA() 函数的结果
- 在 SQL 服务器中创建一个 Table 值函数,以根据我从客户端收到的过滤器获取所有数据。
但以上各有缺点:
例如,对于第一个选项,我将能够得到想要的结果,就像我必须给客户至少 10 个最佳点,而 getA() 函数可能 return 是我 10,但是当我过滤它时在这些记录上,它没有任何好的结果。
Table 值函数选项可能会给我带来性能,但它不会 return 我可以立即 return 给用户的数据。正确的数据结构良好:
{
zc: ...,
C:...,
乙:[],
...,
...
}
请多指教。
谢谢,
态度
P.S: 为了发帖问题,我给的所有函数名都是虚构的。
因此,经过一番头脑风暴后,我创建了一个 Table 值函数,它现在正在处理所有查询并返回给我 table,我将其发送回客户端。有了这个,我将它从 30 秒以上的响应减少到 5 秒以下。
exports.post = function(request, response) {
console.log('body : ' + request.body);
mssql = request.service.mssql;
tables = request.service.tables;
//Get filters from request body
var latitude = request.body.latitude;
var longitude = request.body.longitude;
getResults(longitude, latitude, offset)
.then(function(results) {
response.send(statusCodes.OK, results);
})
.catch(function(err) {
console.log("error is: " + err);
response.send(statusCodes.INTERNAL_SERVER_ERROR, err);
});
}
function getResults(longitude, latitude, offset) {
var deferred = q.defer();
var sql = "SELECT * FROM [GetResults] (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ";
mssql.query(sql, [latitude, longitude /*more param*/], {
success: function(results) {
console.log("count: " + results.length);
deferred.resolve(results);
},
error: function(err) {
console.log("error is: " + err);
deferred.reject(err);
}
});
return deferred.promise;
}
谢谢,
态度
我正在使用 Node.js 开发 Azure 移动服务,因为它是后端,由于它的性质,我很难处理它的超时情况:
var Dict = require("collections/dict");
var q = require('q');
var async = require('async');
exports.post = function(request, response) {
console.log('body : ' + request.body);
mssql = request.service.mssql;
tables = request.service.tables;
//Get payload from request body
// extracted parameters;
var processRecords;
var sp = new Dict();
getA(longitude, latitude)
.then(function(results) {
async.each(results,
function(value, callback) {
var zc = value.zc;
var c = value.c;
processRecord(zc, c)
.then(function(record) {
sp.add({
zc: zc,
c: c,
B: record[0],
C: record[1],
D: record[2],
E: record[3],
F: record[4],
G: record[5]
}, zc);
callback();
})
.catch(function(err) {
console.log("error is: " + err);
callback(err);
});
},
function(err) {
if (err) {
response.send(statusCodes.INTERNAL_SERVER_ERROR, err);
} else {
response.send(statusCodes.OK, sp.values());
}
});
})
.catch(function(err) {
response.send(statusCodes.INTERNAL_SERVER_ERROR, err);
});
}
function processRecord(zc,c) {
return q.all([
getB(zc)
,getC(c)
,getD(zc)
,getE(zc,c)
,getF(zc,c)
,getG(zc,c)
]);
}
function getA(longitude, latitude) {
var deferred = q.defer();
var sql = "a query from table function";
mssql.query(sql, [longitude, latitude/*some param*/], {
success: function(results) {
deferred.resolve(results);
},
error: function(err) {
deferred.reject(err);
}
});
return deferred.promise;
}
function getB(zc) {
var deferred = q.defer();
var sql = " a queryy ";
mssql.query(sql, [zc, /*some param*/ ], {
success: function(results) {
deferred.resolve(results);
},
error: function(err) {
deferred.reject(err);
}
});
return deferred.promise;
}
function getC(c) {
var deferred = q.defer();
var sql = "query";
mssql.query(sql, [c /*some param*/], {
success: function(results) {
deferred.resolve(results);
},
error: function(err) {
deferred.reject(err);
}
});
return deferred.promise;
}
function getD(zc) {
var deferred = q.defer();
var sql = "query";
mssql.query(sql, [zc /*some param*/], {
success: function(results) {
deferred.resolve(results);
},
error: function(err) {
deferred.reject(err);
}
});
return deferred.promise;
}
function getE(zc, c) {
var deferred = q.defer();
var sql = "query";
mssql.query(sql, [zc,c /*some param*/], {
success: function(results) {
deferred.resolve(results);
},
error: function(err) {
deferred.reject(err);
}
});
return deferred.promise;
}
function getF(zc, c) {
var deferred = q.defer();
var sql = "query";
mssql.query(sql, [zc, c /*some param*/], {
success: function(results) {
deferred.resolve(results);
},
error: function(err) {
deferred.reject(err);
}
});
return deferred.promise;
}
function getG(zc, c) {
var deferred = q.defer();
var sql = "query";
mssql.query(sql, [zc, c /*some param*/], {
success: function(results) {
deferred.resolve(results);
},
error: function(err) {
deferred.reject(err);
}
});
return deferred.promise;
}
现在它是非常数据密集型自定义 API。我从 getA() 得到的结果从 2 到 200 不等,我想要你的建议来减少这些数据旅行。
我想过一些改进它的方法,让我知道你的想法:
- 限制 getA() 函数的结果
- 在 SQL 服务器中创建一个 Table 值函数,以根据我从客户端收到的过滤器获取所有数据。
但以上各有缺点:
例如,对于第一个选项,我将能够得到想要的结果,就像我必须给客户至少 10 个最佳点,而 getA() 函数可能 return 是我 10,但是当我过滤它时在这些记录上,它没有任何好的结果。
Table 值函数选项可能会给我带来性能,但它不会 return 我可以立即 return 给用户的数据。正确的数据结构良好:
{
zc: ...,
C:...,
乙:[],
...,
...
}
请多指教。
谢谢, 态度
P.S: 为了发帖问题,我给的所有函数名都是虚构的。
因此,经过一番头脑风暴后,我创建了一个 Table 值函数,它现在正在处理所有查询并返回给我 table,我将其发送回客户端。有了这个,我将它从 30 秒以上的响应减少到 5 秒以下。
exports.post = function(request, response) {
console.log('body : ' + request.body);
mssql = request.service.mssql;
tables = request.service.tables;
//Get filters from request body
var latitude = request.body.latitude;
var longitude = request.body.longitude;
getResults(longitude, latitude, offset)
.then(function(results) {
response.send(statusCodes.OK, results);
})
.catch(function(err) {
console.log("error is: " + err);
response.send(statusCodes.INTERNAL_SERVER_ERROR, err);
});
}
function getResults(longitude, latitude, offset) {
var deferred = q.defer();
var sql = "SELECT * FROM [GetResults] (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ";
mssql.query(sql, [latitude, longitude /*more param*/], {
success: function(results) {
console.log("count: " + results.length);
deferred.resolve(results);
},
error: function(err) {
console.log("error is: " + err);
deferred.reject(err);
}
});
return deferred.promise;
}
谢谢, 态度