JavaScript의 증가하는 발전은 많은 변화를 가져왔고, 오늘날 웹 개발의 모습은 완전히 달라졌습니다. 몇 년 전만 해도 서버에서 JavaScript를 실행하는 것은 상상할 수 없었습니다.
Node.js를 살펴보기 전에 언어 및 데이터 형식(JSON)을 통합하여 개발자 리소스를 최적의 방식으로 재사용할 수 있게 해주는 교차 스택 JavaScript 사용의 이점을 이해하고 싶을 수도 있습니다. Node.js를 기술 스택에 통합하는 것이 주요 이점입니다.
Node.js는 V8이라는 Chrome의 JavaScript 엔진을 기반으로 구축된 JavaScript 런타임 환경입니다. Node.js의 창시자인 Ryan Dahl은 "Gmail과 같은 애플리케이션에서 영감을 얻었으며" 그의 목표는 실시간 푸시 기능을 갖춘 웹사이트를 개발하는 것이었습니다. Node.js에서는 비차단 이벤트 기반 I/O를 처리하는 기능을 제공합니다. [동영상 튜토리얼 추천: nodejs tutorial ]
한 문장으로 요약하자면: Node.js는 웹소켓 푸시 기술을 기반으로 하는 실시간 웹 애플리케이션에서 빛을 발합니다. 상태 비저장 요청-응답 패턴을 기반으로 하는 상태 비저장 웹 애플리케이션을 20년 넘게 사용한 끝에 마침내 실시간 양방향 연결이 가능한 웹 애플리케이션이 생겼습니다. 여기서 클라이언트와 서버 모두 통신을 시작하고 자유롭게 데이터를 교환할 수 있습니다. .
이는 통신이 항상 클라이언트에 의해 시작되는 일반적인 웹 응답 모델과 완전히 대조됩니다. 또한 표준 포트 80에서 실행되는 개방형 웹 기술 스택(HTML, CSS 및 JS)을 기반으로 합니다.
우리가 수년간 Flash 및 Java 애플릿의 형태로 이 작업을 수행해 왔다고 주장할 수도 있지만 실제로는 클라이언트에 데이터를 전달하기 위한 전송 프로토콜로 웹을 사용하는 샌드박스 환경에 불과했습니다. 또한 비표준 포트에서 격리된 상태로 실행되는 경우가 많으므로 추가 권한이 필요할 수 있습니다.
Node.js는 그 장점을 바탕으로 고유한 장점을 활용하는 많은 유명 기업의 기술 스택에서 핵심적인 역할을 합니다. Node.js 재단은 거의 모든 최고의 아이디어를 모았고 기업이 Node.js를 고려해야 하는 이유에 대한 짧은 PPT를 Node.js 재단의 사례 연구 페이지에서 찾을 수 있습니다.
이 기사에서는 이러한 장점을 사용하는 방법뿐만 아니라 일부 고전적인 웹 애플리케이션 모델을 예로 들어 Node.js를 사용하려는 왜에 대해서도 논의할 것입니다.
Node.js의 주요 아이디어는 비차단 이벤트 기반 I/O를 사용하여 분산 장치에서 실행되는 데이터 집약적인 실시간 프로그램에 직면할 때 경량성과 효율성을 보장하는 것입니다.
이 글은 한 입에 다 읽을 수 있는 내용입니다.
이것은 Node.js가 웹 개발 세계를 지배할 새로운 만능 플랫폼이 아니다는 것을 의미합니다. 대신 특정 요구 사항을 충족하는 플랫폼입니다. 이것을 이해하는 것이 절대적으로 필요합니다. 실제로 CPU 집약적인 작업에는 Node.js를 사용하고 싶지 않을 것입니다. 실제로 많은 양의 컴퓨팅에 Node.js를 사용하면 장점이 거의 모두 사라집니다. Node.js가 정말 빛을 발하는 부분은 높은 처리량으로 많은 수의 동시 연결을 처리할 수 있는 능력으로 인해 빠르고 확장 가능한 웹 애플리케이션을 구축하는 것입니다. 이는 높은 확장성과 동일합니다.
기본 작동 원리는 매우 흥미롭습니다. 기존 웹 서비스 기술은 각 연결(요청)에 대해 새 스레드를 생성하여 시스템 메모리를 점유하고 궁극적으로 사용 가능한 최대 메모리에 의해 제한되는 반면 Node.js는 비차단 I/O 호출을 사용하여 단일 스레드에서 실행되므로 이를 지원합니다. 수만 개의 동시 연결(이벤트 루프에서 유지됨)
빠른 계산: 각 스레드에 2MB의 메모리가 필요하다고 가정하면 8GB 메모리가 있는 시스템에서 실행하면 이론적으로 최대 4000개의 동시 연결이 허용됩니다(IBM에 게시된 Michael Abernethy의 기사 "Just what is Node.js?"에서 계산) 불행히도 이 기사에 대한 링크는 이제 중단되었습니다.) 여기에는 스레드 간 컨텍스트 전환 비용도 포함되지 않습니다. 이는 기존 웹 서버 기술에서 일반적으로 다루는 시나리오입니다. 이러한 모든 문제를 방지함으로써 Node.js는 1M 동시 연결 및 600k 동시 웹소켓 연결 수준을 달성합니다.
물론 Node.js 애플리케이션 작성의 잠재적인 함정은 클라이언트 요청 간에 단일 스레드를 공유하는 문제입니다. 첫째, 과도한 계산은 노드의 단일 스레드를 차단하고 모든 클라이언트에 문제를 일으킬 수 있습니다(나중에 자세히 설명). 계산이 완료될 때까지 들어오는 요청이 차단되기 때문입니다. 둘째, 개발자는 예외가 핵심(최상위) Node.js 이벤트 루프까지 버블링되어 Node.js 인스턴스가 종료(프로그램 충돌)되도록 하지 않도록 매우 주의해야 합니다.
예외가 최상위 수준까지 버블링되는 것을 방지하기 위한 일반적인 기술은 오류를 다른 컨텍스트에서 발생시키는 대신 콜백 매개변수로 호출자에게 다시 전달하는 것입니다. 일부 처리되지 않은 예외가 최상위 수준까지 올라오더라도 Node.js 프로세스를 모니터링하고 필요한 충돌 복구를 수행하는 도구가 있습니다(사용자 세션의 현재 상태로 복구하는 것은 불가능할 수 있지만). 공통점은 Forever 모듈입니다.
Node.js를 논의할 때 절대 간과해서는 안되는 한 가지는 모든 Node.js 환경에 기본적으로 설치되는 내장 npm 도구를 사용한 패키지 관리 지원입니다. npm 모듈의 개념은 버전 및 종속성 관리 기능을 갖춘 온라인 저장소를 통해 쉽게 설치할 수 있는 재사용 가능한 구성 요소 세트인 Ruby Gems와 매우 유사합니다.
패키지 모듈의 전체 목록은 npm 웹사이트에서 확인하거나 Node.js와 함께 자동으로 설치되는 npm CLI 도구를 사용하여 액세스할 수 있습니다. 모듈 생태계는 모든 사람에게 열려 있으며 누구나 자신의 모듈을 게시할 수 있으며 게시된 모듈은 npm 저장소에 표시됩니다. npm에 대한 소개는 초보자 가이드와 npm 게시 튜토리얼의 게시 모듈 섹션을 참조하세요.
몇 가지 유용한 npm 모듈은 다음과 같습니다.
목록이 계속 늘어나고 있습니다. 누구나 사용할 수 있는 유용한 패키지가 많이 있습니다.
온라인 채팅은 가장 일반적인 실시간 다중 사용자 애플리케이션이자 Node.js의 가장 좋은 사례입니다. 가볍고 트래픽이 많으며 데이터 집약적입니다(그러나 저처리 및 컴퓨팅) 애플리케이션을 여러 장치에 분산할 수 있습니다. 이는 간단하지만 일반적인 Node.js 프로그램에서 사용하는 대부분의 패러다임을 다루기 때문에 훌륭한 연구 사례이기도 합니다.
어떻게 작동하는지 상상해 봅시다.
가장 간단한 시나리오를 가정해 보겠습니다. 우리 웹사이트에는 사람들이 일대다(실제로는 모든 사람과) 방식으로 메시지를 교환할 수 있는 채팅방이 있습니다.
서버 측에는 다음 두 가지를 구현하는 간단한 Express.js 프로그램이 있습니다. 1) 메시지 보드가 포함된 "보내기"와 새 메시지 초기화를 위한 입력을 제공하는 GET 요청에 대한 핸들러” 버튼 기능 , 2) 웹소켓 클라이언트로부터 새 메시지를 수신하는 웹소켓 서버.
클라이언트 측에는 두 개의 핸들러가 설정된 HTML 페이지가 있습니다. 하나는 입력 메시지를 수신하여 웹소켓으로 보내는 "보내기" 버튼의 클릭 이벤트에 대한 것이고, 다른 하나는 들어오는 메시지의 새로운 내용이며 websockets 클라이언트에 표시됩니다(즉, 서버가 클라이언트에 표시하기를 원하는 다른 사용자가 보낸 메시지).
클라이언트 중 하나가 메시지를 게시하면 다음과 같은 일이 발생합니다.
이것은 가장 간단한 예입니다. 보다 강력한 솔루션을 위해 간단한 Redis 기반 캐시를 사용할 수 있습니다. 또는 고급 솔루션에서는 메시지 큐를 메시지 경로로 사용할 수 있으며, 연결이 끊어지거나 클라이언트가 오프라인일 때 메시지를 저장하는 등 보다 강력한 전달 메커니즘을 구현할 수 있습니다. 그러나 어떤 개선 사항을 적용하더라도 Node.js는 이벤트에 반응하고 많은 동시 연결을 처리하며 사용자 경험을 원활하게 유지하는 동일한 기본 원칙에 따라 계속 실행됩니다.
Node.js는 실제로 실시간 애플리케이션 개발에 훌륭하지만 MongoDB와 같은 객체 데이터베이스의 데이터를 노출하는 데에도 좋습니다. JSON에 저장된 데이터를 사용하면 Node.js가 저장된 데이터와 일치하고 데이터 변환 없이 개체와 잘 작동할 수 있습니다.
예를 들어 Rails를 사용하는 경우 JSON에서 바이너리 모델로 변환한 다음 HTTP를 통해 JSON으로 변환하여 React.js 또는 Angular.js에서 사용하거나 간단한 jQuery AJAX 호출을 수행해야 합니다. Node.js를 사용하면 REST API를 통해 클라이언트가 사용할 JSON 개체를 직접 노출할 수 있습니다. 또한 데이터베이스에서 읽거나 쓸 때(MongoDB를 사용하는 경우) JSON과 다른 항목 간의 변환에 대해 걱정할 필요가 없습니다. 즉, 클라이언트, 서버 및 데이터베이스에서 통합된 데이터 직렬화 형식을 사용하면 여러 변환 문제를 피할 수 있습니다.
동시에 많은 데이터를 수신하면 데이터베이스에 병목 현상이 발생할 수 있습니다. 위에서 언급했듯이 Node.js는 자체적으로 동시 연결을 쉽게 처리할 수 있습니다. 그러나 데이터베이스 액세스는 차단 작업(이 경우)이기 때문에 문제가 발생합니다. 해결책은 데이터가 실제로 데이터베이스에 기록되기 전에 클라이언트의 동작을 확인하는 것입니다.
이 접근 방식을 사용하면 시스템은 높은 부하에서도 응답성을 유지할 수 있으며, 이는 클라이언트가 데이터가 성공적으로 작성되었는지 확인할 필요가 없을 때 특히 유용합니다. 일반적인 예로는 사용자 추적 데이터를 기록하거나 작성할 때의 일괄 처리 및 즉각적인 응답이 필요하지 않은 작업(예: Facebook의 "좋아요" 업데이트)에 허용되는 이벤트 일관성(NoSQL 세계에서 자주 사용됨)이 있습니다. .
데이터는 일종의 캐시 또는 메시지 대기열(예: RabbitMQ, ZeroMQ)을 통해 대기열에 추가되고 별도의 데이터베이스 일괄 쓰기 프로세스 또는 이러한 작업 플랫폼을 더 잘 수행할 수 있는 컴퓨팅 집약적 백엔드 서비스에 의해 소화됩니다. 다른 언어나 프레임워크에서도 유사한 동작을 구현할 수 있지만 동일한 높은 처리량을 유지하기 위해 동일한 하드웨어에서는 구현할 수 없습니다.
간단히 말하면 Node를 사용하면 데이터베이스 쓰기를 한 곳에 기록하고 나중에 성공적으로 처리된 것처럼 처리할 수 있습니다.
보다 전통적인 웹 플랫폼에서 HTTP 요청 및 응답은 실제로는 스트림임에도 불구하고 격리된 이벤트로 간주됩니다. Node.js에서 이 속성을 사용하여 몇 가지 멋진 기능을 구축할 수 있습니다. 예를 들어, 파일 업로드와 처리를 동시에 할 수 있습니다. 데이터가 스트림을 통해 들어오기 때문에 실시간으로 처리할 수 있습니다. 이는 실시간 오디오 및 비디오 인코딩뿐만 아니라 다양한 데이터 소스 간의 프록시에도 사용할 수 있습니다(다음 섹션 참조).
Node.js를 비차단 방식으로 많은 수의 동시 연결을 처리할 수 있는 서버측 프록시로 사용하는 것은 쉽습니다. 이는 응답 시간이 다양한 여러 서비스에 대한 프록시나 여러 소스에서 데이터가 수집되는 시나리오에 특히 유용합니다.
예를 들어, 다음 시나리오는 서버 측 프로그램이 타사 리소스와 통신할 때 다양한 소스에서 데이터를 추출하거나 타사 클라우드 서비스에 이미지 및 비디오와 같은 리소스를 저장합니다.
전용 프록시 서버에도 불구하고 기본 프록시 인프라가 없거나 로컬 개발 환경이 필요한 경우 Node가 도움이 될 수 있습니다.
애플리케이션으로 돌아가 보겠습니다. 실시간 웹 솔루션으로 쉽게 대체할 수 있는 또 다른 예로는 주식 중개인의 거래 소프트웨어가 있는데, 이는 주가 추적, 계산 수행, 기술 분석 및 차트 생성에 사용됩니다.
브로커는 라이브 웹 기반 솔루션으로 전환하면 워크스테이션이나 직장을 쉽게 전환할 수 있습니다. 곧 플로리다 해변에서 이를 볼 수 있을 것입니다...
웹 소켓이 포함된 노드가 완벽하게 적합한 또 다른 일반적인 사용 사례: 웹 사이트 방문 사용자를 추적하고 사용자 상호 작용을 실시간으로 시각화합니다. . 실시간으로 사용자로부터 통계를 수집하고 커뮤니케이션 채널을 열어 퍼널의 특정 지점에서 방문자와 타겟 상호 작용에 참여할 수도 있습니다. 이와 같은 시나리오는 여기에서 찾을 수 있습니다: CANDDi.
방문자들이 실시간으로 무엇을 하고 있는지 이해할 수 있다면 비즈니스를 어떻게 개선할 수 있을까요? 이제 Node.js의 실시간 양방향 소켓을 사용하여 이를 수행할 수 있습니다.
인프라 측면에서는,. 예를 들어 사용자에게 서비스 모니터링 페이지(예: GitHub 상태 페이지)를 제공하려는 SaaS 제공업체가 있습니다. Node.js 이벤트 루프를 사용하면 서비스 상태를 비동기적으로 확인하고 웹 소켓을 사용하여 클라이언트에 데이터를 푸시하는 강력한 웹 기반 대시보드를 만들 수 있습니다. 이 기술을 사용하면 내부 기업과 공공 서비스의 상태를 실시간으로 보고할 수 있습니다.
참고: Node.js에서 하드 실시간 시스템(즉, 일관된 응답 시간이 필요한 시스템)을 구축하려고 하지 마세요. 그러한 종류의 애플리케이션에는 Erlang 이 더 나은 선택일 수 있습니다.
Node.js와 Express.js를 사용하면 서버 측에서 클래식 웹 애플리케이션을 만들 수도 있습니다. 이 접근 방식에는 지지자와 반대자가 있습니다. 고려해야 할 몇 가지 사항은 다음과 같습니다.
장점:
단점:
CPU 집약적 컴퓨팅의 대안은 Node가 프런트엔드 "직원"이 되어 클라이언트 요청을 비동기적으로 처리할 수 있도록 백엔드 처리 기능을 갖춘 확장성이 뛰어난 MQ 지원 환경을 만드는 것입니다.
예를 들어, 관계형 데이터 액세스에 관해서는 Node.js + Express.js를 Ruby on Rails와 비교하세요. 적절한.
Node.js의 관계형 데이터베이스 도구는 경쟁사에 비해 여전히 매우 원시적입니다. 반면 Rails는 다른 Gem 외에도 즉시 사용 가능한 데이터 액세스 설정 및 데이터베이스 스키마 마이그레이션 지원 도구를 제공합니다. Rails 및 유사한 프레임워크에는 성숙하고 입증된 Active Record 또는 Data Mapper 데이터 액세스 계층 구현이 있으므로 이러한 기능을 순수 JavaScript로 복제하는 데 행운이 있기를 바랍니다.
그러나 JS에서 모든 것을 구현하고 싶다면 Sequelize 및 Node ORM2를 확인하세요.
Node.js를 공개 인터페이스로 사용하고 Rails 백엔드를 사용하여 관계형 데이터베이스에 액세스하는 경우 이는 괜찮고 드문 일이 아닙니다.
Node.js는 계산이 많은 경우 최고의 플랫폼이 아닙니다. Node.js를 사용하여 Fibonacci 컴퓨팅 서버를 구축하고 싶지는 않을 것입니다. 일반적으로 CPU를 많이 사용하는 작업은 이벤트 중심의 비차단 I/O 모델을 통해 Node에서 제공하는 처리량 이점을 무효화합니다. 스레드가 숫자 처리로 점유되는 동안 들어오는 요청이 차단되기 때문입니다.
앞서 언급했듯이 Node.js는 단일 스레드이며 하나의 CPU 코어만 사용합니다. 멀티 코어 서버에 동시성을 추가하는 경우 Node 코어 팀은 클러스터 모듈 형태로 몇 가지 작업을 수행했습니다. 역방향 프록시 nginx 뒤에서 여러 Node.js 서버 인스턴스를 쉽게 실행할 수도 있습니다.
클러스터를 사용하는 경우에도 모든 무거운 계산을 보다 적합한 환경에서 작성된 백그라운드 프로세스에 넣고 RabbitMQ와 같은 메시지 대기열 서버를 통해 통신하도록 해야 합니다.
처음에는 모든 백그라운드 처리가 동일한 서버에서 실행될 수 있지만 이 접근 방식은 매우 높은 확장성을 달성할 수 있는 잠재력을 가지고 있습니다. 이러한 백그라운드 처리 서비스는 프런트 엔드 웹 서버 로드를 구성할 필요 없이 별도의 작업자 서버에 쉽게 배포될 수 있습니다.
물론 다른 플랫폼에서도 동일한 접근 방식을 사용할 수 있지만 Node.js를 사용하면 각 요청이 매우 빠르고 효율적인 작은 작업이기 때문에 앞서 언급한 높은 요청/초 처리량을 얻을 수 있습니다.
Node.js의 목표와 야망부터 시작해 최고의 포인트와 함정까지 이론부터 실습까지 논의했습니다. 사람들이 Node에 문제가 생기면 거의 항상 차단 작업이 모든 악의 근원입니다. 그 중 99%는 Node의 오용으로 인해 직접 발생합니다.
기억하세요: 컴퓨팅 확장 문제를 해결하기 위해 Node.js를 사용하지 마세요. 이는 I/O 확장 문제를 해결하도록 설계되었으며 정말 효과적입니다 .
따라서 애플리케이션에 CPU 집약적인 작업이 포함되어 있지 않고 차단 리소스에 액세스하지 않는 경우 Node.js를 활용하고 빠르고 확장 가능한 웹 애플리케이션을 즐길 수 있습니다.
원문 영문 주소 : https://medium.com/the-node-js-collection/why-the-hell-would-you-use-node-js-4b053b94ab8e
[동영상 튜토리얼 추천 : nodejs 비디오 튜토리얼】
위 내용은 Node.js를 사용하는 이유는 무엇입니까? Node.js는 언제 사용할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!