Javascript로 백엔드 만들기 (6 부분): NodeJS는 어떻게 백엔드에서 일합니까?

다음은 자바스크립트를 사용하여 백엔드 프로그램을 만드는 데 도움을 주는 일련의 글입니다.
노드js는 현재 필수적이기 때문에 개발자가 그것을 파악하는 것은 필수적이다.
나는 이틀에 한 번씩 새로운 문장을 발표할 것이다. 조금씩, 너희들은 노드에 관한 모든 지식을 이해할 것이다.js
어떤 것도 놓치지 않으려면 트위터에 팔로우 해주세요.

NodeJS는 어떻게 엔진 덮개 아래에서 작동합니까?


이 섹션에서는 NodejS가 JavaScript 코드를 어떻게 실행하는지 이론적 검토를 수행합니다.
알다시피 NodeJS는 비동기 코드를 실행할 수 있습니다.이 개념은 보기에는 매우 간단해 보일지 모르지만 배경에서는 좀 복잡하다.무엇이 어떤 코드를 실행하기로 결정했습니까?무엇이 집행의 순서를 결정했습니까?
이러한 개념을 이해하는 것은 NodeJS 개발을 사용하는 데 매우 중요하다.이 분야의 전문가가 될 필요는 없지만 적어도 기초 지식을 알아야 한다.
이러한 개념들을 더욱 잘 설명하기 위해서 일부 개념들은 이미 간소화되었다는 것을 주의하십시오.

NodeJS의 아키텍처


NodeJS는 두 가지 주요 부분으로 구성되어 있는데 그것이 바로 V8 기계와 libuv 라이브러리이다

V8 엔진


JavaScript 코드를 기계 코드로 변환합니다.코드가 기계 코드로 변환되면 libuv 라이브러리에서 관리합니다

리브프


C++로 작성된 소스 라이브러리로 비동기 i/o 실행에 사용됩니다(예를 들어 파일 시스템, 네트워크 등)
libuv는 NodeJS의 두 가지 중요한 특성을 실현했다. 그것이 바로 이벤트 순환과 스레드 탱크이다
NodeJS는 단일 스레드 모드에서 작동합니다.
한 번에 한 가지 임무만 수행할 수 있다는 얘기다.만약 한 작업이 너무 많은 시간/자원을 필요로 한다면, 다른 작업의 운행을 막거나 막을 것입니다.
예를 들어 만약에 사이트에 10만 명의 사용자가 데이터베이스에 접근을 요청한다면 응답 시간은 곧 받아들일 수 없을 것이다.이것이 바로 NodeJS가 비동기 코드 실행을 효율적으로 관리해야 하는 이유입니다...이것이 바로 사건이 순환하는 작업이다
이벤트 순환은 리셋, 네트워크 약속, 요청 등 비동기 코드를 관리하는 데 사용되며, 이 코드들은 아주 적은 자원을 필요로 한다.라인을 막지 않기 위해 작업이 오래 걸릴 때, 이벤트 순환은 이 작업을 라인 탱크에 의뢰합니다.
스레드 풀은 동시에 작업을 실행할 수 있기 때문에 더욱 번거로운 작업, 예를 들어 파일 시스템에 접근하는 것, 그리고 비디오 변환이나 암호화 등 매우 까다로운 과정을 처리할 수 있다.

NodeJS 애플리케이션의 실행 순서


NodeJS 응용 프로그램을 실행하면 초기화 코드 "requires"및 최상위 코드가 즉시 순차적으로 실행됩니다.
우리의 코드에서 발생한 리셋은 즉시 실행되지 않습니다. 왜냐하면 프로그램이 다른 작업과 다른 사용자를 실행하는 것을 막을 수 있기 때문입니다.따라서 이 리셋은 이벤트 순환에 등록됩니다
최상위 코드가 실행되면 NodeJS는 포함된 작업을 수행할 수 있도록 이벤트 사이클을 제어합니다.
이벤트 순환은 미리 정의된 표준에 따라 반드시 준수해야 하는 실행 순서를 결정합니다.이벤트 순환은 매우 긴 임무를 스레드 탱크에 의뢰하는 것도 결정할 수 있다.(예: 파일 시스템 액세스)
스레드 탱크는 여러 개의 작업 (다중 스레드) 을 동시에 수행할 수 있으며, 결과를 이벤트 순환으로 되돌려줍니다.
실행할 작업이 있으면 이벤트 순환은 프로그램이 활성 상태로 유지됩니다.
이벤트가 순환하는 모든 작업이 완료되면, 제어권은 프로그램의 메인 라인으로 되돌아오고, 이 라인은 프로그램을 종료합니다.

