Node.js은 (는) 무엇 이죠? [닫은]


506

Node.js를 완전히 얻지 못했습니다. 가 . 아마도 주로 웹 기반 비즈니스 응용 프로그램 개발자이기 때문일 수 있습니다. 그것은 무엇이며 어떻게 사용됩니까?

지금까지 나의 이해는 :

  1. 프로그래밍 모델은 특히 I / O를 처리하는 방식으로 이벤트 중심 입니다.
  2. 그것은 사용하는 자바 스크립트를 파서이다 V8 .
  3. 동시 서버 애플리케이션을 작성하는 데 쉽게 사용할 수 있습니다.

내 이해가 정확합니까? 그렇다면 이벤트 I / O의 이점은 무엇입니까? 동시성에 더 많은 것입니까? 또한, 자바 스크립트 기반 (V8 기준) 프로그래밍 모델 같은 프레임 워크가 될 수 Node.js를의 방향은?

답변:


213

장점은 다음과 같습니다.

  1. 매우 빠른 VM에서 동적 언어 (JavaScript)로 웹 개발 (V8). Ruby, Python 또는 Perl보다 훨씬 빠릅니다.

  2. 단일 프로세스에서 최소한의 오버 헤드로 수천 개의 동시 연결을 처리 할 수 ​​있습니다.

  3. JavaScript는 일급 함수 객체 및 클로저가있는 이벤트 루프에 적합합니다. 사람들은 이미 브라우저에서이를 사용하여 사용자가 시작한 이벤트에 응답하여이 방법을 사용하는 방법을 알고 있습니다.

  4. 많은 사람들이 이미 JavaScript를 알고 있으며 프로그래머라고 주장하지 않는 사람들도 있습니다. 틀림없이 가장 인기있는 프로그래밍 언어입니다.

  5. 웹 서버와 브라우저에서 JavaScript를 사용하면 방정식의 양쪽에서 동일하게 작동하는 JSON을 통해 데이터 구조를 전달할 수있는 두 프로그래밍 환경 간의 임피던스 불일치가 줄어 듭니다. 서버와 클라이언트 등에서 중복 폼 검증 코드를 공유 할 수 있습니다.


1
@ postfuturist : 실제로 많은 대안에 대해 잘 수행됩니다. 그것도의 경우 많은 꽤 솜씨 자바 6 친다. 산뜻한!
Adam Crossland

1
@ postfuturist Java 6 -Xint와 비교했다고 생각합니다. 자바 6 -server와 비교하십시오
fedesilva

@iJK yammer.com Node.js를의 작업 응용 프로그램입니다
제라드 Banasig

1
웃기는, 10 년 전에 ASP에서 JScript를 작성하고 있었기 때문에 (a) VBScript의 끔찍함을 피하고 (b) 클라이언트와 서버에서 동일한 언어를 사용하고 (c) 내 자신과 다른 사람의 JS 라이브러리를 재사용 할 수있었습니다. 문자열 처리 ... 등
Antony Quinn

4
@ 왜 "기존 헛소리"에 대해서만이 게시물을 편집 했습니까? 처음부터 글을 썼다면 212 명이이 게시물에 투표 할 것이라고 생각하지 않습니다.
Julien Fouilhé

619

직장에서 Node.js를 사용하고 매우 강력합니다. Node.js를 설명하기 위해 한 단어를 선택하도록 강요 한 "흥미로운"(순수한 형용사가 아님)이라고 말하고 싶습니다. 커뮤니티는 활기차고 성장하고 있습니다. JavaScript는 그 이상한 점에도 불구하고 코딩하기에 좋은 언어가 될 수 있습니다. 또한 "모범 사례"와 체계적인 코드 패턴에 대한 자신의 이해를 매일 다시 생각할 것입니다. 지금 Node.js로 흘러가는 엄청난 아이디어의 에너지가 있으며, 그 아이디어로 작업하면이 모든 생각, 즉 훌륭한 정신 역도에 노출됩니다.

프로덕션 환경에서 Node.js는 확실히 가능하지만 문서에서 약속 한 "턴키"배포와는 거리가 멀다. Node.js v0.6.x에서는 "클러스터"가 플랫폼에 통합되어 필수 구성 요소 중 하나를 제공하지만 "production.js"스크립트는 여전히 로그 생성과 같은 작업을 처리하는 ~ 150 줄의 로직입니다. "심각한"프로덕션 서비스를 위해서는 들어오는 연결을 조절하고 Apache가 PHP를 위해하는 모든 일을 할 준비가되어 있어야 합니다. 공정하게 말하자면, Ruby on Rails 에는이 정확한 문제가 있습니다. 이는 두 가지 보완 메커니즘을 통해 해결됩니다. 1) Ruby on Rails / Node에 배치.아파치 / 작업자 프로세스를 관리하고 주기적으로 재활용하는 . 아직 완전히 구워진 Node.js 프레임 워크를 아직 찾지 못했습니다. 그것은 존재하지만 아직 찾지 못했지만 여전히 수동 롤링 "production.js"에서 ~ 150 줄을 사용합니다.Lighttd ). 웹 서버는 정적 컨텐츠를 효율적으로 제공하고, 액세스 로깅, URL 재 작성, SSL 종료 , 액세스 규칙 시행 및 여러 하위 서비스 관리를 효율적으로 수행 할 수 있습니다. 실제 노드 서비스에 도달 한 요청의 경우 웹 서버는 요청을 프록시합니다. 2) 유니콘 과 같은 프레임 워크 사용

