지옥이 Node.js를 사용하는 이유

이 기사는 기술 컨설턴트이자 Node.js 애호가 인 Tomislav Capan이 제공합니다. Tomislav는 원래 이것을 Toptal 블로그에 2013 년 8 월에 게시했습니다. 여기에서 원래 게시물을 찾을 수 있습니다. 블로그가 약간 업데이트되었습니다. 다음 주제는이 저자의 의견과 경험을 바탕으로합니다.

소개

JavaScript의 인기가 높아짐에 따라 많은 변화가 있었고 오늘날 웹 개발의 얼굴은 크게 다릅니다. 서버와 브라우저에서 JavaScript를 사용하여 오늘날 웹에서 할 수있는 일은 몇 년 전에는 상상하기 어려웠거나 Flash 또는 Java Applets와 같은 샌드 박스 환경에 캡슐화되었습니다.

Node.js를 파고 들기 전에 스택 전체에서 JavaScript를 사용하는 이점을 읽고 언어와 데이터 형식 (JSON)을 통합하여 개발자 리소스를 최적으로 재사용 할 수 있습니다. 이것은 Node.js보다 JavaScript의 이점이 많으므로 여기서는 자세히 설명하지 않습니다. 그러나 스택에 Node.js를 통합하는 것이 주요 이점입니다.

Node.js는 Chrome의 V8 자바 스크립트 엔진을 기반으로하는 자바 스크립트 런타임 환경입니다. Node.js의 제작자 인 Ryan Dahl은“Gmail과 같은 응용 프로그램에서 영감을 얻은”푸시 기능을 갖춘 실시간 웹 사이트를 만드는 것을 목표로하고 있습니다. Node.js에서 개발자는 비 차단 이벤트 중심 I / O 패러다임에서 작업 할 수있는 도구를 개발자에게 제공했습니다.

한 문장으로 Node.js는 웹 소켓을 통한 푸시 기술을 사용하는 실시간 웹 애플리케이션에서 빛을 발합니다. 그것에 대해 그렇게 혁명적 인 것은 무엇입니까? 무국적 요청-응답 패러다임을 기반으로 한 20 년이 넘는 무국적 웹 (stateless-web) 이후, 클라이언트와 서버가 모두 통신을 시작할 수있는 실시간 양방향 연결을 통해 웹 애플리케이션이 생겨 자유롭게 데이터를 교환 할 수있게되었습니다. .

이는 클라이언트가 항상 통신을 시작하는 일반적인 웹 응답 패러다임과 완전히 대조적입니다. 또한 표준 포트 80을 통해 실행되는 개방형 웹 스택 (HTML, CSS 및 JS)을 기반으로합니다.

우리는 플래시와 자바 애플릿의 형태로 몇 년 동안 이것을 가졌다 고 주장 할 수도 있지만 실제로는 웹을 클라이언트에게 전달할 전송 프로토콜로 사용하는 샌드 박스 환경 일뿐입니다. 또한 이들은 독립적으로 실행되었으며 종종 비표준 포트를 통해 작동하기 때문에 추가 권한이 필요할 수 있습니다.

Node.js는 모든 장점을 통해 고유 한 이점에 의존하는 많은 유명 회사의 기술 스택에서 중요한 역할을 수행합니다. Node.js 재단은 기업이 Node.js 재단의 사례 연구 페이지에서 찾을 수있는 짧은 프레젠테이션으로 기업이 Node.js를 고려해야하는 이유에 대한 모든 최선의 생각을 통합했습니다.

이 글에서는 이러한 장점을 달성하는 방법뿐만 아니라 Node.js를 사용하고 싶은 이유와 고전적인 웹 응용 프로그램 모델 중 일부를 예로 사용하는 이유에 대해서도 설명합니다.

어떻게 작동합니까?

Node.js의 주요 아이디어 : 비 차단 이벤트 중심 I / O를 사용하여 분산 된 장치에서 실행되는 데이터 집약적 인 실시간 애플리케이션에 직면하여 가볍고 효율적으로 유지하십시오.

