Back Ground

NodeJS - NodeJS란 본문

Javascript/Node.js

NodeJS - NodeJS란

Back 2019. 10. 12. 12:39

노드JS란 
NodeJS는 크롬 V8자바스크립트 엔진으로 빌드된 자바스크립트 런타임입니다.
Node.js는 이벤트기반, 논블로킹 I/O 모델을 사용해 가볍고 효율적입니다.
Node.js는 패키지 생태계인 npm은 세계에서 가장 큰 오픈소스 생태계이기도 합니다.


1) 서버 
노트를 통해 다양한 애플리케이션을 실행 할 수 있지만,
노드는 서버 애플리케이션을 실행하는데 가장 많이 사용됩니다.

2)자바스크립트 런타임
NodeJS는 C언어와 C++로 만들어졌다.
런타임은 특정 언어로 만든 프로그램을 실행 할 수 있는 환경을 뜻한다.
따라서 노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있게 해준다.


기존에는 자바스크립트 프로그램은 인터넷 브라우저 위에서만 실행할 수 있었지만,
브라우저외의 환경에서 자바스크립트를 실행하기 위한 여러가 시도가 있었으나,
자바스크립트의 실행 속도 문제가 있었고
2008년 구글이 V8엔진을 사용하여 크롬을 출시하여
당시 V8엔진은 다른 자바스크립트 엔진과 달리 매우 빨랐고, 오픈 소스로 코드가 공개 되었다.
속도 문제가 해결되자 '라이언 달'은 2009년 V8엔진 기반의 노드 프로젝트를 시작했습니다.

노드는 V8과 더붙어 lubuv라는 라이브러리를 사용합니다.
V8과 libuv는 C와 C++로 구현되어 있고 
자바스크립트는 노드가 알아서 V8과 libuv에 연결해줍니다.

libuv라이러리는 노드의 특성인 이벤트 기반, 논블로킹 I/Oㅁ델을 구현하고 있습니다.
노드는 스스로 이벤트 기반, 논블로킹 I/O모델을 사용해 가볍고 효율적이라고 표현했습니다.



3) 이벤트 기반
이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미합니다.

이벤트 기반 시스템에는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두어야 합니다.
이것을 이벤트 리스너에 콜백 함수를 등록한다고 표현합니다.

이벤트가 발생하면 이벤트 리스너에 등록해둔 콜백 함수를 호출하는 방식입니다.
발생한 이벤트가 없거나 발생했던 이벤트를 다 처리하면 노드는 다음 이벤트가 발생할 때까지 대기합니다.

이벤트 루프 : 이벤트 발생 시 호출할 콜백 함수를 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할 담당합니다.
태스크 큐 : 이벤트 발생 후 호출되어야 할 콜백 함수들이 기다리는 공간입니다. 콜백들이 이벤트 루프가 정한 순서대로 줄을 서 있으므로 콜백 큐라고도 부릅니다.
백그라운드 : 타이머나 I/O 작업 콜백 또는 이벤트 리스너들이 대기하는 곳입니다.

4) 논 블로킹 I/O
논블로킹 방식 이란
이벤트 루프를 잘 활용하면 오래걸리는 작업을 효율족으로 처리할 수 있습니다.
오래 걸리는 함수를 백그라운드로 보내서 다음 코드가 먼저 실행되게 하고, 
그 함수가 다시 태스크 큐를 거쳐 호출 스택으로 올라오기를 기다리는 방식입니다.

논블로킹이란 이전 작업이 완료될 때까지 멈추지 않고 다음 작업을 수행함을 뜻합니다.

5) 싱글 스레드
이벤트 기반, 논블로킹 모델과 더불어 노드를 설명할 때 자주 나오는 용어가
바로 싱글 스레드입니다.
스레드가 컴퓨터 작업을 처리할 수 있는 일손이라고 생각하면 됩니다.
노드는 싱글 스레드이므로 주어진 작업을 혼자서 처리해야 합니다.
반대로 멀티 스레드인 시스템에서는 여러 개의 스레드가 일을 나눠서 처리할 수 있습니다.