Express 와 같은 프레임 워크를 읽으면 표준 연습이 하나의 Jack-of-all-trades Node.js 서비스를 통해 모든 것을 제공하는 것처럼 보입니다 ... "app.use (express.static (__ dirname + '/ public'))" . 저 부하 서비스 및 개발의 경우 아마도 괜찮을 것입니다. 그러나 서비스에 많은 시간을 투자하고 24 시간 연중 무휴로 운영하자마자 큰 사이트가 Nginx 와 같이 잘 구워지고 강화 된 C 코드 가 사이트를 정면으로 향하고 모든 것을 처리하도록 하는 동기를 신속하게 발견 할 수 있습니다 정적 콘텐츠 요청 중 (... Amazon CloudFront 와 같은 CDN 을 설정할 때까지 ). 이것에 대해 다소 유머러스하고 부끄럽게 부정적인 영향을 받으려면 이 사람을보십시오. .

Node.js는 점점 더 많은 비 서비스 용도를 찾고 있습니다. 웹 컨텐츠를 제공하기 위해 다른 것을 사용하더라도 npm 모듈을 사용 하여 코드를 구성하고, Browserify 를 사용하여 단일 자산으로 스티칭하고, uglify-js 를 사용하여 배포 용으로 축소 하는 Node.js를 빌드 도구로 사용할 수 있습니다. . 웹을 다루는 데있어 JavaScript는 완벽한 임피던스 정합 이며 종종 가장 쉬운 공격 경로가됩니다. 예를 들어 많은 JSON 응답 페이로드를 통해 grovel을 수행 하려면 밑줄 -CLI 를 사용해야합니다. 구조화 된 데이터의 유틸리티 벨트 인 모듈을 합니다.

찬반 양론 :

  • 전문가 : 서버 사용자에게는 백엔드에서 JavaScript를 작성하는 것이 최신 UI 패턴을 배우는 데있어 "게이트웨이 약물"이었습니다. 더 이상 클라이언트 코드 작성을 두려워하지 않습니다.
  • Pro : 적절한 오류 검사를 장려하는 경향이 있습니다 (프로그래머가 처리하도록 잔소리하면서 거의 모든 콜백에서 오류가 반환 됨). 또한 async.js 및 기타 라이브러리는 "이러한 하위 작업 중 하나라도 실패하면 실패"패러다임을 처리합니다 )
  • 프로 : 비행 중 작업 상태 확인, 작업자 간 통신 또는 캐시 상태 공유와 같이 흥미롭고 일반적으로 어려운 일부 작업은 사소한 문제가됩니다.
  • 장점 : 견고한 패키지 관리자 (npm)를 기반으로하는 거대한 커뮤니티 및 수많은 훌륭한 라이브러리
  • 단점 : JavaScript에는 표준 라이브러리가 없습니다. JSON.parse 또는 npm 모듈을 추가 할 필요가없는 다른 빌드 메소드를 사용할 때 이상한 느낌을주는 기능을 가져 오는 데 익숙해졌습니다. 이것은 모든 것의 5 가지 버전이 있다는 것을 의미합니다. Node.js "core"에 포함 된 모듈조차도 기본 구현에 만족하지 않으면 5 가지 변형이 더 있습니다. 이것은 빠른 진화로 이어지지 만 어느 정도의 혼란을 초래합니다.

간단한 요청 당 프로세스 당 프로세스 모델 ( LAMP ) 대 :

  • Pro : 수천 개의 활성 연결로 확장 가능합니다. 매우 빠르고 효율적입니다. 웹 집합의 경우 PHP 또는 Ruby에 비해 필요한 상자 수가 10 배 감소 할 수 있습니다.
  • 장점 : 병렬 패턴 작성이 쉽습니다. Memcached 에서 3 개 (또는 N 개)의 Blob을 가져와야한다고 상상해보십시오 . PHP 에서이 작업을 수행하십시오 ... 첫 번째 얼룩, 두 번째, 세 번째를 가져 오는 코드를 작성 했습니까? 와우, 그것은 느리다. 특별한 PECL이 있습니다Memcached의 특정 문제를 해결하기 모듈이 있지만 데이터베이스 쿼리와 함께 Memcached 데이터를 가져 오려면 어떻게해야합니까? Node.js에서 패러다임은 비동기 적이므로 웹 요청이 여러 작업을 동시에 수행하는 것은 매우 자연 스럽습니다.
  • 단점 : 비동기 코드는 기본적으로 동기 코드보다 복잡하며, 동시 실행이 실제로 의미하는 바를 제대로 이해하지 못하면 개발자에게는 선행 학습 곡선이 어려울 수 있습니다. 그럼에도 불구하고 잠금으로 모든 종류의 멀티 스레드 코드를 작성하는 것보다 훨씬 어렵지 않습니다.
  • 단점 : 컴퓨팅 집약적 인 요청이 예를 들어 100ms 동안 실행되면 동일한 Node.js 프로세스에서 처리되는 다른 요청의 처리가 중단됩니다. AKA, cooperative-multitasking . 이는 Web Workers 패턴 (비싼 작업을 처리하기 위해 하위 프로세스를 분리)으로 완화 할 수 있습니다. 또는 많은 수의 Node.js 워커를 사용할 수 있으며 각 요청이 단일 요청을 동시에 처리하도록 할 수 있습니다 (프로세스 재활용이 없으므로 상당히 효율적 임).
  • 단점 : 프로덕션 시스템을 실행하는 것은 Apache + PHP, Perl , Ruby 등과 같은 CGI 모델 보다 훨씬 복잡합니다 . 처리되지 않은 예외는 전체 프로세스를 중단 시키며, 실패한 작업자를 다시 시작하는 논리가 필요 합니다 ( 클러스터 참조 ). 버그가있는 원시 코드가있는 모듈은 프로세스를 충돌시킬 수 있습니다. 작업자가 사망 할 때마다 처리중인 모든 요청이 삭제되므로 하나의 버그가있는 API가 다른 공동 호스팅 API에 대한 서비스를 쉽게 저하시킬 수 있습니다.