한 입입니다.

이것이 의미하는 바는 Node.js가 웹 개발 세계를 지배 할 은색의 새로운 플랫폼이 아니라는 것입니다. 대신 특정 요구를 충족시키는 플랫폼입니다. 그리고 이것을 이해하는 것이 절대적으로 필요합니다. CPU 집약적 인 작업에 Node.js를 사용하고 싶지는 않습니다. 실제로 무거운 계산에 사용하면 거의 모든 장점이 무효화됩니다. Node.js가 진정으로 빛을 발하는 곳은 처리량이 많은 수많은 동시 연결을 처리 할 수있어 빠른 확장 성을 갖춘 빠르고 확장 가능한 네트워크 애플리케이션을 구축하는 것입니다.

실제로 작동하는 방식은 꽤 흥미 롭습니다. 각 연결 (요청)이 새로운 스레드를 생성하고 시스템 RAM을 사용하고 결국 사용 가능한 RAM의 양을 최대로 늘리는 전통적인 웹 서비스 기술과 비교할 때 Node.js는 비 차단 I /를 사용하여 단일 스레드에서 작동합니다. O 호출, 수만 건의 동시 연결 (이벤트 루프에서 개최)을 지원할 수 있습니다.

* 원본 블로그 게시물에서 가져온 이미지입니다.

