2015-01-24 3 views
-1

이 백엔드의로 나는 Node.js를 가진 푸른 모바일 서비스에 일하고 난 본성의 있기 때문에 타임 아웃 상황의 처리에 어려움을 겪고 :최적화 사용자 정의 API

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까지 다양하며, 이러한 많은 데이터 이동을 줄이기위한 귀하의 제안을 원합니다.

나는 그것을 개선 할 사항 몇 가지에 대해 생각, 내가 생각하십니까 알려 :

  1. 제한을 게타의 결과()
  2. 가 얻을 SQL 서버에서 테이블 값 함수를 확인 기능을 내 필터에 따라 모든 데이터가 양식 클라이언트를받습니다.

그러나 위의 각 다시 무승부가 :

은 첫 번째 옵션과 함께 예를 들어 내가 수있을 것입니다 결과를 원하는 얻을 수있는 것이 무엇인가 내가 클라이언트 최소 10 개 최고의 명소와 게타를 제공해야처럼() 함수는 나를 10을 반환 할 수 있습니다. 그러나이 레코드에서 필터를 수행하면 더 좋은 결과를 얻지 못합니다.

테이블 값 기능 옵션은 성능을 제공하지만 사용자에게 즉시 반환 할 수있는 데이터를 반환하지 않습니다. 마우스 오른쪽 단추로 데이터가 잘 구성되어있다 :

{ ZC : ..., C를 ..., 는 B : [], 는 ..., ...
}

나에게주십시오 모든 포인터.

감사합니다, Attiqe

P.S : 내가 준 모든 함수 이름은 질문을 게시의 이익을 위해 가상 있습니다.

답변

0

뇌가 스톰을 쳐서 이제는 모든 쿼리를 처리하고 테이블을 반환하는 테이블 값 함수를 만들었습니다.이 테이블을 클라이언트로 다시 보냅니다. 이것으로 나는 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; 
 
}

감사합니다, Attiqe