Java / C # / C로 "실제"서비스를 작성하는 것 (C? 정말?)

  • 장점 : Node.js에서 비동기 작업을 수행하는 것은 다른 곳에서 스레드 안전을 수행하는 것보다 쉬우 며 더 큰 이점을 제공합니다. Node.js는 지금까지 내가 해본 것 중 가장 고통스러운 비동기 패러다임입니다. 좋은 라이브러리를 사용하면 동기 코드를 작성하는 것보다 약간 어렵습니다.
  • 장점 : 멀티 스레딩 / 잠금 버그가 없습니다. 사실, 차단 작업없이 적절한 비동기 워크 플로를 표현하는 더 자세한 코드를 작성하는 데 먼저 투자해야합니다. 그리고 몇 가지 테스트를 작성하고 작동해야합니다 (스크립트 언어이며 팻 핑거링 변수 이름은 단위 테스트 시간에만 잡 힙니다). 그러나 일단 작동하게되면, heisenbugs 의 표면적 백만 번에 한 번만 나타나는 이상한 문제)은 그 표면적이 훨씬 더 낮습니다. Node.js 코드를 작성하는 세금은 코딩 단계에 전면로드됩니다. 그런 다음 안정적인 코드로 끝나는 경향이 있습니다.
  • 장점 : JavaScript는 기능을 표현하기에 훨씬 가볍습니다. 단어, JSON , 동적 타이핑, 람다 표기법, 프로토 타입 상속, 경량 모듈 등으로 이것을 증명하기는 어렵습니다 ... 동일한 아이디어를 표현하는 데 적은 코드를 사용하는 경향이 있습니다.
  • 단점 : Java의 코딩 서비스를 정말로 좋아하십니까?

JavaScript 및 Node.js에 대한 또 다른 관점 은 Java 개발자의 Node.js 학습 및 경험에 대한 블로그 게시물 인 Java에서 Node.js 로 이동하십시오.


모듈 노드를 고려, 자바 스크립트 라이브러리의 선택이됩니다 것을 명심 DEFINE 경험을. 대부분의 사람들은 비동기 패턴 도우미 (Step, Futures, Async)와 JavaScript sugar 모듈 ( Underscore.js ) 중 적어도 두 가지를 사용 합니다.

도우미 / JavaScript Sugar :

  • Underscore.js- 이것을 사용하십시오. 그냥 해. _.isString () 및 _.isArray ()와 같은 코드로 코드를 읽기 쉽고 읽기 좋게 만듭니다. 안전한 코드를 어떻게 작성할 수 있는지 잘 모르겠습니다. 또한 향상된 명령 줄 기능을 사용하려면 내 Underscore-CLI를 확인하십시오 .

비동기 패턴 모듈 :

  • 단계 -직렬 및 병렬 작업의 조합을 표현하는 매우 우아한 방법입니다. 나의 개인적인 추천. Step code의 모양에 대한 내 게시물 을 참조하십시오 .
  • 선물 -요구 사항을 통해 주문을 표현하는 데 훨씬 더 유연합니다 (실제로 좋은 것입니까?). "a, b, c를 동시에 시작하십시오. A와 B가 끝나면 AB를 시작하십시오. A와 C가 끝나면 AC를 시작하십시오"와 같은 것을 표현할 수 있습니다. 이러한 유연성으로 인해 콜백을 호출하지 않거나 여러 번 호출하지 않는 등 워크 플로의 버그를 피하기 위해 더 많은주의가 필요합니다. 선물 사용에 관한 Raynos의 게시물 을 참조하십시오 (이것은 저에게 선물을 "제공"했습니다).
  • 비동기 -각 패턴마다 하나의 방법을 사용하는 더 전통적인 라이브러리. 나는 종교적 단계를 단계로 전환하기 전에 이것을 시작했고 Async의 모든 패턴을 단계에서 읽을 수있는 단일 패러다임으로 표현할 수 있다는 것을 깨달았습니다.
  • TameJS -OKCupid에 의해 작성되었으며, 직렬 및 병렬 워크 플로우를 우아하게 작성하기 위해 새로운 언어 기본 "대기"를 추가하는 프리 컴파일러입니다. 패턴은 훌륭해 보이지만 사전 컴파일이 필요합니다. 나는 아직도 이것에 대해 생각하고있다.
  • StreamlineJS -TameJS 경쟁 업체 나는 길들인쪽으로 기울고 있지만, 당신은 당신 자신의 마음을 만들 수 있습니다.