빠른 계산 : 각 스레드에 잠재적으로 수반되는 2MB의 메모리가 있다고 가정하고 8GB의 RAM이있는 시스템에서 실행하면 이론적으로 최대 4000 개의 동시 연결을 얻을 수 있습니다 (Michael Abernethy의 기사 "노드 란 무엇입니까? .js?”(2011 년 IBM developerWorks에 게시 됨) 불행히도이 기사는 더 이상 제공되지 않습니다. 이것이 전통적인 웹 서비스 기술에서 일반적으로 다루는 시나리오입니다. 이러한 모든 것을 피함으로써 Node.js는 1M 이상의 동시 연결 및 600k 이상의 동시 웹 소켓 연결의 확장 성 수준을 달성합니다.

물론 모든 클라이언트 요청간에 단일 스레드를 공유해야한다는 문제가 있으며 이는 Node.js 애플리케이션을 작성하는 잠재적 인 함정입니다. 첫째, 계산이 완료 될 때까지 들어오는 요청이 차단되므로 과도한 계산으로 Node의 단일 스레드가 중단되고 모든 클라이언트에 문제가 발생할 수 있습니다 (나중에 자세히 설명). 둘째, 개발자는 핵심 (최상위) Node.js 이벤트 루프까지 예외가 발생하지 않도록주의해야합니다. 이로 인해 Node.js 인스턴스가 종료됩니다 (효과적으로 프로그램 충돌).

표면까지 버블 링되는 예외를 피하는 데 사용되는 기술은 다른 환경에서와 같이 오류를 콜백 매개 변수로 호출하지 않고 호출자에게 오류를 다시 전달하는 것입니다. 처리되지 않은 일부 예외가 발생하더라도 Node.js 프로세스를 모니터링하고 충돌 한 인스턴스의 필요한 복구를 수행하는 도구가 개발되었습니다 (아마도 사용자 세션의 현재 상태를 복구 할 수는 없지만), 가장 일반적인 방법은 Forever 모듈이거나 외부 시스템 도구 upstart 및 monit 또는 다른 방법으로 다른 방법을 사용하는 것입니다.

npm : 노드 패키지 관리자

Node.js를 논의 할 때 반드시 생략해야 할 것은 모든 Node.js 설치시 기본적으로 제공되는 npm 도구를 사용하여 패키지 관리를 기본적으로 지원한다는 것입니다. npm 모듈의 개념은 Ruby Gems의 개념과 매우 유사합니다. 공개적으로 사용 가능하고 재사용 가능한 구성 요소 세트로, 버전 및 종속성 관리 기능이있는 온라인 저장소를 통해 쉽게 설치하여 사용할 수 있습니다.

패키지화 된 모듈의 전체 목록은 npm 웹 사이트에서 찾거나 Node.js와 함께 자동으로 설치되는 npm CLI 도구를 사용하여 액세스 할 수 있습니다. 모듈 에코 시스템은 모두에게 개방되어 있으며 누구나 npm 저장소에 나열 될 자체 모듈을 게시 할 수 있습니다. npm에 대한 간략한 소개는 초보자 안내서 및 npm 게시 자습서의 게시 모듈에 대한 자세한 내용을 참조하십시오.

오늘날 가장 유용한 npm 모듈은 다음과 같습니다.

  • express — Express.js, Node.js를위한 Sinatra에서 영감을 얻은 웹 개발 프레임 워크 및 오늘날 대다수의 Node.js 애플리케이션을위한 사실상의 표준.
  • hapi — 웹 및 서비스 응용 프로그램 구축을위한 매우 모듈화되고 사용하기 쉬운 구성 중심 프레임 워크
  • connect — Connect는 Node.js를위한 확장 가능한 HTTP 서버 프레임 워크로서 미들웨어로 알려진 고성능 "플러그인"모음을 제공합니다. Express의 기본 토대가됩니다.
  • socket.io 및 sockjs — 오늘날 가장 일반적인 두 웹 소켓 구성 요소의 서버 측 구성 요소입니다.
  • pug (이전의 Jade) — Express.js의 기본값 인 HAML에서 영감을 얻은 인기있는 템플릿 엔진 중 하나입니다.
  • mongodb 및 mongojs — Node.js에서 MongoDB 객체 데이터베이스 용 API를 제공하기위한 MongoDB 래퍼입니다.
  • redis — Redis 클라이언트 라이브러리.
  • lodash (밑줄, lazy.js) — JavaScript 유틸리티 벨트입니다. Underscore는 게임을 시작했지만 성능 향상과 모듈 식 구현으로 인해 두 상대방 중 하나에 의해 전복되었습니다.
  • 영원히 — 아마도 주어진 노드 스크립트가 지속적으로 실행되도록하는 가장 일반적인 유틸리티 일 것입니다. 예기치 않은 장애가 발생하더라도 Node.js 프로세스를 프로덕션 환경에 유지합니다.
  • bluebird — 뛰어난 성능을 갖춘 모든 기능을 갖춘 Promises / A + 구현
  • moment — 날짜 구문 분석, 유효성 검사, 조작 및 형식 지정을위한 간단한 JavaScript 날짜 라이브러리입니다.

목록은 계속됩니다. 정말 유용한 패키지가 많이 있으며 모두가 이용할 수 있습니다 (여기서는 생략 한 패키지에 대한 위반 없음).

Node.js를 사용해야하는 곳

잡담

채팅은 가장 일반적인 실시간 다중 사용자 응용 프로그램입니다. IRC (하루)부터 비표준 포트에서 실행되는 많은 독점적 공개 프로토콜을 통해 표준 포트 80을 통해 실행되는 웹 소켓으로 Node.js에서 오늘날 모든 것을 구현할 수 있습니다.

채팅 응용 프로그램은 실제로 Node.js의 스팟 스팟 예제입니다. 분산 된 장치에서 실행되는 가볍고 트래픽이 많으며 데이터 집약적이지만 처리 / 계산이 적은 응용 프로그램입니다. 또한 간단하기는하지만 학습을위한 훌륭한 활용 사례이기도하지만 일반적인 Node.js 애플리케이션에서 사용할 패러다임을 대부분 다루고 있습니다.

작동 방식을 설명해 봅시다.

가장 간단한 시나리오에서는 웹 사이트에 사람들이 와서 일대 다 (실제로는 모든 방식) 방식으로 메시지를 교환 할 수있는 단일 대화방이 있습니다. 예를 들어, 웹 사이트에 세 사람이 모두 게시판에 연결되어 있다고 가정 해 봅시다.

서버 측에는 다음 두 가지를 구현하는 간단한 Express.js 애플리케이션이 있습니다. 1) GET '/'요청 핸들러는 메시지 보드와 '보내기'버튼이 모두 포함 된 웹 페이지를 제공하여 새 메시지 입력을 초기화합니다. 2) 웹 소켓 클라이언트가 생성 한 새 메시지를 수신하는 웹 소켓 서버.