NodeJS의 경우


이 이론은 매우 좋지만, 우리 구체적인 예로 한번 되돌아봅시다
const fs = require('fs')

console.log('First task started')

fs.readFile('./data/products.json', 'utf8', (err, data) => {
    console.log(data)
    console.log('First task ended')
})

console.log('Second task started')
술탄
First task started
Second task started
{
     "name": "iPhone 12",
     "price": 900
}


First task ended
앞에서 설명한 논리에 따라 NodeJS는 다음 순서로 코드를 실행합니다.
→ 상수 fs=필요(fs)
→ 위문하다.로그('첫 번째 작업 시작됨')
→ 이벤트 사이클에 readFile 콜백 등록
→ 위문하다.로그('두 번째 작업 시작됨')
→ 고급 퀘스트가 완성되면 손이 이벤트 순환으로 전달됩니다
  → readFile callback → Delegate to the Thread Pool

  → When the readFile is finished

      → console.log(data)

      → console.log('First task ended')

   → If no other pending task then ends the Event Loop
→ 프로그램 종료

제한 시간을 0으로 설정하는 예


console.log('First')

setTimeout(() => {
    console.log('Second')
}, 0)

console.log('Thrid')
결실
First
Third
Second
setTimeOut이 0이면 즉시 실행될 것이라고 생각하십니까?단, 앞에서 말한 바와 같이 NodeJS는 이벤트 순환에 리셋을 보내고 맨 윗부분 코드를 먼저 실행합니다.
이 논리를 바탕으로 NodeJS는 다음 순서로 코드를 실행합니다.
→ 위문하다.로그('First')
→ 이벤트 사이클에 setTimeout 콜백 등록
→ 위문하다.로그('세 번째')
→ 이벤트 주기에 맡기기
 → callback setTimeout

     → console.log('Second')

 → If no other task then ends the Event Loop
→ 프로그램 종료

서버 예


const http = require('http')

const server = http.createServer((req, res) => {
    if (req.url === '/') {
        res.end('<h1>Home page</h1>')
    } else if (req.url === '/about') {
        res.end('<h1>About page</h1>')

        let i = 0
        do {
            i++
        } while (i < 10000000000)

    } else {
        res.end('page not found')
    }    
})

server.listen(5000, 'localhost', () => {
    console.log('Server is listening at localhost on port 5000')
})
이 예에서 두 가지 교훈을 배울 수 있다.우선 NodeJS 애플리케이션은 중단되지 않습니다.이벤트 순환은 서버에서 오는 이벤트를 기다리기 때문에 끝이 없습니다.스니퍼 기능은 이벤트 사이클을 활성 상태로 유지합니다.
마지막으로about 페이지를 방문할 때 노드는'do while '을 실행하고 비동기 코드가 아니기 때문에 do while가 끝나기 전에 모든 사용자가 사이트에 대한 접근을 잠시 막을 것입니다.이것은 NodeJS가 단일 라인이라는 것을 설명하는 좋은 예입니다. 프로그램을 조심스럽게 작성해야 합니다.
예를 들어, 이런 상황에서, 라인이 막히지 않도록 Do를 비동기 함수에 넣는 것이 가장 좋다.

결론


오늘은 여기까지 트위터에 관심 가져주세요. 다음 글에 올라온 통지(이틀 내)를 받았습니다.

좋은 웹페이지 즐겨찾기