또는 비동기 라이브러리에 대한 모든 내용을 보려면 작성자와의이 패널 인터뷰 를 참조하십시오 .

웹 프레임 워크 :

  • 익스프레스 웹 사이트를 구성하는 레일 - 스크 벨 프레임 워크에 큰 루비. JADE 를 XML / HTML 템플릿 엔진으로 사용하므로 HTML 작성이 훨씬 덜 고통스럽고 거의 우아합니다.
  • jQuery 기술적으로 노드 모듈은 아니지만 jQuery는 클라이언트 측 사용자 인터페이스의 사실상 표준이되고 있습니다. jQuery는 CSS와 같은 선택자를 제공하여 DOM 요소 세트를 '쿼리'하여 (핸들러, 속성, 스타일 등) 조작 할 수 있습니다. 같은 맥락에서 Twitter의 Bootstrap CSS 프레임 워크, MVC 패턴을 위한 Backbone.js 및 모든 JavaScript 파일을 단일 파일로 연결하는 Browserify.js 가 있습니다. 이 모듈들은 모두 사실상의 표준이되었으므로 들어 보지 못했다면 최소한 확인해야합니다.

테스트 :

  • JSHint- 반드시 사용해야합니다. 처음에는 이것을 사용하지 않았는데 지금은 이해할 수없는 것 같습니다. JSLint는 Java와 같은 컴파일 된 언어로 얻을 수있는 여러 가지 기본 검증을 다시 추가합니다. 일치하지 않는 괄호, 선언되지 않은 변수, 다양한 모양과 크기의 유형. 또한 공백 스타일과 기타를 확인하는 "애널 ​​모드"라고하는 다양한 형태를 켤 수 있습니다. 차 한잔이라면 괜찮습니다. 그러나 실제 값은 정확한 라인 번호에 대한 즉각적인 피드백을 얻는 것에서 비롯됩니다. 코드를 실행하고 문제의 줄에 닿지 않고 닫는 ")"를 잊어 버렸습니다. "JSHint"는 Douglas CrockfordJSLint 의보다 구성 가능한 변형입니다 .
  • 내가 선호하기 시작한 Vows의 모카 경쟁자. 두 프레임 워크 모두 기본을 충분히 처리하지만 복잡한 패턴은 모카에서 표현하기가 더 쉽습니다.
  • 맹세 맹세는 정말 아주 우아합니다. 그리고 어떤 테스트 사례가 통과 / 실패했는지 보여주는 멋진 보고서 (--spec)를 인쇄합니다. 30 분 동안 배우면 최소한의 노력으로 모듈에 대한 기본 테스트를 만들 수 있습니다.
  • Zombie - JSDom 을 가상 "브라우저"로 사용하여 HTML 및 JavaScript에 대한 헤드리스 테스트 매우 강력한 것들. 이 기능을 Replay 와 결합하면 브라우저 내 코드를 매우 빠르게 결정적으로 테스트 할 수 있습니다.
  • 테스트를 "생각하는"방법에 대한 의견 :
    • 테스트는 선택 사항이 아닙니다. JavaScript와 같은 동적 언어를 사용하면 정적 검사 가 거의 없습니다. 예를 들어, 코드가 실행될 때까지 4가 깨지지 않을 것으로 예상되는 메소드에 두 개의 매개 변수를 전달하면됩니다. JavaScript에서 버그를 만들기위한 매우 낮은 막대입니다. 컴파일 된 언어로 검증 격차를 해소하려면 기본 테스트가 필수적입니다.
    • 유효성 검사를 잊어 버리고 코드를 실행하십시오. 모든 방법에서 첫 번째 유효성 검사 사례는 "아무것도 없습니다"이며 가장 자주 발생하는 경우입니다. 코드를 던지지 않고 코드가 실행된다는 것을 증명하면 80 %의 버그를 잡아낼 수 있으며 코드 신뢰도를 높이기 위해 많은 노력을 기울이고 건너 뛴 뉘앙스가있는 검증 사례를 추가 할 수 있습니다.
    • 작게 시작하고 관성 장벽을 깨십시오. 우리는 모두 게으르고 시간이 지남에 따라 테스트를 "추가 작업"으로 쉽게 볼 수 있습니다. 작게 시작하십시오. 테스트 사례 0 작성-모듈을로드하고 성공을보고하십시오. 당신이 스스로 그렇게 많은 것을 강요한다면, 시험에 대한 관성 장벽이 깨집니다. 문서 읽기를 포함하여 처음으로 30 분 미만입니다. 이제 테스트 사례 1을 작성하십시오. 메소드 중 하나를 호출하고 "아무것도 없는지", 즉 오류가 다시 발생하지 않는지 확인하십시오. 테스트 사례 1은 1 분 미만이 소요됩니다. 관성이 사라지면 테스트 범위를 점진적으로 확장하기가 쉬워집니다.
    • 이제 코드로 테스트를 발전 시키십시오. 모의 서버와 그 모든 것에서 "올바른"엔드-투-엔드 테스트가 어떤 모습 일지 겁 먹지 마십시오. 코드는 단순하게 시작하여 새로운 사례를 처리하도록 발전합니다. 테스트도해야합니다. 코드에 새로운 사례와 새로운 복잡성을 추가 할 때 테스트 사례를 추가하여 새로운 코드를 연습하십시오. 버그를 발견하면 결함이있는 코드를 다루기 위해 확인 및 / 또는 새로운 사례를 추가하십시오. 디버깅 할 때 코드 조각에 대한 확신이 없으면 돌아가서 테스트를 추가하여 코드가 생각하는대로 작동하는지 확인하십시오. 호출하는 다른 서비스, 스크랩하는 웹 사이트 등의 예제 데이터 문자열을 캡처하여 구문 분석 코드에 제공합니다. 여기에 몇 가지 경우, 거기에 향상된 유효성 검사가 있으며, 매우 안정적인 코드로 끝납니다.

