2012-04-20 2 views
1

내 노드 사이트에서 표준 http get을 사용하여 빌드 한 편안한 API 서비스를 호출합니다. 이 통신이 성공적으로 작동 한 후 몇 시간 만 지나면 요청이 전송되는 것을 멈추고 기다리고 결국 시간 초과됩니다.Node.js 서버 사용 후 몇 시간이 지나면 API가 분리됩니다.

호출되는 API는 여전히 다른 곳에서 요청을 완벽하게 수신하지만 요청이 사이트에서 전송되면 API에 도달하지 않습니다.

나는 stream.pipe, util.pump를 시도하고 파일 시스템에 파일을 쓰려고 시도했다.

노드 0.6.15를 사용하고 있습니다. 내 사이트와 호출중인 서비스가 동일한 서버에 있으므로 localhost에 대한 호출이 이루어지고 있습니다. 메모리 사용은 평균 약 10 %의 CPU 사용으로 약 25 % 가량을 차지합니다.

문제가 발생하면 request 모듈을 사용하기 시작했지만 동일한 문제가 발생합니다. varrys를 실패하기 전에 호출 수가 5에서 100 사이 인 것 같습니다. 결국 사이트를 다시 시작해야하지만 다시 작동하게하려면 API를 다시 시작해야합니다. 나는 일이있을 수 있는지에 많이 나는

var Request = require('request'); 
downloadPDF: function(req, res) { 
    Project.findById(req.params.Project_id, function(err, project) { 
    project.findDoc(req.params.doc_id ,function(err, doc) { 
     var pdfileName; 
     pdfileName = doc.name + ".pdf"; 
     res.contentType(pdfileName); 
     res.header('Content-Disposition', "filename=" + pdfileName); 
     Request("http://localhost:3001/" + project._id).pipe(res); 
    }); 
    }); 
} 

: 여기

는 같은 사이트의 코드가 어떻게 생겼는지 대략이다.

답변

0

당신은 완료하는 데 제공된 콜백을 기다리지 않고, 당신의 Project.findById()가 즉시 반환하기 때문에 많은 이해가되지 않습니다 값을 반환하기 위해 콜백을 사용하고 있습니다.

nodejs가 사용하는 프로그래밍 모델은 처음에는 머리를 감싸기가 다소 어렵습니다.

이벤트 구동 프로그래밍 (EDP)에서는 콜백이 실제로 호출 될 때를 알 수 없으므로 결과 값을 무시하고 결과를 얻기 위해 콜백을 제공합니다.

다음은 간단한 예입니다.

HTTP 요청의 결과를 파일에 기록한다고 가정합니다.

절차 적 (EDP가 아닌) 프로그래밍 환경에서 반환 할 값을 반환하는 함수에만 의존합니다.

그래서 우리는 (의사 코드) 같은 것을 작성할 수 있습니다

우리의 프로그램이 이 getContentFromURL()가 원격 서버에 연락 할 때까지, 그 요청을 대기하는 가정
url = 'http://www.example.com' 

    filepath = './example.txt' 

    content = getContentFromURL(url) 

    writeToFile(filepath,content) 

    print "Done!" 

, 결과에 대한을 기다렸다가 그 결과를 프로그램에 반환했습니다. 이 파일 열기 작업을 완료했다 때까지

writeToFile() 함수는 다음 대기, 쓰기에 대한 몇 가지 파일 경로에서 로컬 파일을 열려면 운영 체제를 요청 (일반적으로 는 디스크 대기 드라이버가 그러한 작업을 수행 할 수 있다고보고합니다.)

writeToFile()는 다음이 운영 체제에서 사용하는 드라이버가이 목표를 성취를 알려줍니다 파일을 작성하는 것으로 이야기 될 때까지 운영 체제가 대기 새롭게 문을 연 파일의 내용을 작성하는 것이 요청 결과가 프로그램에 반환되므로 프로그램이 완료되었음을 알 수 있습니다.

nodejs를 해결하기 위해 만들어졌습니다 문제는 더 이상 발생을 기다리는 모든 낭비 모든 시간을 사용하는 것입니다.

원격 웹 요청에서 결과를 검색하거나 파일 시스템에 파일을 작성하는 것과 같은 작업이 완료 될 때 호출되는 함수 (콜백)를 사용하여이를 수행합니다.