자바스크립트와 노드에서 논블로킹이 중요한 이유는 바로 싱글 스레드이기 때문입니다.
한 번에 한가지 일밖에 처리하지 못하므로 어떠한 작업에서 블로킹이 발생하면 다음 일을 처리하지 못합니다.

언뜻 보면 여러개의 동시에 처리할 수 있기 때문에 멀티 스레드가 싱글 스레드보다 좋아 보입니다.
하지만 꼭 그것만은 아닙니다.

[블로킹]
예를 들어 한 음식점에 점원이 한 하명이 있고 손님은 여러명이 있습니다.
점은 한 명이 주문을 받아 주방에 넘기고, 주방에서 요리가 나오면 손님에게 서빙을 합니다.
그 후 다음 손님의 주문을 받습니다. 이런 구조라면  다음손님은 이전 손님의 요리가 나올 때까지
아무것도 못 하고 기다리고 있어야합니다.
이것이 바로 싱글 스레드, 블로킹 모델입니다. 매우 비효율적입니다.

[논블로킹]
이번에는 점원이 한 손님의 주문을 받고, 주방에 주문 내역을 넘긴 뒤 다음 손님의 주문을 받습니다.
요리가 끝나길 기다리지 않고 주문이 들어왔다는 것만 알려준느 것입니다.
주방에 요리가 완료되면 완료된 순서대로 손님에게 서빙합니다.
주문한 순서와 서빙하는 순서가 일치하지 않을 수도 있습니다.
이것이 싱글 스레드, 논블로킹 모델입니다.

이것이 노드가 채택하는 방식입니다.
점원은 한명이지만 혼자서 많은 일을 처리할 수 있습니다.
하지만 그 직업 한 명이 아파서 쓰러지거나 하면 큰 문제가 생길 수 있습니다.
또한, 주문 받거나 서빙을 하는 데 시간이 오래 걸린다면 주문이 많이 들어왔을 때 버거울 수 있습니다.

[멀티스레드의 단점]
멀티 스레드 방식에서는 손님이 올 때마다 점원이 한명 씩 맡아 주문을 받고 서빙합니다.
언뜻 보면 싱글 스레드보다 좋은 방법인 것 같지만, 장단점이 있습니다.
일단 손님 한 명당 점원도 하명이면 서빙 자체는 걱정이 없습니다.
점원 한명에게 문제가 생겨도 다른 점원으로 대체하면 되기 때문입니다.
하지만 손님의 수가 늘어날수록 점원의 수도 늘어납니다.
손님 수가 줄어들었을때 일을 하지 않고 노는 점원이 있다는 거도 문제가 됩니다.
점원을 새로 고용하거나 기존 직원을 해고하는 데는 비용이 발생합니다.
 
[멀티 프로세싱]
그렇다면 멀티 스레드 모두 논 블로킹 방식으로 주문 받으면 더 좋지 않을까는 의문이 드는데
노드도 싱글 스래드 여러개를 사용해서 멀티 스래딩과 비슷한 기능을 하는데

이건 멀티 스레딩이라기보단 멀티 프로세싱에 가깝습니다.

- 프로세스는 운영체제에서 할당한 작업의 단위로 
노드나 인터넷 브랑저같은 프로그램은 개발적은 프로세스입니다.
프로세스 간에는 메모리 등의 자원을 공유하지않습니다.

- 스레드는 프로세스 내에서 실행되는 흐름의 단위입니다.
하나의 프로세스에서 스레드는 여러개 가질 수 있고 스레드들은 
부모 프로세스의 자원을 공유합니다. 즉, 같은 메모리에 접근 할 수 있습니다.

프로세스1{
 스레드,
 스레드,
 스레드 
}

프로세스2{
 스레드,
 스레드,
 스레드 
}
 
프로세스3{
 스레드,
 스레드,
 스레드 
}

노드는 스레드를 늘리는 대신 프로세스 자체를 복사해 여러 작업을 동시에 처리하는 
멀티 프로세싱 방식을 택했습니다. 자바스크립트 언어 자체가 싱글스레드 특성을 띠고 있기 때문입니다.
cluster모듈과 pm2패키지에서 멀티 프로세싱을 가능하게 하는 방법의 예가 되겠습니다.

 

