웹사이트 검색

Node JS 아키텍처 - 단일 스레드 이벤트 루프


오늘 우리는 Node JS Architecture와 Single Threaded Event Loop 모델을 살펴볼 것입니다. 이전 게시물에서 Node JS 설치에 대해 논의했습니다.

노드 JS 아키텍처

일부 Node JS 프로그래밍 예제를 시작하기 전에 Node JS 아키텍처에 대한 아이디어를 갖는 것이 중요합니다. 이 게시물에서는 "Node JS가 어떻게 작동하는지, 어떤 유형의 처리 모델을 따르고 있는지, Node JS가 단일 스레드 모델로 동시 요청을 처리하는 방법\ 등에 대해 논의할 것입니다.

Node JS 단일 스레드 이벤트 루프 모델

이미 논의한 바와 같이 Node JS 애플리케이션은 \단일 스레드 이벤트 루프 모델\ 아키텍처를 사용하여 여러 동시 클라이언트를 처리합니다. JSP, Spring MVC, ASP.NET, HTML, Ajax, jQuery 등과 같은 많은 웹 애플리케이션 기술이 있습니다. 이러한 기술은 "다중 스레드 요청-응답\ 아키텍처를 따라 여러 동시 클라이언트를 처리합니다. 우리는 이미 "Multi-Threaded Request-Response\ 아키텍처에 익숙합니다. 대부분의 웹 애플리케이션 프레임워크에서 사용하기 때문입니다. 하지만 Node JS Platform이 웹 애플리케이션 개발을 위해 다른 아키텍처를 선택한 이유는 무엇입니까? 멀티스레드와 단일 스레드의 주요 차이점은 무엇인가요? 이벤트 루프 아키텍처 웹 개발자라면 누구나 Node JS를 배우고 응용 프로그램을 매우 쉽게 개발할 수 있지만 Node JS 내부를 이해하지 않고는 Node JS 응용 프로그램을 잘 설계하고 개발할 수 없습니다. 내부.

노드 JS 플랫폼

Node JS 플랫폼은 "단일 스레드 이벤트 루프\ 아키텍처를 사용하여 여러 동시 클라이언트를 처리합니다. 그런 다음 다중 스레드를 사용하지 않고 동시 클라이언트 요청을 실제로 처리하는 방법입니다. 이벤트 루프 모델이란 무엇입니까? 이러한 개념을 하나씩 논의하겠습니다. 논의하기 전에 " Single Threaded Event Loop” 아키텍처, 먼저 유명한 "Multi-Threaded Request-Response\ 아키텍처를 살펴보겠습니다.

전통적인 웹 애플리케이션 처리 모델