또한 권장 Node.js 모듈 의 공식 목록 을 확인하십시오 . 그러나 GitHub의 노드 모듈 Wiki 는 훨씬 더 완전하고 좋은 리소스입니다.


노드를 이해하려면 몇 가지 주요 설계 선택을 고려하는 것이 좋습니다.

Node.js는 EVENT BASED 이며 ASYNCHRONOUS / 비 차단입니다. 들어오는 HTTP 연결과 같은 이벤트는 약간의 작업을 수행하고 데이터베이스에 연결하거나 다른 서버에서 콘텐츠를 가져 오는 것과 같은 다른 비동기 작업을 시작하는 JavaScript 함수를 시작합니다. 이러한 작업이 시작되면 이벤트 기능이 종료되고 Node.js가 다시 절전 모드로 돌아갑니다. 데이터베이스 연결이 설정되거나 컨텐츠로 응답하는 외부 서버와 같은 다른 일이 발생하면 콜백 함수가 실행되고 더 많은 JavaScript 코드가 실행되어 데이터베이스 쿼리와 같은 훨씬 더 비동기적인 작업이 시작될 수 있습니다. 이런 식으로 Node.js는 여러 병렬 워크 플로에 대한 활동을 행복하게 인터리빙하여 언제든지 차단되지 않은 활동을 실행합니다. 이것이 Node.js가 수천 개의 동시 연결을 관리하는 훌륭한 일을하는 이유입니다.

왜 다른 사람들처럼 연결 당 하나의 프로세스 / 스레드를 사용하지 않습니까?Node.js에서 새로운 연결은 매우 작은 힙 할당입니다. 새로운 플랫폼을 가동하려면 일부 플랫폼에서 메가 바이트의 메모리가 훨씬 더 많이 필요합니다. 그러나 실제 비용은 컨텍스트 전환과 관련된 오버 헤드입니다. 10 ^ 6 개의 커널 스레드가있을 때, 커널은 누가 다음에 실행할지를 알아 내기 위해 많은 작업을 수행해야합니다. 많은 작업이 Linux 용 O (1) 스케줄러를 작성하는 데 투입되었지만, 결국 CPU 시간에 대해 경쟁하는 10 ^ 6 프로세스보다 단일 이벤트 중심 프로세스를 갖는 것이 훨씬 효율적입니다. 또한 과부하 조건에서 다중 프로세스 모델은 중요한 관리 및 관리 서비스, 특히 SSHD를 굶주 리며 매우 열악하게 작동합니다.

Node.js는 단일 스레드 이며 잠금이 없습니다 . Node.js는 매우 신중한 설계 선택으로 프로세스 당 단일 스레드 만 있습니다. 이 때문에 여러 스레드가 동시에 데이터에 액세스하는 것은 기본적으로 불가능합니다. 따라서 잠금이 필요하지 않습니다. 실이 단단합니다. 정말 힘들어요. 당신이 그것을 믿지 않는다면, 당신은 충분한 스레드 프로그래밍을하지 않은 것입니다. 올바른 잠금을 얻는 것은 어렵고 실제로 추적하기 어려운 버그가 발생합니다. 잠금 및 멀티 스레딩을 제거하면 가장 초기의 버그 중 하나가 사라집니다. 이것이 노드의 가장 큰 장점 일 수 있습니다.

그러나 16 코어 박스를 어떻게 활용합니까?

두 가지 방법:

  1. 이미지 인코딩과 같은 대규모 컴퓨팅 작업의 경우 Node.js는 하위 프로세스를 시작하거나 추가 작업자 프로세스로 메시지를 보낼 수 있습니다. 이 디자인에서는 하나의 스레드가 이벤트 흐름을 관리하고 N 개의 프로세스가 많은 컴퓨팅 작업을 수행하고 다른 15 개의 CPU를 씹습니다.
  2. 웹 서비스에서 처리량을 조정하려면 클러스터를 사용하여 코어 당 하나씩 하나의 상자에서 여러 개의 Node.js 서버를 실행해야 합니다 (Node.js v0.6.x의 경우 여기에 링크 된 공식 "클러스터"모듈은 다른 API). 그런 다음이 로컬 Node.js 서버는 소켓에서 경쟁하여 새 연결을 수락하여 서버 간로드 균형을 조정할 수 있습니다. 연결이 승인되면 이러한 공유 프로세스 중 하나에 단단히 연결됩니다. 이론적으로 이것은 나쁘게 들리지만 실제로는 잘 작동하며 스레드 안전 코드 작성의 두통을 피할 수 있습니다. 또한 이는 Node.js가 메모리 대역폭을 사용하여보다 효과적으로 CPU 캐시 선호도를 얻음을 의미합니다.