What is
NodeJS  NodeJS is a JavaScript runtime built with the Chrome V8 JavaScript engine.
Node.js is  lightweight and efficient using an event-based, non-blocking I/O model.
Node.js is a  package ecosystem, npm is also the largest open source ecosystem in the world.


1)
You can run various applications through server  notes, but
nodes are most often used to run server applications.

2) JavaScript Runtime
NodeJS is made in C and C++.
Runtime means an environment in which programs made in a specific language can be executed.
Thus, Node allows you to run JavaScript programs on your computer.


Previously, JavaScript programs could only be run on an Internet browser, but there were
several attempts to run JavaScript in environments other than the browser, but
there was a problem with the execution speed of JavaScript, and in
2008 Google released Chrome using the V8 engine. Therefore, the
V8 engine at that time was very fast unlike other JavaScript engines, and the code was released as open source.
When the speed problem was solved, Ryan Dahl started a node project based on the V8 engine in 2009.

Node uses a library called lubuv in addition to V8.
V8 and libuv are implemented in C and C++, and 
Javascript is automatically linked to V8 and libuv by Node.

The libuv library implements the event-based, non-blocking I/O Dell characteristic of nodes.
Node expressed itself as light and efficient using an event-based, non-blocking I/O model.



3) Event-based
Event-based refers to a method of performing a predetermined task when an event occurs.

Event-based systems require you to register in advance what to do when a specific event occurs.
This is expressed as registering a callback function with an event listener.

When an event occurs, the callback function registered in the event listener is called.
When no event has occurred or when all events have been processed, the node waits for the next event to occur.

Event Loop: Manages the callback function to be called when an event occurs, and determines the execution order of the called callback function.
Task Queue: This is a space where callback functions that should be called after an event occur. Callbacks are also called callback queues because they line up in the order determined by the event loop.
Background: This is where timers or I/O task callbacks or event listeners wait.

4) Non-blocking I/O
If
you make good use of the event loop, the non-blocking method, you can process long-running tasks with efficiency.
It sends a long-running function to the background so that the next code is executed first, and 
then waits for the function to go back through the task queue and onto the call stack.

Non-blocking means to perform the next task without stopping until the previous task is completed.

5) Single-threaded In addition to the
event-based, non-blocking model, the term that often comes up when describing nodes
is single-threaded.
Think of a thread as a hand that can handle computer tasks.
Nodes are single-threaded, so you have to handle any given task by yourself.
Conversely, in a multi-threaded system, multiple threads can split work to do the job.

The reason non-blocking is so important in JavaScript and Node is that it is single-threaded.
You can only do one thing at a time, so if a blocking occurs in one task, you can't do the next.

At first glance, multi-threaded looks better than single-threaded because you can process multiple concurrently.
But it's not just that.

[Blocking]
For example, a restaurant has one clerk and several customers.
At the store, one person takes the order and hand it over to the kitchen, and when the dish is served in the kitchen, it is served to the customer.
Then take the next customer's order. With this structure, the next guest
must wait until the previous guest's dishes are served .
This is the single threaded, blocking model. It's very inefficient.

[Non-blocking]
This time the clerk takes an order from one customer, passes the order details to the kitchen, and takes the order from the next customer.
They don't wait for the dish to finish, just let them know that the order has been placed.
When cooking is complete in the kitchen, it is served to guests in the order they are completed.
The order you ordered and served may not match.
This is a single threaded, non-blocking model.

This is how the node adopts.
There is only one clerk, but you can do many things by yourself.
However, if one of those jobs is sick and falls down, it can cause major problems.
Also, if it takes a long time to receive or serve an order, it can be overwhelming when a lot of orders are placed.

[Disadvantages of
Multi-threaded ] In the multi-threaded method, each time a customer comes, the clerk takes the order and serves.
At first glance, it seems to be a better method than single-threaded, but there are pros and cons.
Once there is only one clerk per customer, there is no worry about serving itself.
This is because even if there is a problem with one clerk, you can substitute another clerk.
However, as the number of customers increases, the number of clerks increases.
It is also a problem that when the number of customers decreases, there are clerks who play without working.
There is a cost to hiring a new clerk or firing an existing employee.
 
