programing

특히 Node.js가 Apache보다 더 확장 가능한 이유는 무엇입니까?

nasanasas 2020. 10. 24. 10:20
반응형

특히 Node.js가 Apache보다 더 확장 가능한 이유는 무엇입니까?


솔직히 말해서 아직 완전히 이해하지 못했습니다. 이벤트 모델을 사용하는 단일 스레드로서 Node.js가 어떻게 작동하는지 이해합니다. 나는 이것이 Apache보다 얼마나 나은지, 그리고 그것이 단일 스레드 인 경우 어떻게 수평으로 확장되는지 이해하지 못합니다.


Tomislav Capan의이 블로그 게시물이이를 매우 잘 설명하고 있음을 발견했습니다.
The Hell would I use Node.js? 사례 별 소개

Apache와 비교 한 Node 0.10의 요점에 대한 나의 해석 :

좋은 부분

  • Node.js는 각 요청에 대한 스레드 회전을 방지 하거나 Apache처럼 스레드 집합에 대한 요청 풀링을 처리 할 필요가 없습니다. 따라서 요청을 처리하는 데 필요한 오버 헤드가 적고 신속하게 응답 할 수 있습니다.
  • Node.js는 요청 실행을 별도의 구성 요소에 위임하고 위임 된 구성 요소가 처리 된 결과를 반환 할 때까지 새 요청에 집중할 수 있습니다. 이것은 비동기 코드이며 이벤트 모델로 가능합니다. Apache는 풀 내에서 직렬로 요청을 실행하며 모듈 중 하나가 단순히 작업이 완료되기를 기다리는 경우 스레드를 재사용 할 수 없습니다. 그런 다음 Apache는 풀의 스레드를 다시 사용할 수있을 때까지 요청을 큐에 넣습니다.
  • Node.jsJavaScript 를 사용하므로 MongoDB와 같은 외부 웹 API 소스에서 가져온 JSON을 매우 빠르게 전달하고 조작하여 요청 당 필요한 시간을 줄입니다. PHP와 같은 Apache 모듈 은 데이터를 처리하기 위해 마샬링필요하기 때문에 JSON을 효율적으로 구문 분석하고 조작 할 수 없기 때문에 더 많은 시간이 필요할 수 있습니다 .

나쁜 부분

참고 : 아래 나열된 대부분의 불량 부분은 향후 버전 0.12에서 개선 될 예정입니다.

  • Node.js는 계산 집약적 인 작업을 짜증나게 합니다. 오래 실행 되는 작업을 수행 할 때마다 단일 스레드로 인해 다른 모든 수신 요청을 대기열에 추가하기 때문입니다. Apache는 일반적으로 더 많은 스레드를 사용할 수 있으며 OS는 이러한 스레드 사이의 CPU 시간을 깔끔하고 공정하게 예약하여 약간 느리지 만 새 스레드를 처리 할 수 ​​있습니다. Apache에서 사용 가능한 모든 스레드가 요청을 처리하는 경우를 제외하고 Apache는 요청 대기열도 시작합니다.
  • Node.js는 Node.js 클러스터를 만들거나 하위 프로세스를 가동하지 않는 한 멀티 코어 CPU를 완전히 활용하지 않습니다 . 아이러니하게도 후자의 두 가지를 수행하면 Apache와 동일한 문제인 오케스트레이션 오버 헤드를 더 추가 할 수 있습니다. 논리적으로 더 많은 Node.js 프로세스를 가동 할 수도 있지만 이것은 Node.js에서 관리하지 않습니다. 무엇이 더 잘 작동하는지 확인하려면 코드를 테스트해야합니다. 1) 클러스터 및 하위 프로세스가있는 Node.js 내에서 다중 스레딩 또는 2) 다중 Node.js 프로세스.

완화

모든 서버 플랫폼에는 상한이 있습니다. Node.js와 Apache는 모두 어느 시점에 도달 할 것입니다.

  • Node.js는 계산 작업이 많을 때 가장 빨리 도달합니다.
  • Apache는 긴 직렬 실행이 필요한 작은 요청을 많이 던질 때 가장 빨리 도달합니다.

Node.js의 처리량을 확장하기 위해 할 수있는 세 가지

  1. 멀티 코어 CPU를 활용 업 중 하나를 설정하여 클러스터 를 사용 자식 프로세스 , 또는 같은 멀티 프로세스 조정자 사용 Phusion 여객을 .
  2. 메시지 대기열과 연결된 작업자 역할을 설정합니다 . 이것은 계산 집약적 인 장기 실행 요청에 대해 가장 효과적인 솔루션이 될 것입니다. 작업자 농장으로 오프로드합니다. 이렇게하면 서버가 두 부분으로 나뉩니다. 1) 사용자의 요청을 수락하는 공용 사무 서버 및 2) 장기 실행 작업을 처리하는 개인 작업자 서버. 둘 다 메시지 큐와 연결되어 있습니다. 사무 서버는 대기열에 메시지 (수신 장기 실행 요청)를 추가합니다. 작업자 역할은 들어오는 메시지를 수신하고이를 처리하며 결과를 메시지 대기열에 반환 할 수 있습니다. 요청 / 응답이 필요한 경우 사무 서버는 응답 메시지가 메시지 대기열에 도착할 때까지 비동기 적으로 기다릴 수 있습니다. 메시지 큐의 예는 RabbitMQZeroMQ 입니다.
  3. 로드 밸런서를 설정하고 더 많은 서버를 가동하십시오. 이제 하드웨어를 효율적으로 사용하고 장기 실행 작업을 위임하므로 수평 적으로 확장 할 수 있습니다. 부하 분산 장치가있는 경우 더 많은 사무 서버를 추가 할 수 있습니다. 메시지 큐를 사용하여 작업자 서버를 더 추가 할 수 있습니다. 필요에 따라 확장 할 수 있도록 클라우드에서 설정할 수도 있습니다.

사용 방법에 따라 다릅니다. Node.js는 기본적으로 단일 스레드이지만 (상대적으로) 새로운 클러스터 모듈을 사용하면 여러 스레드에서 수평으로 확장 할 수 있습니다.

또한 데이터베이스 요구 사항에 따라 노드를 통한 확장의 효율성도 결정됩니다. 예를 들어, node.js와 함께 MySQL을 사용하는 것은 MongoDB와 node.js 모두의 이벤트 중심 특성 때문에 MongoDB를 사용하는 것만 큼 많은 이점을 얻지 못합니다.

다음 링크에는 설정이 다른 시스템에 대한 좋은 벤치 마크가 많이 있습니다. http://www.techempower.com/benchmarks/

Node.js는 순위가 가장 높지는 않지만 nginx를 사용하는 다른 설정과 비교할 때 (테이블에 아파치가 없지만 충분히 가깝습니다) 꽤 잘 수행됩니다.

다시 말하지만, 그것은 당신의 필요에 크게 의존합니다. 단순히 정적 웹 사이트를 제공하는 경우보다 전통적인 스택을 고수하는 것이 좋습니다. 그러나 사람들은 다른 요구를 위해 node.js로 몇 가지 놀라운 일을했습니다 : http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ (c10k? ha!)

편집 : 당신이 정말로 node.js로 아파치를 '대체'하지 않는다는 것을 언급 할 가치가 있습니다. apache와 php (일반적인 램프 스택에서)를 대체합니다.

참고 URL : https://stackoverflow.com/questions/16578874/what-specifically-makes-node-js-more-scalable-than-apache

반응형