English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Node.js에서2009연至今日, 두 년이 넘는 시간 동안 발전하였으며, 성장 속도는 눈에 띄게 되었습니다. GitHub의 방문량이 Rails를 능가하다가, 작년 말 Node.js의 창립자 Ryan Dalh가 Joyent에 합류하여 기업 지원을 받으며, 올해 Windows 이식 버전을 출시하면서 Node.js의 전망은 기술 커뮤니티의 인정을 받았습니다. InfoQ는 Node.js의 발전을 지속적으로 주시고 있으며, 올해의 두 번의 Qcon 대회(베이징 지점과 하이츠 지점)에서도 특별 강의가 열렸습니다. Node.js가 국내 기술 퍼블리싱을 더 잘 이루기 위해, 'Node.js를 깊이 있게 이해하다'는专栏을 운영하기로 결정하였으며, Node.js 분야의 브루도어, 개발자, 기술 전문가를 초대하여 Node.js의 다양한 측면을 설명하여 독자들이 Node.js에 더 깊이 이해할 수 있도록 하고, 새로운 기술에 대한 논의와 실천에 적극적으로 참여할 수 있도록 하였습니다.
专栏的第一篇文章《什么是Node.js》尝试从各个角度来阐述Node.js的基本概念、发展历史、优势等,对该领域不熟悉的开发人员可以通过本文了解Node.js的一些基础知识。
이专栏의 첫 번째 기사인 《Node.js는 무엇인가요》는 Node.js의 기본 개념, 발전 역사, 장점 등을 다양한 관점에서 설명하려고 시도합니다. 이 분야에 익숙하지 않은 개발자들은 이 기사를 통해 Node.js의 일부 기본 지식을 이해할 수 있습니다.
이름에서 시작해 보겠습니다
Node.js에 대한 기술 보도는 점점 더 많아지고 있으며, Node.js의 작성 방법도 다양합니다. NodeJS, Nodejs와 같이 작성되는 경우도 있으며, 어떤 작성 방법이 가장 표준적인지 알 수 없습니다. 우리는 공식적인 설명을 따릅니다. Node.js 공식 웹사이트에서는 항상 프로젝트를 "Node" 또는 "Node.js"로 불렀으며, 다른 설명을 찾지 못했습니다. "Node"은 가장 많이 사용되며, Node라는 단어의 의미와 용도가 너무 넓아 개발자들이 오해할 수 있어 두 번째 이름을 사용했습니다. .js 접미사는 Node 프로젝트의 본질을 나타냅니다. 다른 이름들은 다양하며, 명확한 출처가 없어 사용하지 않는 것이 좋습니다.
Node.js는 JS 애플리케이션이 아니라, JS 실행 플랫폼입니다++Node.js라는 이름을 볼 때, 초보자들은 이것이 Javascript 애플리케이션이라고 오해할 수 있습니다. 그러나 실제로는 Node.js는 C++언어로 작성하기 시작했습니다. 이는 Javascript의 실행 환경입니다. 왜 C8언어를 선택한 이유는 무엇인가요? Node.js 창립자 Ryan Dahl이 기억하는 바에 따르면, 그는 처음에 Node.js를 Ruby로 작성하고자 했지만, Ruby 가상 기계의 성능이 요구 사항을 충족시키지 못하다는 것을 깨달았습니다. 그 후 그는 V++언어입니다. Javascript 애플리케이션이 아니라면 왜 .js라고 하지 않을까요? Node.js는 Javascript의 실행 환경입니다. Javascript를 언급하면, 많은 사람들이 일상적으로 사용하는 브라우저를 생각합니다. 현대 브라우저는 렌더링 엔진, Javascript 엔진 등 다양한 구성 요소를 포함하고 있으며, 그 중 Javascript 엔진은 웹 페이지에 포함된 Javascript 코드를 해석하고 실행하는 역할을 합니다. 웹 프론트엔드에서 가장 중요한 언어 중 하나로, Javascript는 전문가들에게만 속해 있었습니다. 그러나 Node.js는 백엔드 Javascript 실행 환경입니다. (지원하는 시스템은 예를 들어*nux, Windows) 이란 것은, 시스템 수준이나 서버 측의 Javascript 코드를 작성하여 Node.js가 해석하고 실행할 수 있다는 것을 의미합니다. 간단한 명령어는 예를 들어 다음과 같습니다:
#node helloworld.jsNode.js
Google Chrome 브라우저의 V8엔진은 성능이 좋으며, 파일 작업, 네트워크 프로그래밍 등 많은 시스템 수준 API를 제공합니다. 브라우저에서 실행되는 JavaScript 코드는 다양한 보안 제한을 받으며, 클라이언트 시스템에 대한 작업은 제한적입니다. 이에 비해 Node.js는 전면적인 백엔드 실행 시간이며, JavaScript에 다른 언어가 제공할 수 있는 많은 기능을 제공합니다.
Node.js는 이벤트 드리브링, 비동기 프로그래밍을 사용하여 네트워크 서비스를 위해 설계되었습니다
이벤트 드리브링이라는 단어는 익숙하지 않습니까? 일부 전통적인 언어의 네트워크 프로그래밍에서는 콜백 함수를 사용할 수 있습니다. 예를 들어, 소켓 자원이 특정 상태에 도달할 때 등록된 콜백 함수가 실행됩니다. Node.js의 설계 원칙은 이벤트 드리브링을 중심으로 하며, 제공하는 대부분의 API는 이벤트 기반의 비동기 스타일입니다. Net 모듈을 예로 들어보면, net.Socket 객체에는 다음과 같은 이벤트가 있습니다: connect, data, end, timeout, drain, error, close 등, Node.js를 사용하는 개발자는 자신의 비즈니스 로직에 따라 적절한 콜백 함수를 등록해야 합니다. 이러한 콜백 함수들은 비동기적으로 실행됩니다. 이는 코드 구조에서 이 함수들이 순차적으로 등록되어 보이지만, 그들은 자신의 등록 순서에 의존하지 않고, 적절한 이벤트가 발생을 기다립니다. 이벤트 드리브링, 비동기 프로그래밍의 설계(관심이 있는 독자는 저의 또 다른 기사 《Node.js의 비동기 프로그래밍 스타일》을 참조하세요)의 중요한 장점은 시스템 자원을 최대한 활용하며, 코드 실행을 특정 작업이 완료될 때까지 기다리지 않는 것입니다. 제한된 자원은 다른 작업에 사용될 수 있습니다. 이러한 설계는 백엔드 네트워크 서비스 프로그래밍에 매우 적합하며, Node.js의 목표도 이곳에 있습니다. 서버 개발에서는 병목된 요청 처리가 큰 문제입니다. 블록된 함수는 자원 낭비와 시간 지연을 유발합니다. 이벤트 등록과 비동기 함수를 통해 개발자는 자원 활용도를 향상시키고 성능을 개선할 수 있습니다.
Node.js가 제공하는 지원 모듈에서, 파일 작업을 포함한 많은 함수들이 비동기적으로 실행되는 것을 볼 수 있습니다. 이는 전통적인 언어와 차이가 있으며, 서버 개발을 편리하게 하기 위해 Node.js의 네트워크 모듈은 매우 많습니다. 이는 HTTP, DNS, NET, UDP, HTTPS, TLS 등을 포함하며, 개발자는 이를 기반으로 빠르게 웹 서버를 구축할 수 있습니다. 간단한 helloworld.js 예제를 들어보면:
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(80, "127.0.0.1");
위의 코드는 간단한 HTTP 서버를 구축합니다(예제 배포는 http://helloworld.cnodejs.net/ 에서 접근할 수 있습니다), 로컬에서80 포트, 어떤 HTTP 요청이든 서버는 헤더 상태 코드가200, Content-Type'의 값이 text/plain'의 "Hello World" 텍스트 응답. 이小程序에서 우리는 몇 가지 점을 볼 수 있습니다:
Node.js의 네트워크 프로그래밍은 매우 편리하며, 제공하는 모듈(이곳에서는 http)은 쉽게 사용할 수 있는 API 인터페이스를 제공합니다. 단순한 몇 행의 코드로 서버를 구축할 수 있습니다.
이벤트 드라이브와 비동기 프로그래밍을 반영하며, createServer 함수의 매개변수에回调 함수를 지정합니다(JavaScript의 익명 함수로 구현됨), HTTP 요청이 오면 Node.js가 해당回调 함수를 호출하여 요청을 처리하고 응답합니다.当然了, 이 예제는 상대적으로 간단하며, 많은 이벤트 등록이 없습니다. 향후의 기사에서 더 많은 실제 예제를 볼 수 있습니다.
Node.js의 특징
이제 Node.js의 특징에 대해 설명해 보겠습니다. 이벤트 드라이브와 비동기 프로그래밍의 특징은 이미 자세히 설명했습니다. 이곳에서는 반복하지 않습니다.
Node.js의 성능은 좋습니다. 창립자 Ryan Dahl의 말에 따르면, 성능은 Node.js가 고려하는 중요한 요소 중 하나입니다. C++와 V8그렇지 않고 Ruby나 다른 가상 기계도 성능 목적을 위해 기반하고 있습니다. Node.js는 설계상 매우 용감하며, 단일 프로세스, 단일 스레드 모드로 실행됩니다(놀라운 점 아닌가요? 이는 JavaScript의 실행 방식과 일치합니다), 이벤트 드라이브 메커니즘은 Node.js가 내부 단일 스레드를 통해 효율적으로 이벤트 루프 퀸을 유지하는 것을 통해 구현됩니다. 다중 스레드의 자원 사용과 컨텍스트 전환 없이, 이는 대규모 HTTP 요청에 대해 Node.js가 이벤트 드라이브로 모든 것을 해결한다는 것을 의미합니다. 전통적인 언어의 네트워크 서비스 개발자는 다중 스레드 동기화와 협력에 매우 익숙할 수 있지만, Node.js에 대해선 우리는 그 특징을 받아들이고 이해해야 합니다. 따라서 이러한 설계는 CPU(이벤트 루프 처리?)에 대한 부담이 집중되는 것을 예측할 수 있으며, 그렇지 않으면 메모리(Java 가상 기계가 OutOfMemory 예외를 발생시키는 날을 기억하시나요?)에 대한 것입니다. 실제로 보고 보세요, 타obao 공유 데이터 플랫폼 팀의 Node.js 성능 테스트를 보겠습니다:
물리 기계 구성:RHEL 5.2、CPU 2.2GHz、메모리4G
Node.js 응용 시나리오:MemCache 대리자,마다100바이트 데이터
커넥션 풀 크기:50
동시 접속 사용자 수:100
테스트 결과(소켓 모드):메모리(30M)、QPS(16700)、CPU(95%)
위의 결과에서, 이와 같은 테스트 시나리오에서 qps는16700회, 메모리는30M(그 중 V8스택 사용22M),CPU는95%,瓶颈이 될 수 있습니다. 또한, 많은 실무자들이 Node.js의 성능 분석을 했습니다. 일반적으로, Node.js의 성능은 인정받고 있으며, 이는 인기의 주요 원인 중 하나입니다. Node.js가 단일 프로세스, 단일 스레드 모드를 사용하는 경우, 현재 다핵 CPU가 유행하는 환경에서, 단일 핵 성능이 뛰어난 Node.js는 어떻게 다핵 CPU를 활용할 수 있을까요? 창시자 Ryan Dahl은 여러 Node.js 프로세스를 실행하고, 일정한 통신 메커니즘을 통해 작업을 조정하는 것을 제안했습니다. 현재, 많은 제3자 Node.js 다 프로세스 지원 모듈이 출시되었습니다. 이 블로그의 다음 기사에서는 Node.js가 다핵 CPU에서의 프로그래밍에 대해 자세히 설명할 것입니다.
Node.js의 또 다른 특징은 지원하는 프로그래밍 언어가 Javascript인 것입니다. 동적 언어와 정적 언어의 장단점을 비교하는 것은 여기서는 논의하지 않겠습니다. 단, 세 가지를 말씀드리겠습니다:
var hostRequest = http.request(requestOptions,function(response) { var responseHTML =''; response.on('data', function (chunk) { responseHTML = responseHTML + chunk; }); response.on('end',function(){ console.log(responseHTML); // 사용할 만한 일을 해보세요. }); });
위의 코드에서는 end 이벤트에서 responseHTML 변수를 처리해야 하며, Javascript의 클로저 특성 덕분에 두回调 함수 외에 responseHTML 변수를 정의할 수 있으며, data 이벤트에 대한回调 함수에서 그 값을 지속적으로 수정하고, 최종적으로 end 이벤트에서 처리할 수 있습니다.
Javascript는 프론트엔드 엔지니어의 주력 언어로, 기술 커뮤니티에서 충분한 영향력을 가지고 있습니다. 그리고 웹 기술의 지속적인 발전, 특히 프론트엔드의 중요성 증가로 인해 많은 프론트엔드 엔지니어들이 '백엔드 애플리케이션'에 도전하기 시작했습니다. 많은 Node.js를 사용하는 기업에서 엔지니어들은 Javascript에 익숙하기 때문에 Node.js를 선택한다고 말합니다.
Javascript의 익명 함수와 클로저 기능은 이벤트 드리븐, 비동기 프로그래밍에 매우 적합하며, helloworld 예제에서 익명 함수 형태로回调 함수가 사용되어 매우 편리함을 볼 수 있습니다. 클로저의 역할은 더 큽니다. 아래의 코드 예제를 보세요:
Javascript는 동적 언어 중에서 성능이 좋으며, 개발자들은 Javascript, Python, Ruby 등의 동적 언어에 대한 성능 분석을 수행했고, Javascript의 성능이 다른 언어보다 좋다는 것을 발견했습니다. 또한 V8엔진도 동종 엔진 중에서도 우수한 것으로, 따라서 Node.js의 성능도 이를 통해 개선되었습니다.
Node.js 발전 역사
2009년2월, Ryan Dahl이 블로그에서 V8가벼운 웹 서버를 만들고 라이브러리 세트를 제공합니다.
2009년5월, Ryan Dahl이 GitHub에서 Node.js의 최초 버전의 일부 패키지를 출시했고, 그 후 몇 개월 동안 사람들이 Node.js를 사용하여 애플리케이션을 개발하기 시작했습니다.
2009년11월과2010년4월, 두 번째 JSConf 대회에서 Node.js 강의가 진행되었습니다.
2010년 연말, Node.js는 클라우드 서비스 제공업체 Joyent의 지원을 받았고, 창립자 Ryan Dahl이 Joyent에 전職으로 입사하여 Node.js의 발전을 책임지게 되었습니다.
2011년7월, Node.js는 마이크로소프트의 지원으로 Windows 버전을 출시했습니다.
Node.js 애플리케이션 사례
Node.js는 두년 반 만에 탄생했지만, 발전势头은 점점 Ruby를 추월하고 있습니다./Rails, 여기서는 Node.js를 사용하는 일부 기업 애플리케이션 사례를 소개했습니다. 고객들의 목소리를 들어보세요.
LinkedIn에서 최근 출시한 모바일 애플리케이션에서 NodeJS가 배후 기반으로 사용되고 있습니다. LinkedIn 모바일 개발 주责任人 Kiran Prasad은 언론에, 전체 모바일 소프트웨어 플랫폼이 NodeJS로 구축되었다고 밝혔습니다:
LinkedIn 내부에서 많은 기술을 사용하고 있지만, 이동 서버 부분에서는 완전히 Node.js를 기반으로 하고 있습니다.
(이를 사용하는 이유) 첫째, 유연성 때문입니다. 둘째, Node를 이해한다면, Node가 가장 잘하는 것은 다른 서비스와의 통신입니다. 모바일 애플리케이션은 우리의 플랫폼 API와 데이터베이스와의 상호작용을 수행해야 합니다. 우리는 많은 데이터 분석을하지 않았습니다. Ruby on Rails와 비교하여, 개발 팀은 Node가 성능면에서 많이 향상되었다고 발견했습니다. 그들은 각 물리 머신에서 실행했습니다.15가 virtually 서버(15인스턴스) 중4인스턴스로 두 배의 트래픽을 처리할 수 있습니다. 용량 평가는 로드 테스트 결과에 기반합니다.
기업 소셜 서비스 웹사이트 Yammer은 Node를 사용하여 자체 플랫폼의 크로스 도메인 프록시 서버를 생성하여, 제3자 개발자가 자신의 도메인에서 토래�된 JavaScript 코드와 Yammer 플랫폼 API의 AJAX 통신을 통해 이 서버를 통해 가능하게 합니다. Yammer 플랫폼 기술 관리자 Jim Patterson은 Node의 장점과 단점에 대해 자신의 의견을 제시했습니다:
(장점) Node는 이벤트 드라이브와 비락스 없이 작동하기 때문에, 병렬 요청을 처리하는 데 매우 적합합니다. 따라서 Node에 구축된 프록시 서버는 Ruby와 같은 다른 기술(예: Ruby)을 사용한 서버보다 훨씬 더 나은 성능을 보입니다. 또한, Node 프록시 서버와의 인터랙션은 JavaScript 언어로 작성된 클라이언트 코드로 이루어져 있으며, 클라이언트와 서버 모두 동일한 언어로 작성되어 매우 멋진 일입니다.
(단점) Node는 상대적으로 새로운 오픈 소스 프로젝트이므로 매우 안정적이지 않으며, 항상 변화하고 있으며, 충분한 제3자 라이브러리 지원이 부족합니다. Ruby와 비교해 보면,/Rails의 당시 모습.
유명한 프로젝트 푸시 웹사이트 GitHub도 Node 애플리케이션을 시도했습니다. 이 Node 애플리케이션은 NodeLoad라는 이름을 가지고 있으며, 아카이브 다운로드 서버입니다(어떤 저장 분기의 tarball이나 zip 파일을 다운로드할 때 사용됩니다). GitHub의 이전 아카이브 다운로드 서버는 Ruby로 작성되었습니다. 구형 시스템에서, 아카이브 다운로드 요청은 Resque 작업을 생성합니다. 이 작업은 실제로 아카이브 서버에서 git archive 명령어를 실행하여 파일 서버에서 데이터를 꺼내옵니다. 그런 다음, 초기 요청은 memcache 플래그가 존재하는지 확인한 후 최종 다운로드 주소로 리디렉션합니다. 구형 시스템은 약3Sinatra 인스턴스와3Resque 워커가 있습니다. GitHub 개발자들은 이를 Node 애플리케이션의 좋은 기회로 생각합니다. Node는 이벤트 드라이브이며, Ruby의 블록 모델에 비해 Node는 git 아카이브를 더 잘 처리할 수 있습니다. 새로운 다운로드 서버를 작성하는 과정에서, 개발자들은 Node가 이 기능에 매우 적합하다고 생각했으며, 또한 Node 라이브러리 socket.io를 사용하여 다운로드 상태를 모니터링했습니다.
해외에서만 아니라, Node의 장점도 국내 개발자들의 주목을 끌었습니다. 타obao는 실제로 Node 기술을 적용했습니다:
MyFOX는 MySQL 클러스터에서 데이터를 추출하고 계산하여 통계 결과를 출력하는 데이터 처리 중간 소프트웨어입니다. 사용자가 SQL 문장을 제출하면, MyFOX는 해당 SQL 명령어의 의미에 따라 각 데이터베이스 분할이 수행해야 할 쿼리를 생성하고 각 분할에 전송한 후, 결과를 집계하고 계산합니다. MyFOX의 특징은 CPU 집중적이며 파일 IO가 없으며, 오직 읽기 데이터만 처리합니다. 원래 MyFOX는 PHP로 작성되었지만 많은 문제가 발생했습니다. 예를 들어, PHP는 단일 스레드이며 MySQL은 블록 쿼리가 필요하므로 데이터의 동기화 요청이 어려웠습니다. 나중에는 nginx와 dirzzle를 사용하여 HTTP 프로토콜을 기반으로 인터페이스를 구현하고 curl_multi_getchains 명령어를 사용하여 요청을 수행하는 해결책을 제안했습니다. 그러나 MyFOX 프로젝트 그룹은 결국 Node.js를 사용하여 MyFOX를 구현하기로 결정했습니다.
Node.js를 선택하는 이유는 여러 가지가 있습니다. 예를 들어, 관심과 커뮤니티 발전을 고려하고 있으며, 또한 동기화 능력을 향상시키고 CPU를 최대한 활용하고자 합니다. 예를 들어, 연결을 자주 열고 닫으면 많은 포트가 대기 상태가 되며, 동기화 수가 증가하면 포트가 부족해 TIME_WAIT 상태로 인해 연결이 실패할 수 있습니다. 이전에는 시스템 설정을 수정하여 대기 시간을 줄이고 이 오류를 피했지만, 연결 풀을 사용하면 이 문제를 잘 해결할 수 있습니다. 또한, 이전에는 MyFOX가 일부 캐시가 만료된 경우 매우 높은 접근 압력이 발생했습니다. Node.js를 사용하면 쿼리 상태를 공유하여 일부 요청을 "잠시 기다리게" 하여 시스템이 캐시 내용을 다시 채우는 시간을 얻을 수 있습니다.
결론
이 문서는 Node.js의 기본 지식을 간단히 소개합니다. 이는 개념, 특징, 역사, 예제 등을 포함합니다. 단지2Node.js의 발전 동향은 눈에 띄며, 점점 더 많은 기업이 Node.js에 주목하고 시도하고 있습니다. 전후端 개발자는 관련 내용을 이해해야 합니다.