는 이벤트 기반 프로그래밍 환경에서 위와 같은 작업을 수행하기 위해, 우리는 같은 프로그램을 쓸 필요가로 : getContentFromURL()를 호출

  • 만 onGetContentFromURLComplete 콜백을 호출

    getContentFromURL(url,onGetContentFromURLComplete) 
    
        function onGetContentFromURLComplete(content,err){ 
         writeToFile(content,onWriteToFileComplete); 
        } 
    
        function onWriteToFileComplete(err){ 
         print "Done!"; 
        } 
    

    일단 웹 요청의 결과가 있고

  • 호출 writeToFile()은 성공적으로 내용 쓰기가 완료되면 성공 메시지를 표시하기 위해 콜백 만 호출합니다.

nodejs의 진정한 마법은 절차 적 기능 에있는 시간의 놀라 울 정도로 많은 양의 동안 다른 모든 종류의 것들을 기다릴 수 있다는 것입니다 입력에 관심 것과 같은 가장 시간이 많이 사용하는 작업에 대한 (그리고 출력)을 완료하십시오.

는 (위 예제는 일반적으로 나쁜 일 간주됩니다 모든 오류를 무시합니다.)

+0

답장을 취소했습니다. 모든 문장에서 돌아 오는 벅의 스타일은 드문 데 동의하지만, 코드는 괜찮은 것 같습니다. 그리고 당신이 옳았다면 100 번 작동하는 방법을 알지 못하고 작동을 멈 춥니 다. –

+0

전체 답변을 해주셔서 감사합니다, 매우 유익한. 결국 반환 값은 그것이 coffeescript로 쓰여졌 기 때문에 js가 더 널리 알려짐에 따라 컴파일 된 코드를 복사하여 붙여 넣기 때문입니다. 그 상황에서는 아무 것도 사용하지 않으므로 반환 값은 부적합합니다. –

0

나는 또한 붙박이 기능을 사용하여 간헐적 인 오류를 경험했다. 주위에 일하는 방법으로 네이티브 wget을 사용합니다. 나는 다음과 같은 것을한다.

var exec = require('child_process').exec; 
function fetchURL(url, callback) { 
    var child; 
    var command = 'wget -q -O - ' + url; 
    child = exec(command, function (error, stdout, stderr) { 
      callback(error, stdout, stderr); 
     }); 
} 

당신은 당신의 필요에 맞게 작동시킬 수있다. 지금까지 그것은 나를 위해 견고한 바위입니다.

+0

덕분에, 이상적으로 표준 node.js 함수를 계속 사용 하겠지만, 그럴 수도 있습니다. –

4

agent.maxSockets를 늘리거나 http.Agent 기능을 비활성화하려고 시도 했습니까? 기본적으로 최신 노드 버전은 HTTP 클라이언트 연결을 위해 소켓 풀링을 사용합니다.이 문제의 원인 일 수 있습니다. http://nodejs.org/api/http.html#http_class_http_agent

+0

기본값을 5에서 300으로 늘렸으므로 불행히도 동일합니다. –

0

이 함수를 호출하는 동안 매개 변수를 기록하려고 시도 했습니까? 오류는 req.params.Project_id에 따라 달라질 수 있습니다. 또한 콜백 함수에서 오류 처리를 제공해야합니다.

실패한 요청을 특정 매개 변수 세트에 못 박아서 재현성있게 만들 수 있다면 노드 검사기를 사용하여 응용 프로그램을 쉽게 디버그 할 수 있습니다.

+0

안녕하세요. 예제에서 로깅을 제거했지만 매번 project_id가 채워집니다. –

4

노드 서버가 얼마나 바쁠 지 모르지만 모든 소켓이 TIME_WAIT 상태 일 수 있습니다.이 명령을 실행하면

, 당신은이 상태에서 얼마나 많은 소켓 표시되어야합니다

netstat -an | awk '/tcp/ {print $6}' | sort | uniq -c 

는 물론, 몇 가지를 가지고 정상입니다. 시스템의 사용 가능한 소켓을 최대한으로 활용하고 TIME_WAIT 이내에 모두 갖게하고 싶을뿐입니다. 이 경우

, 당신은 실제로 단순히 최근의 일을 다시 사용할 수에도 불구하고, 그렇지 않으면 각 요청은 단순히 새로운 소켓을받을 같이 agent.maxSockets가 (@ user1372624의 제안에 반대)를 설정을 줄일 원하는 것 . 응답이없는 상태에 도달하는 데 시간이 오래 걸릴 것입니다.

도움을받을 수있는 Gist (http.Agent에 대한 패치)을 발견했습니다.

이 서버 오류 응답도 도움이 될 수 있습니다 : https://serverfault.com/a/212127

마지막으로, 그들은 당신의 버전 이후 연결 유지 문제를 해결할 수도로, 노드를 업데이트하는 데 도움이 될 가능성도 있습니다 (변경 로그를 확인할 수 있음).

관련 문제