Node.js를 사용하면 땀을 흘리지 않고 정말 강력한 일을 할 수 있습니다. 다양한 작업을 수행하고 TCP 포트에서 명령을수신하고일부 이미지를 인코딩하는 Node.js 프로그램이 있다고 가정하십시오. 다섯 줄의 코드를 사용하면 현재 작업 상태를 보여주는 HTTP 기반 웹 관리 포털을 추가 할 수 있습니다. 이것은 쉬운 일입니다.

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(myJavascriptObject.getSomeStatusInfo());
}).listen(1337, "127.0.0.1");

이제 URL을 누르고 실행중인 프로세스의 상태를 확인할 수 있습니다. 몇 개의 버튼을 추가하면 "관리 포털"이 있습니다. Perl / Python / Ruby 스크립트를 실행중인 경우 "관리 포털에서 발생"하는 것은 간단하지 않습니다.

그러나 JavaScript는 느리고 / 나쁘고 / 사악하고 / 악마가 아닌가? JavaScript에는 이상한 점이 있지만 "좋은 부분"에는 매우 강력한 언어가 있으며 어쨌든 JavaScript는 클라이언트 (브라우저)의 언어입니다. JavaScript는 여기 있습니다. 다른 언어는 IL을 목표로 삼고 있으며 세계적 수준의 인재가 최첨단 JavaScript 엔진을 생산하기 위해 경쟁하고 있습니다. 브라우저에서 JavaScript의 역할로 인해 JavaScript를 빠르게 만드는 데 많은 노력이 기울이고 있습니다. V8적어도 이번 달에는 최신 자바 스크립트 엔진입니다. 효율성과 안정성면에서 다른 스크립팅 언어를 날려 버립니다 (루비). 그리고 최고의 JavaScript 엔진을 구축하기 위해 경쟁하는 Microsoft, Google 및 Mozilla의 문제를 다루는 거대한 팀과 만 나아질 것입니다 (모든 현대 엔진이 수많은 JIT를 수행하는 것처럼 더 이상 JavaScript "통역사"가 아닙니다)한 번의 실행 코드에 대한 폴백으로 만 해석하여 후드에서 컴파일). 네, 우리는 모두 이상한 JavaScript 언어 선택을 고칠 수 있기를 원하지만 실제로 그렇게 나쁘지는 않습니다. 그리고 언어가 너무 유연하여 JavaScript를 실제로 코딩하지 않고 Step 또는 jQuery를 코딩하고 있습니다. 다른 언어보다 JavaScript에서 라이브러리가 경험을 정의합니다. 웹 응용 프로그램을 구축하려면 어쨌든 JavaScript를 알아야합니다. 따라서 서버에서 JavaScript로 코딩하면 일종의 기술 시너지 효과가 있습니다. 클라이언트 코드 작성을 두려워하지 않았습니다.

게다가, 당신이 정말로 자바 스크립트를 싫어한다면, CoffeeScript 와 같은 구문 설탕을 사용할 수 있습니다 . 또는 Google Web Toolkit (GWT) 과 같은 JavaScript 코드를 생성하는 다른 모든 것 .

JavaScript에 대해 말하면 "폐쇄"란 무엇입니까? -콜 체인 전체에서 어휘 범위 변수를 유지한다고 말하는 멋진 방법입니다. ;) 이렇게 :

var myData = "foo";
database.connect( 'user:pass', function myCallback( result ) {
    database.query("SELECT * from Foo where id = " + myData);
} );
// Note that doSomethingElse() executes _BEFORE_ "database.query" which is inside a callback
doSomethingElse();

"myData"를 객체에 숨기는 등 어색한 작업을 수행하지 않고 어떻게 사용할 수 있습니까? Java와 달리 "myData"변수는 읽기 전용 일 필요는 없습니다. 이 강력한 언어 기능은 비동기 프로그래밍이 덜 장황하고 덜 고통스럽게 만듭니다.

비동기 코드 작성은 간단한 단일 스레드 스크립트를 작성하는 것보다 항상 더 복잡하지만 Node.js를 사용하면 그리 어렵지 않으며 수천 개의 동시 연결에 대한 효율성과 확장 성 외에도 많은 이점을 얻을 수 있습니다. ..


" 'myData'변수는 읽기 전용 일 필요는 없습니다"-동시성 문제를 방지하기 위해 대부분의 시간을 불변으로 유지하고 싶은 것 같습니다.
Nick

1
@ 닉-그건 거짓입니다. "동시성 문제"는 노드가 단일 스레드라는 사실에 의해 완화됩니다. 노드 잠금은 존재하지 않습니다. 단일 스레드 패러다임에서는 필요하지 않습니다.
Dave Dopson

클러스터는 노드 0.6의 노드 코어에 통합되었습니다. stackoverflow.com/a/8470986/212702 nodejs.org/docs/latest/api/cluster.html#cluster_cluster
Laurent Debricon