[Multi-processing]
Then, I wonder if it would be better if all multi-threads were ordered in a non-blocking manner, but
nodes also use multiple single threads to perform similar functions to

multi-threading, but this is more multi-processing than multi-threading.

-A process is a unit of work allocated by the operating system,
and programs such as  nodes and internet browsers are developmental processes.
Resources such as memory are not shared between processes.

-A thread is a unit of flow that runs within a process.
A process can have multiple threads and the threads 
share the resources of the parent process. In other words, you can access the same memory.

Process1{
 thread,
 thread,
 thread 
}

process2{
 thread,
 Thread,
 Thread 
}
 
Process3{
 Thread,
 Thread,
 Thread 
}

node instead of increasing the number of threads
opted for a multi-processing approach that copies the process itself to process multiple tasks simultaneously  . This is because the JavaScript language itself is single-threaded.
Here is an example of how to enable multiprocessing in the cluster module and pm2 package.

 

ノードJSと 
NodeJSはクロムV8 JavaScriptエンジンで構築されたJavaスクリプトの実行時です。
Node.jsは  イベントベース、ノンブロッキングI / Oモデルを使用して、軽量で効率的です。
Node.jsは  、パッケージの生態系のnpmは、世界で最大のオープンソースの生態系もあります。


1)サーバー 
のノートを使用して、さまざまなアプリケーションを実行することができますが、
ノードは、サーバーアプリケーションを実行するために最も多く使用されます。

2)JavaScriptの実行時
NodeJSは、C言語とC ++で作られた。
ランタイムは、特定の言語で作成されたプログラムを実行することができる環境を意味する。
したがって、ノードは、JavaScriptプログラムをコンピュータで実行することが可能になります。


従来は、JavaScriptプログラムは、インターネットブラウザ上でのみ実行することができたが、
ブラウザ以外の環境では、Javaスクリプトを実行するためのいくつかのが試みがあったが、
JavaScriptの実行速度の問題があった
2008年、GoogleがV8エンジンを使用してクロムを発売して
、当時V8エンジンは、他のJavaScriptエンジンとは異なり、非常に速く、、オープンソースのコードが公開された。
速度の問題が解決されると「ライアン月」は、2009年V8エンジンベースのノードプロジェクトを開始しました。

ノードはV8とより付いlubuvというライブラリを使用します。
V8とlibuvは、CおよびC ++で実装されており、 
JavaScriptのは、ノードが分かっV8とlibuvに接続できます。

libuvライブラリは、ノードの特性であるイベントベース、ノンブロッキングI / Oのㅁデルを実装しています。
ノードは、自身のイベントベース、ノンブロッキングI / Oモデルを使用して、軽量で効率的だと表現しました。



3)イベントベースの
イベントベースとイベントが発生したとき、あらかじめ指定しておいたタスクを実行する方法を意味します。

イベントベースのシステムでは、特定のイベントが発生したときに何をするか事前に登録しておきます。
これイベントリスナーにコールバック関数を登録すると表現します。

イベントが発生すると、イベントリスナーに登録しておいたコールバック関数を呼び出す方法です。
発生したイベントがないか、発生したイベントをすべて処理すると、ノードは、次のイベントが発生するまで待機します。

イベントループ:イベントの発生時に呼び出されるコールバック関数を管理し、呼び出されたコールバック関数の実行順序を決定する役割を担当します。
タスクキュー:イベント発生後に呼び出さなければならないコールバック関数が待っている空間です。コールバックがイベントループが定めた順序で並んでいるので、コールバックキューとも呼ばれ。
バックグラウンド:タイマーやI / O操作のコールバックまたはイベントリスナーが待機する場所です。

4)ノンブロッキングI / O
ノンブロッキング方式と
イベントループをうまく活用すれば、時間がかかる作業を効率族で処理することができます。
かかる関数をバックグラウンドで送信次のコードは、最初に実行されるようにして、 
その関数が再びタスクキューを経て、コールスタックに上がって来るのを待っているようです。