Node JS 없이 개발된 모든 웹 애플리케이션은 일반적으로 "다중 스레드 요청-응답\ 모델을 따릅니다. 간단히 이 모델을 요청/응답 모델이라고 부를 수 있습니다. 클라이언트는 서버에 요청을 보낸 다음 서버는 클라이언트 요청에 따라 일부 처리를 수행합니다. 이 모델은 HTTP 프로토콜을 사용합니다. HTTP는 Stateless Protocol이므로 이 요청/응답 모델도 Stateless 모델입니다. 따라서 이를 요청/응답 Stateless 모델이라고 할 수 있습니다. 그러나 이 모델은 동시 클라이언트 요청을 처리하기 위한 다중 스레드 이 모델 내부를 논의하기 전에 먼저 아래 다이어그램을 살펴보십시오. 요청/응답 모델 처리 단계:

  • 클라이언트가 웹 서버에 요청을 보냅니다.
  • 웹 서버는 내부적으로 제한된 스레드 풀을 유지하여 클라이언트 요청에 서비스를 제공합니다.
  • 웹 서버가 무한 루프 상태이며 클라이언트 수신 요청을 기다리고 있습니다.
  • Web Server는 이러한 요청을 받습니다.\n
    • 웹 서버에서 하나의 클라이언트 요청 가져오기
    • 스레드 풀에서 하나의 스레드 선택
    • 이 스레드를 클라이언트 요청에 할당
    • 이 스레드는 클라이언트 요청 읽기, 클라이언트 요청 처리, 차단 IO 작업 수행(필요한 경우) 및 응답 준비를 처리합니다.
    • 이 스레드는 준비된 응답을 웹 서버로 다시 보냅니다.
    • 웹 서버는 차례로 이 응답을 각 클라이언트에 보냅니다.

    • 여기서 "n\개의 클라이언트가 웹 서버에 요청을 보냅니다. 클라이언트가 웹 응용 프로그램에 동시에 액세스하고 있다고 가정해 보겠습니다.\n
    • 클라이언트가 클라이언트-1, 클라이언트-2… 및 클라이언트-n이라고 가정해 보겠습니다.\n
    • Web Server는 제한된 스레드 풀을 내부적으로 유지 관리합니다. 스레드 풀에서 "m\개의 스레드 수를 가정해 보겠습니다.\n
    • Web Server는 이러한 요청을 하나씩 받습니다.\n
      • 웹 서버 픽업 클라이언트-1 요청-1, 스레드 풀에서 하나의 스레드 T-1을 선택하고 이 요청을 스레드 T-1에 할당\n
        • Thread T-1이 Client-1 Request-1을 읽고 처리
        • 클라이언트-1 요청-1에는 블로킹 IO 작업이 필요하지 않습니다.
        • Thread T-1은 필요한 단계를 수행하고 Response-1을 준비하여 서버로 다시 보냅니다.
        • 웹 서버는 차례로 이 응답-1을 클라이언트-1로 보냅니다.

        웹 서버가 다른 클라이언트-2 요청-2를 선택하고 스레드 풀에서 하나의 스레드 T-2를 선택하고 이 요청을 스레드 T-2에 할당합니다.

        • Thread T-2는 Client-1 Request-2를 읽고 처리합니다.
        • 클라이언트-1 요청-2에는 블로킹 IO 작업이 필요하지 않습니다.
        • Thread T-2는 필요한 단계를 수행하고 Response-2를 준비하여 서버로 다시 보냅니다.
        • 웹 서버는 차례로 이 응답-2를 클라이언트-2로 보냅니다.

        웹 서버가 다른 클라이언트-n 요청-n을 선택하고 스레드 풀에서 하나의 스레드 T-n을 선택하고 이 요청을 스레드 T-n에 할당합니다.

        • Thread T-n은 Client-n Request-n을 읽고 처리합니다.
        • 클라이언트-n 요청-n에는 많은 차단 IO 및 계산 작업이 필요합니다.
        • Thread T-n은 외부 시스템과 상호 작용하는 데 더 많은 시간이 걸리며 필요한 단계를 수행하고 Response-n을 준비하여 서버로 다시 보냅니다.
        • 웹 서버는 차례로 이 응답 n을 클라이언트에 보냅니다. n"n\이 "m\보다 크면(대부분의 경우 true) 서버는 사용 가능한 스레드까지 클라이언트 요청에 스레드를 할당합니다. . 모든 m 스레드가 활용된 후 나머지 클라이언트 요청은 바쁜 스레드 중 일부가 요청 처리 작업을 완료하고 다음 요청을 선택할 수 있을 때까지 대기열에서 대기해야 합니다. 이러한 스레드가 블로킹 IO 작업(예: 데이터베이스, 파일 시스템, JMS 대기열, 외부 서비스 등과 상호 작용)으로 더 오랜 시간 동안 사용 중인 경우 나머지 클라이언트는 더 오래 기다려야 합니다.

        스레드가 스레드 풀에서 사용 가능하고 다음 작업에 사용할 수 있게 되면 서버는 해당 스레드를 픽업하여 나머지 클라이언트 요청에 할당합니다.

        각 스레드는 메모리 등과 같은 많은 리소스를 사용합니다. 따라서 이러한 스레드를 사용 중 상태에서 대기 상태로 전환하기 전에 획득한 모든 리소스를 해제해야 합니다.

        요청/응답 상태 비저장 모델의 단점:

        • 점점 더 많은 동시 클라이언트 요청을 처리하는 것은 다소 어렵습니다.
        • 동시 클라이언트 요청이 증가하면 더 많은 스레드를 사용해야 하며 결국 더 많은 메모리를 소모합니다.
        • 때때로 클라이언트의 요청은 요청을 처리하기 위해 사용 가능한 스레드를 기다려야 합니다.
        • 블로킹 IO 작업을 처리하는 데 시간을 낭비합니다.

        Node JS 아키텍처 - 단일 스레드 이벤트 루프

        Node JS 플랫폼은 요청/응답 다중 스레드 상태 비저장 모델을 따르지 않습니다. 이벤트 루프 모델이 있는 단일 스레드를 따릅니다. 노드 JS 처리 모델은 주로 Javascript 콜백 메커니즘이 있는 Javascript 이벤트 기반 모델을 기반으로 합니다. Javascript 이벤트 및 콜백 메커니즘이 작동하는 방식에 대해 잘 알고 있어야 합니다. 모르는 경우 먼저 해당 게시물 또는 자습서를 살펴보고 이 게시물의 다음 단계로 이동하기 전에 아이디어를 얻으십시오. Node JS가 이 아키텍처를 따르기 때문에 점점 더 많은 동시 클라이언트 요청을 매우 쉽게 처리할 수 있습니다. 이 모델 내부를 논의하기 전에 먼저 아래 다이어그램을 살펴보십시오. Node JS Internals의 모든 지점을 설명하기 위해 이 다이어그램을 디자인하려고 했습니다. Node JS 처리 모델의 핵심은 "이벤트 루프\입니다. 이를 이해하면 Node JS 내부를 이해하기가 매우 쉽습니다. 단일 스레드 이벤트 루프 모델 처리 단계:

        • 클라이언트가 웹 서버에 요청을 보냅니다.
        • Node JS 웹 서버는 내부적으로 제한된 스레드 풀을 유지하여 클라이언트 요청에 서비스를 제공합니다.
        • Node JS 웹 서버는 이러한 요청을 수신하여 대기열에 넣습니다. "이벤트 대기열\이라고 합니다.
        • Node JS 웹 서버에는 내부적으로 "이벤트 루프\라는 구성 요소가 있습니다. 이 이름을 얻은 이유는 요청을 수신하고 처리하기 위해 무한 루프를 사용하기 때문입니다(이를 이해하려면 아래의 일부 Java 유사 코드 참조).
        • 이벤트 루프는 단일 스레드만 사용합니다. Node JS 플랫폼 처리 모델의 핵심입니다.
        • Even Loop는 Client Request가 Event Queue에 있는지 확인합니다. 아니요인 경우 들어오는 요청을 무기한으로 기다립니다.
        • 예인 경우 이벤트 대기열에서 하나의 클라이언트 요청을 선택합니다.\n
          • 클라이언트 요청 프로세스 시작
          • 클라이언트 요청에 블로킹 IO 작업이 필요하지 않은 경우 모든 것을 처리하고 응답을 준비한 다음 다시 클라이언트로 보냅니다.
          • 해당 클라이언트 요청에 데이터베이스, 파일 시스템, 외부 서비스와의 상호 작용과 같은 일부 차단 IO 작업이 필요한 경우 다른 접근 방식을 따릅니다.\n
            • 내부 스레드 풀에서 스레드 가용성 확인
            • 하나의 스레드를 선택하고 이 클라이언트 요청을 해당 스레드에 할당합니다.
            • 해당 스레드는 해당 요청을 받고, 처리하고, 차단 IO 작업을 수행하고, 응답을 준비하고 이벤트 루프로 다시 보내는 일을 담당합니다.
            • 이벤트 루프는 차례로 해당 클라이언트에 해당 응답을 보냅니다.

            • 여기 "n\개의 클라이언트가 웹 서버에 요청을 보냅니다. 클라이언트가 웹 응용 프로그램에 동시에 액세스하고 있다고 가정합니다.
            • 클라이언트가 Client-1, Client-2… 및 Client-n이라고 가정하겠습니다.
            • Web Server는 제한된 스레드 풀을 내부적으로 유지 관리합니다. 스레드 풀의 스레드 수 "m\개를 가정해 보겠습니다.
            • Node JS 웹 서버는 Client-1, Client-2… 및 Client-n 요청을 수신하여 이벤트 대기열에 배치합니다.
            • Node JS 짝수 루프는 이러한 요청을 하나씩 선택합니다.\n
              • Even Loop 픽업 Client-1 Request-1\n
                • 클라이언트-1 요청-1에 차단 IO 작업이 필요한지 또는 복잡한 계산 작업에 더 많은 시간이 걸리는지 확인합니다.
                • 이 요청은 단순 계산 및 Non-Blocking IO 작업이므로 이를 처리하기 위해 별도의 Thread가 필요하지 않습니다.
                • Event Loop는 Client-1 Request-1 Operation(여기서 Operations는 Java Script의 기능을 의미)에서 제공하는 모든 단계를 처리하고 Response-1을 준비합니다.
                • 이벤트 루프는 응답-1을 클라이언트-1로 보냅니다.

                • 클라이언트-2 요청-2에 차단 IO 작업이 필요한지 또는 복잡한 계산 작업에 더 많은 시간이 걸리는지 확인합니다.
                • 이 요청은 단순 계산 및 Non-Blocking IO 작업이므로 이를 처리하기 위해 별도의 Thread가 필요하지 않습니다.
                • 이벤트 루프는 클라이언트-2 요청-2 작업에서 제공되는 모든 단계를 처리하고 응답-2를 준비합니다.
                • 이벤트 루프는 응답-2를 클라이언트-2로 보냅니다.

                • 클라이언트-n 요청-n이 차단 IO 작업을 필요로 하는지 또는 복잡한 계산 작업에 더 많은 시간이 걸리는지 확인합니다.
                • 이 요청은 매우 복잡한 계산 또는 Blocking IO 작업이므로 Even Loop는 이 요청을 처리하지 않습니다.
                • 이벤트 루프는 내부 스레드 풀에서 스레드 T-1을 선택하고 이 클라이언트-n 요청-n을 스레드 T-1에 할당합니다.
                • Thread T-1은 Request-n을 읽고 처리하며 필요한 Blocking IO 또는 Computation 작업을 수행하고 최종적으로 Response-n을 준비합니다.
                • 스레드 T-1이 이 응답-n을 이벤트 루프로 보냅니다.
                • 이벤트 루프는 이 응답-n을 클라이언트-n으로 보냅니다.

                function1(function2,callback1);
                function2(function3,callback2);
                function3(input-params);
                

                메모: -

                • 이러한 함수가 어떻게 실행되는지 이해하지 못한다면 Java Script 함수 및 콜백 메커니즘에 익숙하지 않은 것 같습니다.
                • Java Script 함수와 콜백 메커니즘에 대한 아이디어가 있어야 합니다. Node JS 응용 프로그램 개발을 시작하기 전에 온라인 자습서를 살펴보십시오.

                Node JS 아키텍처 - 단일 스레드 이벤트 루프의 장점

                1. 점점 더 많은 동시 클라이언트 요청을 처리하는 것이 매우 쉽습니다.
                2. Node JS 애플리케이션이 점점 더 많은 동시 클라이언트 요청을 수신하더라도 이벤트 루프로 인해 더 많은 스레드를 생성할 필요가 없습니다.
                3. Node JS 애플리케이션은 더 적은 스레드를 사용하므로 더 적은 자원이나 메모리만 사용할 수 있습니다.

                이벤트 루프 의사 코드

                저는 Java 개발자로서 "이벤트 루프 작동 방식\을 Java 용어로 설명하려고 합니다. 순수한 Java 코드가 아니라 누구나 이해할 수 있을 것 같습니다. 이해하는 데 문제가 있는 경우 드롭하세요. 나 댓글.

                public class EventLoop {
                while(true){
                        	if(Event Queue receives a JavaScript Function Call){
                        		ClientRequest request = EventQueue.getClientRequest();
                                            If(request requires BlokingIO or takes more computation time)
                                                    Assign request to Thread T1
                                            Else
                                                  Process and Prepare response
                                  }
                            }
                } 
                

                이것이 Node JS 아키텍처 및 Node JS 단일 스레드 이벤트 루프의 전부입니다.