1
추신 : 사이드 노트-실제로 게시물이 "커뮤니티 위키"가 될 정도로 충분히 편집했습니다 (임계 값은 10 편집입니다). 실수로 이것이 공감대에서 얻는 평판을 막을 때 이것은 일종의 영광이라고 생각했습니다. 결국, 사전 CW-상태 유권자 중 하나는 희망 "unvote을"(클릭 실수로 :) 내가 잃어버린 명성을 ... 내가 제기 혼동 meta.stackexchange.com/questions/129941/...을 어떤 "지역 사회에서 가르치게되었다 위키는 실제로 의미합니다. 개조는 CW 상태를 제거하기에 충분히 친절했습니다. :)
Dave Dopson

1
@ John-내 디버깅 주석은 바닐라 asnyc에도 절대적으로 적용됩니다. 디버깅을 중단하려면 "process.nextTick (...)"에서 함수 호출을 래핑하면됩니다. 그런 다음 내 스택 추적이 process.nextTick으로 시작합니다. 그렇게 도움이되지 않습니다. 내가 정말로 알고 싶은 것은 "어느 일정이 예약 된 process.nextTick?"입니다. 나는 그 데이터를 "인과 적 체인"이라고 부르며, Java 예외 처리에서 'causedBy'를 생각 나게한다. 코드가 손실됩니다.
Dave Dopson

85

V8 은 JavaScript의 구현입니다. 독립 실행 형 JavaScript 응용 프로그램을 실행할 수 있습니다.

Node.js는 이벤트 I / O를 수행하는 V8 용으로 작성된 라이브러리입니다. 이 개념은 설명하기가 조금 까다 롭고 누군가가 나보다 더 나은 설명으로 대답 할 것이라고 확신합니다 ... 요점은 입력 또는 출력을 수행하고 발생하기를 기다리는 것이 아니라 기다릴 필요가 없다는 것입니다. 그것을 끝내기 위해. 예를 들어, 파일의 마지막 편집 시간을 요청하십시오.

// Pseudo code
stat( 'somefile' )

몇 밀리 초가 걸리거나 몇 초가 걸릴 수 있습니다. 이벤트 I / O를 사용 하면 간단히 요청을 시작하고 대기하지 않고 요청이 완료 될 때 실행되는 콜백을 연결합니다.

// Pseudo code
stat( 'somefile', function( result ) {
  // Use the result here
} );
// ...more code here

이를 통해 브라우저의 JavaScript 코드와 매우 유사합니다 (예 : Ajax 스타일 기능 사용).

자세한 내용을 보려면 Node.js 기사 라이브러리 / 플랫폼에 대한 나의 소개 인 기사를 확인하십시오 .


4
이벤트 IO는 잠금, 스레딩, 프로세스, 클로저를 사용하지 않고 어떻게 구현됩니까? 그리고 나는 개념이 함수형 프로그래밍과 Erlang의 개념과 매우 유사하다고 생각합니다.
Jeff

1
내가 아는 한 간단한 이벤트 루프로 구현되었습니다. v8에는 자바 스크립트 구현과 마찬가지로 콜백 / 기타 기능이 이미 있습니다.
rfunduk

2
node.js의 IO 이벤트 루프는 주어진 시점에 최대 하나의 작업 만 수행됨을 의미합니다. 스레드 전환의 오버 헤드가 없으므로 node.js가 매우 빠르며 두 번째로 Java가 악명 높은 많은 동시성 버그를 발견 할 수 없습니다.
nalply

1
"... 클로저를 사용하지 않고 이벤트 IO를 어떻게 구현합니까?" JavaScript는 클로저를 지원하며 node.js에서 항상 사용됩니다 (여기 예제의 익명 함수 an).
panzi

@panzi : Jeffrey가 node.js가 '없이'구현 된 것들의 목록에 클로저를 포함시키는 것을 보지 못했습니다. 분명히 자바 스크립트의 모든 함수는 그 범위를 둘러싸고있다 :)
rfunduk

35

Node.js 는 서버 측 JavaScript 코드 용으로 제작 된 오픈 소스 명령 줄 도구입니다. tarball을 다운로드 하고 소스를 컴파일하고 설치할 수 있습니다 . JavaScript 프로그램을 실행할 수 있습니다.

JavaScript는 Chrome 브라우저 에서 사용되는 Google에서 개발 한 JavaScript 엔진 인 V8 에서 실행됩니다 . JavaScript API를 사용하여 네트워크 및 파일 시스템에 액세스합니다.

성능과 병렬 작업 수행 기능으로 유명합니다.

Node.js를 이해 의 최선의 설명이다 Node.js를 지금까지 발견했다.

다음은 주제에 대한 좋은 기사입니다.


13

클로저는 작성된 컨텍스트에서 코드를 실행하는 방법입니다.

이것이 동시성을 의미하는 것은 변수를 정의한 다음 비 차단 I / O 함수 를 시작 하고 콜백을 위해 익명 함수를 보낼 수 있다는 것입니다.

작업이 완료되면 콜백 함수가 변수와 함께 컨텍스트에서 실행됩니다. 이것이 클로저입니다.