클라이언트 측에는 입력 메시지를 가져 와서 웹 소켓으로 보내는 다른 하나의 '보내기'버튼 클릭 이벤트와 새로 들어오는 메시지를 수신하는 다른 하나의 처리기가 설정된 HTML 페이지가 있습니다. 웹 소켓 클라이언트 (즉, 서버가 클라이언트에게 표시하기를 원하는 다른 사용자가 보낸 메시지)

고객 중 한 명이 메시지를 게시하면 다음과 같이됩니다.

  • 브라우저는 JavaScript 핸들러를 통해 '보내기'버튼을 클릭하고 입력 필드 (예 : 메시지 텍스트)에서 값을 가져 와서 서버에 연결된 웹 소켓 클라이언트를 사용하여 웹 소켓 메시지를 생성합니다 (웹 페이지 초기화시 초기화 됨).
  • 웹 소켓 연결의 서버 측 구성 요소는 메시지를 수신하여 브로드 캐스트 방법을 사용하여 연결된 다른 모든 클라이언트에게 전달합니다.
  • 모든 클라이언트는 웹 페이지 내에서 실행되는 웹 소켓 클라이언트 측 구성 요소를 통해 새 메시지를 푸시 메시지로받습니다. 그런 다음 게시판에 새 메시지를 추가하여 메시지 내용을 집어 들고 웹 페이지를 업데이트합니다.
원본 블로그에서 가져온 이미지.

가장 간단한 예입니다. 보다 강력한 솔루션을 위해 Redis 저장소를 기반으로 간단한 캐시를 사용할 수 있습니다. 또는보다 고급 솔루션에서는 클라이언트로의 메시지 라우팅을 처리하기위한 메시지 대기열과 등록 된 클라이언트가 오프라인 상태 일 때 일시적인 연결 손실을 방지하거나 메시지를 저장할 수있는보다 강력한 전달 메커니즘을 제공합니다. 그러나 개선 사항에 관계없이 Node.js는 여전히 동일한 기본 원칙, 즉 이벤트에 반응하고 많은 동시 연결을 처리하며 사용자 경험의 유동성을 유지하면서 작동합니다.

객체 DB 위에 API

Node.js는 실시간 응용 프로그램에서 실제로 빛을 발하지만 개체 DB (예 : MongoDB)에서 데이터를 노출하는 데 매우 적합합니다. JSON 저장 데이터를 사용하면 임피던스 불일치 및 데이터 변환없이 Node.js가 작동 할 수 있습니다.

예를 들어 Rails를 사용하는 경우 JSON에서 이진 모델로 변환 한 다음 React.js, Angular.js 등 또는 일반 jQuery AJAX에서 데이터를 사용할 때 HTTP를 통해 JSON으로 다시 노출합니다. 전화. Node.js를 사용하면 클라이언트가 사용할 REST API로 JSON 객체를 간단히 노출 할 수 있습니다. 또한 데이터베이스에서 읽거나 쓸 때 (MongoDB를 사용하는 경우) JSON과 다른 항목 간 변환에 대해 걱정할 필요가 없습니다. 요약하면 클라이언트, 서버 및 데이터베이스에서 균일 한 데이터 직렬화 형식을 사용하여 여러 변환을 수행 할 필요가 없습니다.

대기 입력

많은 양의 동시 데이터를 수신하는 경우 데이터베이스에 병목 현상이 발생할 수 있습니다. 위에서 설명한 것처럼 Node.js는 동시 연결 자체를 쉽게 처리 할 수 ​​있습니다. 그러나 데이터베이스 액세스는이 작업을 차단하는 작업이므로 문제가 발생합니다. 해결책은 데이터가 데이터베이스에 실제로 기록되기 전에 고객의 행동을 인정하는 것입니다.

