2013-09-27 4 views
-1

node.js 및 MongoDB/Express를 사용하여 데이터 피드 REST 서비스를 빌드 할 때 쿼리 결과가 작을 때 매우 잘 작동합니다 . 그러나 클라이언트가 1m 행 (이미 gzip을 사용하여 압축)과 같은 대형 데이터 집합을 쿼리 할 때 서버가 중단됩니다. 이 문제는 node.js 단일 스레드 설계로 인해 발생합니까?  큰 데이터 세트/응답은 rest.server (node.js JayData OData 서버)를 사용하여 서버를 정지시킵니다.

이 문제를 해결하기 위해 어떤 조언을 드리고 싶습니다.

모든 의견은

app.use('/d.svc', $data.ODataServer({ 
    type: TYPE, 
    CORS: true, 
    database: 'odata', 
    responseLimit: -1, 
    checkPermission: function (access, user, entitySets, callback) { 
     logger.info('Check Access Permission for User');// + JSON.stringify(user)); 
     if (access & $data.Access.Create) { 
      if (user == 'admin') callback.success(); 
      else callback.error('Auth failed'); 
     } else callback.success(); 
    }, 
    provider: { 
     name: 'mongoDB', 
     databaseName: 'odata', 
     address: settings.host, 
     port: settings.port, 
     username: USER, 
     password: PASSWORD 
    } 
})); 

가 대단히 감사합니다 (JayData 중 하나로, OData 서버 모듈 포함) 서비스에 대한 코드들이다 :

환영합니다.

루크.

+0

네, 큰 결과 집합이 노드의 단일 스레드를 소비하고있는 것처럼 보입니다. – WiredPrairie

+0

클러스터 해결 된 손 문제를 사용하면 모든 CPU 코어를 활용할 수 있으며 대개의 경우 응답이 매우 좋습니다. 그러나 여전히 수백만 개의 쿼리 결과 성능을 개선 할 수있는 방법을 찾아야합니다. – LukeHan

답변

0

한 번의 쿼리에서이 양의 데이터를 전송하면 안됩니다. 결과를 클라이언트 측의 메모리에 보관해야한다고 가정 해보십시오. 어떤 기술을 사용하든 페이징 다운로드가 권장됩니다. JayData의 경우이 blogpost를 기반으로 구현할 수 있습니다. - Synchronized Online/Offline data applications, part 2: Syncing large tables and tables with foreign relations

+0

MongoDB를 분석 애플리케이션의 캐시 레이어로 사용하고 있으며 수백만 레코드 데이터를 클라이언트에 전송해야합니다 (예 : Tableau, 이제 Tableau에서 페이지 매김을 수행 할 방법이 없습니다). JayData는 서버 측에서 클라이언트 측이 아닌 나머지 서비스를 수행하는 데 사용합니다 (페이징하기 쉽습니다). – LukeHan