클로저가 비 블로킹 I / O로 애플리케이션을 작성하는 데 매우 유용한 이유는 비동기 적으로 실행되는 함수의 컨텍스트를 매우 쉽게 관리 할 수 ​​있기 때문입니다.


8

템플릿을 관리하고 점진적으로 향상시키는 방법에 관한 두 가지 좋은 예가 있습니다. 완벽하게 작동하려면 몇 가지 간단한 JavaScript 코드 만 있으면됩니다.

다음 기사를보고 읽는 것이 좋습니다.

언어를 선택하고 HTML 파일 템플릿을 관리하는 방법과 DOM 구조 에서 단일 CSS 클래스 이름 을 업데이트하기 위해 수행 해야하는 작업 (예 : 사용자가 메뉴 항목을 클릭하고 "선택"하고 페이지 내용을 업데이트하십시오.

Node.js를 사용하면 클라이언트 측 JavaScript 코드에서 수행하는 것만 큼 간단합니다. DOM 노드를 가져와 CSS 클래스를 적용하십시오. DOM 노드와 컨텐츠를 innerHTML로 가져 오십시오 (이를 수행하려면 추가 JavaScript 코드가 필요합니다. 자세한 내용은 기사를 읽으십시오).

또 다른 좋은 예는 동일한 코드로 JavaScript를 켜거나 끄는 방식으로 웹 페이지를 호환 가능하게 만들 수 있다는 것입니다. 사용자가 달력을 사용하여 날짜를 선택할 수 있도록 JavaScript로 날짜를 선택했다고 가정 해보십시오. 동일한 JavaScript 코드를 작성 (또는 사용)하여 JavaScript를 켜거나 끌 수 있습니다.


7

Node.js의 이벤트 중심 모델을 가장 잘 설명하는 매우 빠른 패스트 푸드 점 유추가 있습니다. 전체 기사 인 Node.js, 의사 사무실 및 패스트 푸드 식당 – 이벤트 중심 프로그래밍 이해

요약은 다음과 같습니다.

패스트 푸드 조인트가 전통적인 스레드 기반 모델을 따르는 경우, 음식을 주문하고받을 때까지 줄을 서서 기다리십시오. 주문이 완료 될 때까지 뒤에있는 사람은 주문할 수 없습니다. 이벤트 중심 모델에서는 음식을 주문한 다음 줄을 서서 기다립니다. 그런 다음 다른 사람은 자유롭게 주문할 수 있습니다.

Node.js는 이벤트 중심이지만 대부분의 웹 서버는 스레드 기반입니다 .York은 Node.js의 작동 방식을 설명합니다.

  • 웹 브라우저를 사용하여 Node.js 웹 서버에서 "/about.html"을 요청합니다.

  • Node.js 서버는 요청을 수락하고 디스크에서 해당 파일을 검색하는 함수를 호출합니다.

  • Node.js 서버는 파일 검색을 기다리는 동안 다음 웹 요청을 처리합니다.

  • 파일을 검색 할 때 Node.js 서버 큐에 삽입되는 콜백 함수가 있습니다.

  • Node.js 서버는이 경우 "/about.html"페이지를 렌더링하여 웹 브라우저로 다시 보내는 기능을 실행합니다. "


6

글쎄요, 이해합니다

  • 노드의 목표는 확장 가능한 네트워크 프로그램을 쉽게 구축 할 수있는 방법을 제공하는 것입니다.
  • 노드는 디자인면에서 루비의 이벤트 머신 또는 파이썬의 뒤틀린 시스템과 유사하며 영향을받습니다.
  • V8 자바 스크립트에 대한 이벤트 I / O

나를 위해 그것은 당신이 세 가지 가정에서 모두 정확하다는 것을 의미합니다. 도서관은 확실히 유망 해 보인다!


1
내가 페이지에 대해 발견하는 많은 시간은 매우 모호합니다.
Jeff

6

또한 Google의 V8이 매우 빠르다는 것을 잊지 마십시오. 실제로 컴파일 된 이진의 성능과 일치하는 JavaScript 코드를 기계 코드로 변환합니다. 다른 모든 위대한 것들과 함께, 그것은 엄청나게 빠릅니다.


3

Q : 프로그래밍 모델은 이벤트 중심이며 특히 I / O를 처리하는 방식입니다. 입니다.

옳은. 콜백을 사용하므로 파일 시스템에 대한 액세스 요청은 파일 시스템으로 요청을 보낸 다음 Node.js가 다음 요청을 처리하기 시작합니다. 파일 시스템에서 응답을 받으면 콜백 코드를 실행하는 I / O 요청에 대해서만 걱정합니다. 그러나 동기 I / O 요청 (요청 차단)을 수행 할 수 있습니다. 비동기 (콜백) 또는 동기 (대기) 중에서 선택하는 것은 개발자의 몫입니다.

Q : JavaScript를 사용하고 파서는 V8입니다.

Q : 동시 서버 응용 프로그램을 만드는 데 쉽게 사용할 수 있습니다.

예, 상당히 많은 JavaScript를 직접 코딩해야합니다. 전체 온라인 설명서 및 샘플 응용 프로그램과 함께 제공 되는 http://www.easynodejs.com/ 과 같은 프레임 워크를 보는 것이 좋습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.