이러한 접근 방식을 통해 시스템은로드가 많은 상황에서도 응답 성을 유지하며, 이는 클라이언트가 성공적인 데이터 쓰기에 대한 확고한 확인이 필요하지 않을 때 특히 유용합니다. 전형적인 예는 다음을 포함한다 : 사용자 추적 데이터의 로깅 또는 기록, 배치로 처리되고 나중에까지 사용되지 않음; 최종 일관성 (NoSQL 세계에서 자주 사용됨)이 허용되는 경우 즉시 반영 할 필요가없는 작업 (예 : Facebook의 '좋아요'수 업데이트)

데이터는 일종의 캐싱 또는 메시지 큐 (MQ) 인프라 (예 : RabbitMQ, ZeroMQ)를 통해 대기하고 별도의 데이터베이스 배치 쓰기 프로세스 또는 계산 집약적 인 처리 백엔드 서비스에 의해 요약되며 이러한 작업을 위해 더 나은 성능의 플랫폼으로 작성됩니다. 다른 언어 / 프레임 워크를 사용하여 유사한 동작을 구현할 수 있지만 동일한 높은 처리량으로 동일한 하드웨어에서는 구현할 수 없습니다.

원본 기사에서 가져온 이미지.

요컨대, Node를 사용하면 데이터베이스 쓰기를 한쪽으로 밀고 나중에 처리하는 것처럼 성공할 수 있습니다.

데이터 스트리밍

보다 전통적인 웹 플랫폼에서 HTTP 요청 및 응답은 격리 된 이벤트로 취급됩니다. 실제로, 그들은 실제로 스트림입니다. 이 관찰은 Node.js에서 사용되어 멋진 기능을 구축 할 수 있습니다. 예를 들어, 데이터가 스트림을 통해 들어 와서 온라인 방식으로 처리 할 수 ​​있으므로 파일이 업로드되는 동안 파일을 처리 할 수 ​​있습니다. 이는 실시간 오디오 또는 비디오 인코딩 및 다른 데이터 소스 간 프록시를 위해 수행 될 수 있습니다 (다음 섹션 참조).

대리

Node.js는 비 차단 방식으로 많은 양의 동시 연결을 처리 할 수있는 서버 측 프록시로 쉽게 사용됩니다. 응답 시간이 다른 여러 서비스를 프록시하거나 여러 소스 지점에서 데이터를 수집 할 때 특히 유용합니다.

예 : 타사 리소스와 통신하거나 다른 소스에서 데이터를 가져 오거나 이미지 및 비디오와 같은 자산을 타사 클라우드 서비스에 저장하는 서버 측 응용 프로그램을 생각해보십시오.

전용 프록시 서버가 있지만 프록시 인프라가 없거나 로컬 개발을위한 솔루션이 필요한 경우 노드를 대신 사용하면 도움이 될 수 있습니다. 즉, 자산 및 프록시 / 스터 빙 API 요청을 위해 Node.js 개발 서버로 클라이언트 측 앱을 빌드 할 수 있으며 프로덕션에서는 전용 프록시 서비스 (nginx, HAProxy 등)와의 상호 작용을 처리 할 수 ​​있습니다. ).

브로커리지 — 스톡 트레이더 대시 보드

응용 프로그램 수준으로 돌아 갑시다. 데스크톱 소프트웨어가 지배적이지만 실시간 웹 솔루션으로 쉽게 대체 될 수있는 또 다른 예는 중개인의 거래 소프트웨어로 주식 가격을 추적하고 계산 / 기술 분석을 수행하며 그래프 / 차트를 만드는 데 사용됩니다.

실시간 웹 기반 솔루션으로 전환하면 브로커가 워크 스테이션이나 작업장을 쉽게 전환 할 수 있습니다. 곧 플로리다 나 이비자 나 발리의 해변에서 볼 수 있습니다.

