2013-06-17 2 views
13

실례합니다. 현재 Apache 또는 서버 관리와 아무런 상호 작용이없는 PHP 백그라운드에서 Node를 사용하는 방법을 배우고 있습니다. 나는 Heroku를 사용하여 Node 프로젝트를 호스팅하고 Cloud9 IDE에서 직접 푸시합니다.하나의 Dyno를 가진 Heroku의 Node.js 자식 프로세스

내가 읽은 바로는 Heroku dyno는 단일 웹 프로세스로, 추가 dynos를 구입하면 더 많은 트래픽을 처리 할 수 ​​있습니다. dynos를 늘리면 처리 할 수있는 요청량의 크기가 증가하기 때문입니다 언제든지.

저는 노드가 요청을 하나씩 처리하는 단일 스레드 시스템이라는 것을 알고 있습니다. 따라서 데이터베이스 요청, 처리 파일 등과 같이 처리하는 데 시간이 걸리는 모든 것에 대해 하위 프로세스를 생성 할 수 있습니다.

그래서 하나의 dyno로 하위 프로세스를 생성하면 어떻게 될까요? 다른 dyno가 작동하지 않아도됩니까? 확실히 Node가 단일 프로세스를 실행 중이고 단일 프로세스에서 하나의 프로세스 만 사용할 수있는 경우 추가 프로세스는 해당 프로세스도 처리해야합니다.

아니면 내가 잘못 했습니까?

+1

데이터베이스 요청과 파일 처리를 비동기 적으로 수행하기 위해 별도의 노드 프로세스를 시작하지 않아도됩니다. 그렇게하지 않으면 nodejs의 이점이 있습니다. 비 결정적 인 작업자 "스레드/프로세스"를 생성하는 경우 NodeJS를 잘못 사용하게됩니다. 그리고 그 대답으로, 나는 당신이 당신 자신의 질문에 대답 할 수 있어야한다고 생각합니다. 더 자세히 알고 싶다면 알려주세요! – ChrisCM

+0

귀하의 회신에 감사드립니다, 크리스. 나 자신을 제대로 설명하지 못했을 수도 있습니다. 노드 지식은 Node Beginner 책에 자세히 나와 있지 않습니다. 예제에서는'var exec = require ("child_process"). exec;'를 사용합니다. 비 블로킹 (non-blocking) 코드를 보여주기 위해 값 비싼 쉘 연산을 수행 할 때'exec' 함수를 사용합니다. 따라서 이해할 수 있듯이이 예제에서는 셸 작업을 다른 프로세스로 연기하여 주 프로세스가 계속 새 요청을 받아서 초기 요청의 응답을 표시하는 콜백을 수신 할 수 있도록합니다. – mibbler

+0

답변으로 내 의견을 제출했습니다. – ChrisCM

답변

7

임원에 대한 이해가 거의 정확합니다. 내 관심사는 그렇게 할 필요가 없을 때 사용하는 것입니다 ... 질문에서 입/출력 유형에 대해서만 언급합니다. 그것은 일을하는 단일 스레드 이벤트 모델입니다. 싱글 스레드 임에도 불구하고, 이벤트 모델은 메인 이벤트 루프를 차단하지 않고 코드를 실행할 수있게 해줍니다 (CPU 요청이 많은 작업 ... 데이터베이스 요청 및 파일 처리가 포함되지 않은 경우 제외). 원하는 것을하기 위해 추가 dyno를 시작할 필요가 없습니다.

dyno를 단일 프로세서 컴퓨터라고 생각하십시오. 단일 프로세서를 갖춘 컴퓨터에서 수행 할 수있는 작업은 무엇이든 추가 요금이나 dynos없이 dyno에서 수행 할 수 있습니다. 그러나 dyno는 단일 코어 프로세서 컴퓨터가 활용할 수있는 것보다 훨씬 적은 메모리를 가지고 있습니다. 따라서 스폰하려는 하위 프로세스는 다른 dyno를 실행할 필요가 없습니다. 실행할 마스터 프로세스마다 자체 dyno가 필요합니다.

var http = require('http'); 

http.createServer(function (req, res) { 

    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('An amount of data that will take 1 second to send');//This will not block the event loop 
}).listen(1337, '127.0.0.1'); 

var http = require('http'); 
http.createServer(function (req, res) { 

    while(true) { 
     break after 1 second; //this will block the event loop for 1 second 
    } 

    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello World\n'); 
}).listen(1337, '127.0.0.1'); 

위의 코드에서 두 서버를 고려하십시오. 두 서버 모두 약 1 초의 작업이 필요합니다. 첫 번째 예제는 초당 수천 개의 요청을 처리 할 수 ​​있습니다. 두 번째 예제는 1입니다. 데이터, 데이터베이스 요청, 서버 요청, 파일 IO 등을 보내는 것은 모두 첫 번째 예제처럼 작동합니다. 노드의 동작은 거의 없습니다. 두 번째 예. 두 번째 예제에 맞는 것을 가지고 있다면, 다른 언어를 선택하는 것이 노드 설계를 잘못 설계 한 유스 케이스에 대해 강제로 작동하도록하는 것보다 낫다.

+0

오, 오케이. 그래서 내가 단일 스레드와 단일 프로세스를 착각하고 있었던 것 같아 ..?하나의 dyno에서 실행할 수있는 프로세스의 양에 한계가 있는지 아십니까? – mibbler

+0

풍부한 프로세스를 시작하지 않으려 고합니다. 노드 프로세스에서 프로세서에 대해 1 명 또는 2 명 이상의 작업자를 시작해야한다고 생각되면 노드를 올바르게 사용하지 않거나 다른 프로그래밍 언어에 더 적합한 유스 케이스가 될 것입니다. 나는 당신을 위해 약간의 데모 코드를 쓸 것이다. 즉, 그 숫자는 영웅이 사용하고있는 운영 체제에 의해서만 제한 될 가능성이 있습니다. – ChrisCM

+1

따라서 귀하의 진정한 한계는 아마도 RAM 일 것입니다. Dynos는 512MB 램을 지원할 수 있습니다 (얼마 전에 확인). 프로세스를 포크 (fork) 할 때, 그 프로세스의 메모리가 여러분과 함께 제공되고, 자신의 환경으로 복사됩니다. 따라서 100MB 프로세스를 가정하면 5 개의 프로세스를 생성 할 수 있습니다. (여기서 수학은 정확하지 않습니다. 이것은 단지 개요 일 뿐이며, 벤치마킹은 순서대로 이루어질 수 있습니다.) – ChrisCM

관련 문제