ノンブロッキングとは、以前の操作が完了するまで停止することなく、次の操作を遂行することを意味します。

5)シングルスレッドの
イベントベース、ノンブロッキングモデルに加えて、ノードを説明する際によく出てくる用語が
すぐにシングルスレッドです。
スレッドがコンピュータの操作を処理することができる人手だと思えばされます。
ノードは、シングルスレッドであるため、特定のタスクを一人で処理する必要があります。
逆に、マルチスレッドのシステムでは、複数のスレッドが仕事を分けて処理することができます。

JavaScriptとノードでノンブロッキングが重要な理由は、まさにシングルスレッドだからです。
一度に一つのことしか処理できないため、どのような操作でブロッキングが発生した場合、以下のことを処理しません。

一見すると、複数の同時処理することができますので、複数のスレッドがシングルスレッドよりも良く見えます。
しかし、必ずそれだけではありません。

[ブロッキング]
たとえば、レストランに店員が一下命があり、お客様は何人かがあります。
点は一人注文を受けてキッチンに渡し、キッチンで料理が出てきたらお客様にサービングをします。
その後、次のゲストの注文を受けます。このような構造であれば、次のゲストは、以前のお客様の料理が出てくるまで
は何もできなくて待っている必要があります。
これがシングルスレッド、ブロックモデルです。非常に非効率的です。

【ノンブロッキング]
今回は店員が一客の注文を受けて、キッチンに注文を越えた後、次のゲストの注文を受けます。
料理が終わるように待たずに注文が入ってきたということだけ教えてくれた感じになります。
キッチンで調理が完了すると、完了した順にお客様にサービングします。
注文した順序とサービングする順序が一致していない場合があります。
これシングルスレッド、ノンブロッキングモデルです。

これノードが採用する方式です。
店員は一人だが、一人で多くのことを処理することができます。
しかし、その仕事した人が痛くて倒れたりすると、大きな問題が生じる可能性があります。
また、ご注文受けたりサービングをするのに長い時間かかる場合注文が多く入ってきたときボゴウルができます。

[マルチスレッドの欠点]
マルチスレッド方式では、お客様が来るたびに店員が一人ずつ引き受けて注文を受けてサービングます。
一見すると、シングルスレッドよりも良い方法であるようだが、長所と短所があります。
いったん客一人当たりの店員も下命場合サービング自体は心配がありません。
店員1人に問題が生じても、他の店員に置き換えると、なるからです。
しかし、お客様の数が増えるほど、店員の数も増えます。
ゲストの数が減ったときの事をせずに遊ぶ店員があるゴド問題になります。
店員を新たに採用したり、既存の従業員を解雇するには費用が発生します。
 
[マルチプロセッシング]
次に、マルチスレッドの両方ノンブロッキング方式で注文受けるよりいいんじゃないの疑問がするが
、ノードもシングルラッド複数を使用して、マルチスレディンと同様の機能をする

、これはマルチスレッドというよりは、マルチプロセッシングにあります。

-プロセスは、オペレーティングシステムによって割り当てられた作業の単位で 
ノードやインターネットブラン私のようなプログラムは、開発の少ないプロセスです。
プロセス間のメモリなどのリソースを共有しません。

-スレッドは、プロセス内で実行される流れの単位です。
一つのプロセス内のスレッドは、複数持つことができ、スレッドは、 
親プロセスのリソースを共有します。つまり、同じメモリにアクセスすることができます。

Process1{
 thread,
 thread,
 thread 
}

process2{
 thread,
 Thread,
 Thread 
}
 
Process3{
 Thread,
 Thread,
 Thread 
}

ノードは、スレッドを増やす代わりに、プロセス自体をコピーして複数のタスクを同時に処理する 
マルチプロセッシング方式を選択しました。JavaScriptの言語自体が、シングルスレッドの特性を帯びているからです。
clusterモジュールとpm2パッケージでは、マルチプロセッシングを可能にする方法の例だろう。

Comments