응용 프로그램 모니터링 대시 보드

웹 소켓이있는 노드가 완벽하게 맞는 또 다른 일반적인 사용 사례 : 웹 사이트 방문자 추적 및 실시간 상호 작용 시각화. 방문자가 유입 경로의 특정 지점에 도달 할 때 커뮤니케이션 채널을 열어 방문자와 대상 상호 작용을 도입하여 사용자로부터 실시간 통계를 수집하거나 다음 단계로 이동할 수 있습니다. 예를 들면 다음과 같습니다. 칸디.

방문자가 실시간으로 무엇을하고 있는지 알고 있다면 (상호 작용을 시각화 할 수있는 경우) 비즈니스를 개선 할 수있는 방법을 상상해보십시오. Node.js의 실시간 양방향 소켓으로 이제 가능합니다.

시스템 모니터링 대시 보드

이제 인프라 측면을 방문해 봅시다. 예를 들어 사용자에게 서비스 모니터링 페이지 (예 : GitHub 상태 페이지)를 제공하려는 SaaS 제공자를 상상해보십시오. Node.js 이벤트 루프를 사용하면 비동기 방식으로 서비스 상태를 확인하고 웹 소켓을 사용하여 데이터를 클라이언트에 푸시하는 강력한 웹 기반 대시 보드를 만들 수 있습니다.

이 기술을 사용하여 내부 (회사 내부) 및 공공 서비스 상태를 실시간으로 실시간보고 할 수 있습니다. 이 아이디어를 조금 더 추진하고 통신 사업자, 클라우드 / 네트워크 / 호스팅 제공 업체 또는 일부 금융 기관의 NOC (Network Operations Center) 모니터링 응용 프로그램이 모두 Node.js 및 웹 소켓이 지원하는 개방형 웹 스택에서 실행되는 것을 상상해보십시오. Java 및 / 또는 Java 애플릿 대신.

참고 : Node.js (예 : 일관된 응답 시간이 필요한 시스템)에서 하드 실시간 시스템을 구축하지 마십시오. Erlang은 아마도 해당 응용 프로그램 클래스에 더 적합한 선택 일 것입니다.

Node.js를 사용할 수있는 곳

서버 측 웹 애플리케이션

Express.js가있는 Node.js를 사용하여 서버 측에서 클래식 웹 애플리케이션을 작성할 수도 있습니다. 그러나 가능한 경우 Node.js가 렌더링 된 HTML을 전달하는이 요청-응답 패러다임이 가장 일반적인 사용 사례는 아닙니다. 이 접근법과 반대되는 주장이 있습니다. 고려해야 할 몇 가지 사실은 다음과 같습니다.

장점 :

  • 애플리케이션에 CPU 집약적 계산이없는 경우 MongoDB와 같은 JSON 스토리지 오브젝트 DB를 사용하는 경우 데이터베이스 레벨까지 Javascript를 위에서 아래로 빌드 할 수 있습니다. 이를 통해 개발 (채용 포함)이 크게 향상됩니다.
  • 크롤러는 완전히 렌더링 된 HTML 응답을받습니다. 예를 들어 Node.js 위에서 실행되는 단일 페이지 응용 프로그램 또는 웹 소켓 응용 프로그램보다 훨씬 SEO에 친숙합니다.

단점 :

  • CPU를 많이 사용하는 계산은 Node.js 응답 성을 차단하므로 스레드 플랫폼이 더 좋습니다. 또는 계산 스케일링을 시도해 볼 수도 있습니다 (*).
  • 관계형 데이터베이스와 함께 Node.js를 사용하는 것은 여전히 ​​어려운 일입니다 (자세한 내용은 아래 참조). 관계 작업을 수행하려는 경우 Rails, Django 또는 ASP.Net MVC와 같은 다른 환경을 선호하십시오.

(*) CPU 집약적 계산의 대안은 백엔드 처리를 통해 확장 성이 뛰어난 MQ 기반 환경을 만들어 노드를 클라이언트 요청을 비동기식으로 처리 할 수있는 전면 '클라 커'로 유지하는 것입니다.

