소개
노드에 대해 들었거나 노드가 얼마나 큰지 주장하는 기사를 읽으면“노드는 무엇입니까?”라고 생각할 수 있습니다. 모든 사람에게 적합한 것은 아니지만 노드는 일부 사람들에게 올바른 선택 일 수 있습니다.
Node.js가 무엇인지 설명하기 위해이 기사는 해결할 수있는 문제, 작동 방식, 간단한 응용 프로그램을 실행하는 방법, 그리고 마지막으로 노드가 있고 좋은 솔루션이 아닌시기를 탐구합니다. 이 기사는 복잡한 노드 응용 프로그램을 작성하는 방법을 다루지 않으며 포괄적 인 노드 튜토리얼도 포함하지 않습니다. 이 기사를 읽으면 비즈니스에 사용하기 위해 노드를 배워야하는지 여부를 결정하는 데 도움이됩니다.
해결하도록 설계된 노드는 무엇입니까?
Node의 공개적으로 주장 된 목표는 "확장 가능한 네트워크 프로그램을 구축하는 간단한 방법을 제공하는 것"입니다. 현재 서버 프로그램의 문제는 무엇입니까? 수학 문제를합시다. Java ™ 및 PHP와 같은 언어에서 각 연결에는 새 스레드가 생성되며 새 스레드 당 2MB의 동반자 메모리가 필요할 수 있습니다. 8GB의 RAM이있는 시스템에서 이론적 최대 동시 연결 수는 4,000 명의 사용자입니다. 클라이언트 기반이 성장함에 따라 웹 응용 프로그램이 더 많은 사용자를 지원할 수 있으므로 더 많은 서버를 추가해야합니다. 물론 이것은 사업 비용, 특히 서버 비용, 운송비 및 인건비가 증가합니다. 이러한 비용 증가 외에도 기술적 인 문제가 있습니다. 사용자는 각 요청에 대해 다른 서버를 사용할 수 있으므로 모든 공유 리소스를 모든 서버간에 공유해야합니다. 예를 들어, Java에서는 각 서버의 JVMS간에 정적 변수와 캐시를 공유해야합니다. 이것은 전체 웹 응용 프로그램 아키텍처의 병목 현상입니다. 서버가 처리 할 수있는 최대 동시 연결 수입니다.
이 문제에 대한 노드의 솔루션은 연결이 서버에 연결되는 방식을 변경하는 것입니다. 각 연결은 각 연결에 대한 새 OS 스레드를 생성하는 대신 동반자 메모리 블록이 필요하지 않은 프로세스를 만듭니다 (일부 동반자 메모리를 할당). 노드는 잠금을 전혀 허용하지 않기 때문에 교착 상태가 없다고 주장하며 I/O 통화를 직접 차단하지 않습니다. 노드는 또한 실행중인 서버가 수만 개의 동시 연결을 지원할 수 있다고 주장합니다. 실제로, 노드는 시스템 전체의 병목 현상을 최대의 연결 수에서 단일 시스템의 트래픽으로 변경하여 서버면을 변경합니다.
이제 수만 개의 동시 연결을 처리 할 수있는 프로그램이 있으므로 실제로 노드로 무엇을 빌드 할 수 있습니까? 많은 연결을 처리 해야하는 웹 응용 프로그램이 있다면 "끔찍한"것입니다! 그것은 "이 문제가 있다면 전혀 문제가되지 않습니다"입니다. 위의 질문에 대답하기 전에 노드의 작동 방식과 작동 방식을 살펴 보겠습니다.
노드는 확실히 아닙니다
예, 노드는 서버 프로그램입니다. 그러나 확실히 아파치 나 톰 캣처럼 보이지 않습니다. 이 서버는 응용 프로그램을 즉시 설치하고 배포 할 수있는 독립형 서버 제품입니다. 이러한 제품을 사용하면 1 분 안에 서버를 설치하고 실행할 수 있습니다. 노드는 확실히 이런 종류의 제품이 아닙니다. Apache는 PHP 모듈을 추가하여 개발자가 동적 웹 페이지를 만들 수 있도록 할 수 있으며 Tomcat을 사용하는 프로그래머는 JSP를 배포하여 동적 웹 페이지를 만들 수 있습니다. 노드는 확실히이 유형이 아닙니다.
노드의 초기 단계 (현재 버전 0.4.6)에서는 "실행 준비된"서버 프로그램이 아니 었으며 설치하고 파일을 배치하며 완전히 작동하는 웹 서버가 있습니다. 설치가 완료된 후 웹 서버의 기본 기능을 구현하고 실행하려는 경우에도 여전히 많은 작업이 필요합니다.
노드의 작동 방식
노드 자체는 V8 JavaScript를 실행합니다. 잠깐, 서버에서 JavaScript? 맞아요, 당신은 그것을 올바르게 읽었습니다. Server-Side JavaScript는 DeveloperWorks에서 Aptana Jaxer 제품을 논의 할 때 약 2 년 전에 언급 된 비교적 새로운 개념입니다 (리소스 참조). Jaxer는 실제로 인기가 없었지만 개념 자체는 손이 닿지 않습니다. 왜 서버의 클라이언트에 사용되는 프로그래밍 언어를 사용할 수 없습니까?
V8은 무엇입니까? V8 JavaScript 엔진은 Google이 Chrome 브라우저에 사용하는 기본 JavaScript 엔진입니다. 고객에게 JavaScript가 실제로 무엇을하는지 생각하는 사람은 거의 없습니까? 실제로 JavaScript 엔진은 코드 해석 및 실행을 담당합니다. Google은 V8을 사용하여 C ++로 작성된 초고속 통역사를 만들었습니다. 엔진을 다운로드하여 모든 응용 프로그램에 포함시킬 수 있습니다. 하나의 브라우저에서 실행되는 것은 국한되지 않습니다. 따라서 Node는 실제로 Google에서 작성한 V8 JavaScript 엔진을 사용하여 서버에서 사용하기 위해 재구성합니다. 너무 완벽합니다! 이제 사용 가능한 좋은 솔루션이 있으므로 새로운 언어를 만드는 이유는 무엇입니까?
이벤트 중심 프로그래밍
많은 프로그래머는 객체 지향 프로그래밍이 완벽한 프로그래밍 설계이며 다른 프로그래밍 방법을 무시하고 있다고 믿도록 교육했습니다. 노드는 소위 이벤트 중심 프로그래밍 모델을 사용합니다.
목록 1. 클라이언트에서 jQuery를 사용한 이벤트 중심 프로그래밍
코드 사본은 다음과 같습니다.
// 이벤트 중심 프로그래밍의 작동 방식을 보여주는 클라이언트 측의 jQuery 코드
// 버튼을 누르면 이벤트가 발생합니다.
// 여기에서 바로 여기에 익명 기능으로
// 필요한 변수가 존재하며 직접 참조 할 수 있습니다.
$ ( "#myButton"). 클릭 (function () {
if ($ ( "#mytextfield"). val ()! = $ (this) .val ())
Alert ( "필드는 버튼 텍스트와 일치해야합니다");
});
실제로 서버와 클라이언트 사이에는 차이가 없습니다. 예, 버튼 클릭 작업이 없으며 텍스트 필드에 입력 할 조치도 없지만 더 높은 수준에서 이벤트가 발생합니다. 연결이 설정되어 있습니다 - 이벤트! 연결을 통해 데이터가 수신됩니다 - 이벤트! 연결을 통한 데이터 중지 - 이벤트!
이 설정 유형이 노드에 이상적인 이유는 무엇입니까? JavaScript는 익명의 기능과 폐쇄를 허용하기 때문에 훌륭한 이벤트 중심의 프로그래밍 언어이며, 더 중요한 것은 코드를 작성한 사람이라면 누구나 구문에 익숙합니다. 이벤트가 발생할 때 호출 된 콜백 함수는 캡처 이벤트에서 작성할 수 있습니다. 이런 식으로, 코드는 복잡한 객체 지향 프레임 워크없이 인터페이스가없고, 그 위에 무엇이든 구조화 할 수있는 잠재력없이 쓰고 유지하기가 쉽습니다. 이벤트를 듣고 콜백 기능을 작성하면 이벤트 중심 프로그래밍이 모든 것을 처리합니다!
샘플 노드 응용 프로그램
마지막으로 코드를 살펴 보겠습니다! 우리가 논의한 모든 것을 결합하고 첫 번째 노드 응용 프로그램을 만들어 봅시다. 노드가 교통량이 많은 응용 프로그램을 처리하는 데 이상적이라는 것을 이미 알고 있으므로 최대 속도를 위해 구축 된 응용 프로그램 인 매우 간단한 웹 응용 프로그램을 생성합니다. 다음은 "보스"로 설명 된 샘플 응용 프로그램의 특정 요구 사항은 다음과 같습니다. 이 응용 프로그램은 입력 : "번호"라는 매개 변수를 수락해야합니다. 그런 다음 응용 프로그램은 0과 매개 변수 사이의 난수를 반환하고 생성 된 숫자를 발신자에게 반환합니다. "보스"는 널리 인기있는 응용 프로그램이되기를 원하기 때문에 5 만 명의 동시 사용자를 처리 할 수 있어야합니다. 코드를 살펴 보겠습니다.
목록 2. 노드 랜덤 번호 생성기
코드 사본은 다음과 같습니다.
//이 모듈을 사용하려면 이러한 모듈을 가져와야합니다.
// 노드에는 여러 모듈이 있습니다. 그들은 어떤 #include와 같습니다
// 또는 다른 언어의 가져 오기 문
var http = 요구 사항 ( "http");
var url = require ( "url");
// 모든 노드 파일에서 가장 중요한 줄입니다. 이 기능
// 서버를 작성하는 실제 프로세스를 수행합니다. 기술적으로
// 노드는 기본 운영 체제에
// 연결이 이루어지면이 특정 콜백 함수는
// 실행. REST API로 웹 서비스를 만들기 때문에
// HTTP 변수가 필요한 HTTP 서버를 원합니다.
// 위의 줄에서 만들었습니다.
// 마지막으로 콜백 메소드가 '요청'을받는 것을 알 수 있습니다.
// 및 '응답'객체는 자동으로. 이것은 친숙해야합니다
// 모든 PHP 또는 Java 프로그래머에게.
http.createserver (함수 (요청, 응답) {
// 응답은 모든 헤더와 반환 코드를 처리해야합니다.
// 이러한 유형의 물건은 서버 프로그램에서 자동으로 처리됩니다.
// Apache 및 Tomcat을 좋아하지만 Node는 모든 것을 직접 수행해야합니다.
response.writehead (200, { "content-type": "text/plain"});
// 여기에 고유 한 코드가 있습니다. 이것이 노드를 검색하는 방법입니다
// 클라이언트 요청에서 전달 된 매개 변수. URL 모듈
//이 모든 함수를 처리합니다. 구문 분석 기능
// URL을 해체하고 쿼리 키 값을
// 쿼리 객체. "숫자"키의 값을 찾을 수 있습니다
// 직접 참조하여 JavaScript의 아름다움.
var params = url.parse (request.url, true) .query;
var input = params.number;
// 이들은 생성 할 일반적인 JavaScript 메소드입니다.
// 발신자에게 전달되는 임의의 숫자
var numinput = 새 번호 (입력);
var numoutput = 새 번호 (math.random () * numinput) .tofixed (0);
// 응답에 임의 번호를 씁니다
response.write (numoutput);
// 노드는이 연결을 명시 적으로 종료해야합니다. 이건 때문입니다
// Node는 연결을 열어두고 데이터를 앞뒤로 전달할 수 있습니다.
//이 기사에서는 그 고급 주제에 대해서는 논의하지는 않지만.
응답 ();
// 서버를 만들 때 HTTP 서버를
// 포트. 표준 HTTP 포트는 80이므로 해당 제품에 연결합니다.
}). 듣기 (80);
// 서버가 시작되면 문자열을 콘솔에 출력하여 모든 것을 알려줍니다.
// 올바르게 시작됩니다
Console.log ( "임의 번호 생성기 실행 ...");
위의 코드를 "random.js"라는 파일에 넣으십시오. 이제 응용 프로그램을 시작하고 실행하려면 (HTTP 서버를 작성하고 포트 80에서 연결을 듣습니다) 명령 프롬프트에 다음 명령을 입력하십시오. % 노드 random.js. 서버가 이미 Up 및 실행 중일 때의 모습은 다음과 같습니다.
코드 사본은 다음과 같습니다.
root@ubuntu :/home/moila/ws/mike# node random.js
랜덤 번호 생성기 실행 ...
응용 프로그램에 액세스하십시오
응용 프로그램이 가동 중입니다. 노드는 모든 연결을 듣고 있습니다. 테스트합시다. 간단한 RESTFUL API를 만들었으므로 웹 브라우저를 사용 하여이 응용 프로그램에 액세스 할 수 있습니다. 다음 주소를 입력하십시오 (위의 단계를 완료했는지 확인하십시오) http : // localhost/? number = 27.
브라우저 창은 0과 27 사이의 임의 숫자로 변경됩니다. 브라우저의 새로 고침 버튼을 클릭하면 다른 임의의 숫자가 나타납니다. 그게 다야, 이것은 첫 번째 노드 앱입니다!
노드는 무엇에 좋은가?
지금까지 "노드가 무엇인지"라는 질문에 대답 할 수 있어야하지만 언제 사용해야하는지 명확하지 않을 수도 있습니다. 노드는 어떤 것들에 좋지만 반대로 노드는 현재 다른 사람들에게는 좋은 해결책이 아닐 수도 있기 때문에 이것은 중요한 질문입니다. 잘못된 상황에서 사용하면 중복 인코딩 로트가 발생할 수 있으므로 노드를 사용하는시기를 결정해야합니다.
무엇에 좋은가요?
이전에 보았 듯이 노드는 트래픽이 높은 상황에 적합하며 클라이언트에 응답하기 전에 서버 측 논리 및 처리 요구 사항이 반드시 큰 것은 아닙니다. 노드의 뛰어난 성능의 일반적인 예에는 다음이 포함됩니다.
1. Restful API
RESTFUL API를 제공하는 웹 서비스는 여러 매개 변수를 수신하고,이를 구문 분석하고, 응답을 결합하며, 응답 (일반적으로 텍스트가 적음)을 사용자에게 반환합니다. 이것은 수만 개의 연결을 처리하기 위해 구축 할 수 있으므로 노드에 이상적인 상황입니다. 아직 많은 논리가 필요하지 않습니다. 데이터베이스에서 일부 값을 찾아 응답을 결합합니다. 응답은 인바운드 요청에 대한 소량의 텍스트와 소량의 텍스트이므로 트래픽은 높지 않으며 기계는 가장 바쁜 회사의 API 요구조차도 처리 할 수 있습니다.
2. Twitter 대기열
트위터를 받고 데이터베이스에 작성 해야하는 트위터와 같은 회사를 상상해보십시오. 실제로, 초당 수천 개의 트윗에 도달하며, 데이터베이스가 피크 기간 동안 필요한 쓰기 수를 적시에 처리하는 것은 불가능합니다. 노드는이 문제에 대한 해결책의 중요한 부분이되었습니다. 보시다시피 노드는 수만 개의 인바운드 트윗을 처리 할 수 있습니다. 다른 별도의 프로세스가 데이터베이스에 쓸 수있는 메모리 큐 메커니즘 (예 : 멤버)에 빠르고 쉽게 씁니다. 여기서 노드의 역할은 트윗을 빠르게 수집 하고이 정보를 작성하는 다른 프로세스로 전달하는 것입니다. 일반적인 PHP 서버가 데이터베이스 자체에 쓰기를 처리하려고 시도하는 또 다른 디자인을 상상해보십시오. 데이터베이스 호출이 채널을 차단하기 때문에 각 트윗은 데이터베이스에 글을 쓸 때 잠시 지연됩니다. 데이터베이스 대기 시간으로 인해 이와 같이 설계된 컴퓨터는 초당 2000 인바운드 트윗 만 처리 할 수 있습니다. 초당 백만 개의 트윗에는 500 개의 서버가 필요합니다. 대신, 노드는 채널을 차단하지 않고 모든 연결을 처리하므로 가능한 한 많은 트윗을 캡처합니다. 50,000 개의 트윗을 처리 할 수있는 노드 머신에는 20 개의 서버 만 필요합니다.
3. 이미지 파일 서버
Facebook 또는 Flickr과 같은 대규모 분산 웹 사이트를 보유한 회사는 서비스 이미지에만 모든 기계를 사용하기로 결정할 수 있습니다. 회사는 간단한 파일 리트리버를 작성한 다음 수만 개의 연결을 처리 할 수 있기 때문에 노드는이 문제에 대한 좋은 해결책이 될 것입니다. 노드는 이미지 파일을 찾고 파일 또는 404 오류를 반환 한 다음 아무것도하지 않습니다. 이 설정을 통해 이러한 분산 웹 사이트는 이미지, .js 및 .css 파일과 같은 정적 파일을 제공하는 데 필요한 서버 수를 줄일 수 있습니다.
나쁜 것은 무엇입니까?
물론 어떤 경우에는 노드가 이상적이지 않습니다. 노드가 잘하지 않는 영역은 다음과 같습니다.
1. 동적으로 생성 된 페이지
현재 노드는 동적 페이지를 만들기위한 기본 메소드를 제공하지 않습니다. 예를 들어, JSP (Javaserver Pages) 기술을 사용하는 경우 JSP 코드 스 니펫에 루프가 포함 된 index.jsp 페이지를 만들 수 있습니다. 노드는 이러한 동적 인 HTML 중심 페이지를 지원하지 않습니다. 마찬가지로 Node는 Apache 및 Tomcat과 같은 웹 서버로 적합하지 않습니다. 따라서 노드에서 이러한 서버 측 솔루션을 제공하려면 전체 솔루션을 직접 작성해야합니다. PHP 프로그래머는 웹 애플리케이션을 배포 할 때마다 Apache 용 PHP 변환기를 작성하고 싶지 않으며 지금까지 Node가 요구하는 것입니다.
2. 관계형 데이터베이스 무거운 응용 프로그램
노드의 목적은 빠르고 비동기 및 비 차단입니다. 데이터베이스가 이러한 목표를 반드시 공유 할 필요는 없습니다. 읽기 및 쓰기 중 데이터베이스에 대한 호출은 결과가 생성 될 때까지 채널을 차단하기 때문에 동기식 및 차단입니다. 따라서 관계형 데이터베이스 자체가 노드의 많은 장점을 상쇄 할 수 있기 때문에 많은 데이터베이스 호출, 많은 읽기, 요청 당 많은 쓰기가 필요한 웹 응용 프로그램은 노드에 적합하지 않습니다. (새로운 NOSQL 데이터베이스는 노드에 더 적합하지만 또 다른 주제입니다.)
결론
문제는 "Node.js 란 무엇입니까?"입니다. 답변을 받아야합니다. 이 기사를 읽은 후에는 몇 가지 명확하고 간결한 문장 으로이 질문에 답할 수 있어야합니다. 그렇다면 많은 코더와 프로그래머의 최전선으로 왔습니다. 나는 많은 사람들과 노드에 대해 이야기했지만 정확히 노드가 무엇인지 혼란 스러웠습니다. 당연히, 그들은 Apache의 사고 방식을 가지고 있습니다. 서버는 HTML 파일을 넣는 응용 프로그램이며 모든 것이 제대로 작동합니다. 그리고 노드는 목적으로 구동됩니다. JavaScript를 사용하여 프로그래머가 빠르고 확장 가능한 웹 서버를 쉽고 빠르게 만들 수있는 소프트웨어 프로그램입니다. 아파치가 실행할 준비가되었고 노드는 실행할 준비가되어 있습니다.
노드는 확장 가능한 서버를 제공한다는 목표를 달성합니다. "연결 당 하나의 스레드"모델을 할당하는 대신 "연결 당 하나의 프로세스"모델을 사용하여 각 연결에 필요한 메모리 만 생성합니다. V8 엔진 인 Google의 매우 빠른 JavaScript 엔진을 사용합니다. 이벤트 중심 디자인을 사용하여 코드를 최소화하고 읽기 쉽습니다. 이러한 모든 요소는 노드의 이상적인 목표에 기여합니다. 매우 확장 가능한 솔루션을 작성하는 것이 더 쉽습니다.
노드가 무엇인지 이해하는 것만 큼 중요합니다. Node는 PHP 웹 응용 프로그램을보다 확장 가능하게 만들도록 설계된 Apache를 대체하지 않습니다. 이것은 실제로 사실입니다. 노드의 초기 단계에서는 많은 프로그래머가이를 사용하지는 않지만 작동하는 시나리오에서는 매우 잘 수행됩니다.
앞으로 노드에서 무엇을 기대해야합니까? 이것은 아마도이 기사가 제기하는 가장 중요한 질문 일 것입니다. 이제 당신은 지금 그것이 무엇을하는지 알았으므로 다음에 무엇을할지 궁금해 할 것입니다. 내년에 기존 타사 지원 라이브러리와 더 나은 통합을 제공하는 노드를 기대합니다. 많은 타사 프로그래머는 이제 파일 서버 지원 및 MySQL 지원 추가를 포함하여 노드 용 플러그인을 개발했습니다. Node가 핵심 기능에 통합하기를 바랍니다. 마지막으로, 노드가 어떤 종류의 동적 페이지 모듈을 지원하여 HTML 파일에서 PHP 및 JSP (아마도 NSP, 노드 서버 페이지)에서 수행 할 수 있도록하려고합니다. 마지막으로, 언젠가 "배포 준비 준비가 완료된"노드 서버가 나타나고 다운로드 및 설치할 수 있으므로 Apache 또는 Tomcat을 사용하는 것과 같이 HTML 파일을 넣으십시오. 노드는 여전히 초기 단계에 있지만 매우 빠르게 발전하고 있으며 곧 비전에있을 수 있습니다.