Node.js를 사용해서는 안되는 곳

관련 데이터베이스가있는 서버 측 웹 응용 프로그램

예를 들어, Node.js와 Ruby. Rails에 대한 Express.js를 비교하면 관계형 데이터 액세스와 관련하여 후자를 선호하는 명확한 결정이 있습니다.

Node.js에 대한 관계형 DB 도구는 경쟁 제품에 비해 여전히 저개발 상태입니다. 반면 Rails는 DB 스키마 마이그레이션 지원 도구 및 기타 보석 (pun 의도 된)과 함께 즉시 데이터 액세스 설정을 자동으로 제공합니다. Rails와 그 피어 프레임 워크는 성숙하고 입증 된 Active Record 또는 Data Mapper 데이터 액세스 계층 구현으로, 순수한 JavaScript로 복제하려고하면 놓칠 수 없습니다. (*)

그래도 JS를 항상 유지하려는 경향이 있다면 Sequelize와 Node ORM2를 확인하십시오.

(*) Rails 백엔드와 관계형 DB에 대한 쉬운 액세스를 유지하면서 Node.js를 공개적으로 사용하는 외관으로 만 사용할 수 있으며 드물지 않습니다.

무거운 서버 측 컴퓨팅 / 프로세싱

계산량이 많은 경우 Node.js는 최고의 플랫폼이 아닙니다. 아니요. Node.js에서 피보나치 계산 서버를 구축하고 싶지는 않습니다. 일반적으로 CPU를 많이 사용하는 작업은 스레드가 번호 크 런칭을 수행하는 동안 들어오는 요청이 차단되므로 Node가 제공하는 모든 이벤트 처리 방식의 비 차단 I / O 모델을 무효화합니다.

앞에서 언급했듯이 Node.js는 단일 스레드이며 단일 CPU 코어 만 사용합니다. 다중 코어 서버에서 동시성을 추가 할 때 노드 코어 팀이 클러스터 모듈 형태로 일부 작업을 수행하고 있습니다. nginx를 통해 리버스 프록시 뒤에서 여러 Node.js 서버 인스턴스를 매우 쉽게 실행할 수도 있습니다.

클러스터링을 사용하면 더 많은 양의 계산을 더 적절한 환경에서 작성된 백그라운드 프로세스로 오프로드하고 RabbitMQ와 같은 메시지 큐 서버를 통해 통신하도록해야합니다.

백그라운드 처리가 처음에 동일한 서버에서 실행될 수 있지만 이러한 접근 방식은 확장 성이 매우 높습니다. 이러한 백그라운드 처리 서비스는 전면 웹 서버의 부하를 구성 할 필요없이 별도의 작업자 서버에 쉽게 배포 할 수 있습니다.

물론 다른 플랫폼에서도 동일한 접근 방식을 사용하지만 Node.js를 사용하면 각 요청이 매우 빠르고 효율적으로 처리되는 작은 작업이므로 우리가 이야기 한 높은 요청 / 초 처리량을 얻을 수 있습니다.

결론

Node.js는 목표부터 야망으로 시작하고 스위트 스팟과 함정으로 끝나는 이론부터 실습까지 논의했습니다. 사람들이 노드에 문제를 겪으면 거의 항상 차단 작업이 모든 악의 근원이라는 사실로 귀결됩니다. 노드 오용의 99 %가 직접적인 결과입니다.

기억하십시오 : Node.js는 계산 스케일링 문제를 해결하기 위해 만들어지지 않았습니다. I / O 스케일링 문제를 해결하기 위해 만들어졌으며 실제로 잘 수행됩니다.

사용 사례에 CPU 집약적 인 작업이 포함되어 있지 않거나 차단 리소스에 액세스하지 않는 경우 Node.js의 이점을 활용하고 빠르고 확장 가능한 네트워크 응용 프로그램을 즐길 수 있습니다. 실시간 웹에 오신 것을 환영합니다.