Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

node-js-event-loop/ #6

Closed
utterances-bot opened this issue Jan 4, 2022 · 22 comments
Closed

node-js-event-loop/ #6

utterances-bot opened this issue Jan 4, 2022 · 22 comments

Comments

@utterances-bot
Copy link

Node.js 이벤트 루프(Event Loop) 샅샅이 분석하기

글에 들어가기에 앞서 Node.js의 이벤트 루프의 경우 공식 문서에 설명이 부족하고 이에 따라 여러 사람들이 각자 나름대로 분석한 글이 많아 무엇이 이벤트 루프의 정확한 동작인지 알기 힘듭니다. 혼자 이벤트 루프를 공부해보면서 여러 글들, 공식 문서, 그리고 Node

https://www.korecmblog.com/node-js-event-loop/

Copy link

와우... 정말 궁금했던 내용이고 공식문서를 봐도 잘 이해가 안되었던 부분인데 너무 잘 설명해주셔서 감사합니다!!
글을 읽다가 추가로 궁금한점이 생겨서 몇가지 질문을 드리고 싶습니다!

  1. 이벤트 루프는 libuv에 포함되어 있는건가요?
  2. 이벤트 루프의 각 Phase에서는 비동기 처리 로직을 libuv에 위임하고 libuv에서 요청을 처리한 이후 콜백을 해당 Phase 큐에 담아주는걸까요?
  3. Nodejs 이벤트루프 방식과 브라우저의 이벤트루프 방식은 차이가 있을까요?

@korECM
Copy link
Owner

korECM commented Jan 15, 2022

@ChanYangYu

  1. libuv의 공식 홈페이지 설명을 보면 아래와 같이 소개되어 있습니다.

libuv is cross-platform support library which was originally written for Node.js. It’s designed around the event-driven asynchronous I/O model.

즉, libuv는 비동기 입출력, 이벤트 관련 기능을 지원하기 위해 OS 커널을 추상화한 라이브러리라고 생각할 수 있습니다.
그래서 이벤트 루프는 특정 라이브러리라기보다는 비동기 처리를 하는 방법 중 하나이고 libuv가 이를 구현했다고 생각하면 편합니다.


출처

위 사진을 보면 알 수 있듯이 Node.js는 비동기 처리를 libuv에게 위임하는데 libuv는 내부적으로 여러 Phase를 나누어서 비동기 처리를 하고 이 방법이 이벤트 루프라고 생각하면 될 것 같습니다.


그래서 이벤트 루프는 종종 이벤트 드리븐을 구현하는 방법으로 많이 이야기 되고


Spring WebFlux 또한 요청을 처리하기 위해 이벤트 루프를 사용하는 것을 알 수 있습니다.

  1. 이 부분에 대해서는 다른 글이나 공식 문서에서도 자세한 내용이 없어서 확실하지는 않지만 제가 이해한 바는 아래와 같습니다.
    Node.jsV8 엔진을 기반으로 돌아가기가 때문에 js 코드의 실행 또한 V8 엔진이 맡게 됩니다. 따라서 이벤트 루프가 생성되고 전체 코드 실행이 완료되면 기다리고 있는 비동기 로직들이 이벤트 루프의 각 페이즈의 큐에 담기게 됩니다.

예를 들어서 main.js에서 구글에 HTTP 요청을 하나 보냈다면 Poll Phase에 HTTP 응답을 기다리는 무언가가 큐에 담기게 됩니다. 구글로부터 HTTP 응답이 오면 libuvFD(File Descriptor)를 통해서 응답이 왔다는 사실을 알게되고 이 FD와 매칭되는 콜백을 Poll Phase의 큐에서 찾아서 실행하게 됩니다.

이때 콜백은 결국 js 코드가 되므로 libuv가 이 콜백을 V8 엔진을 사용해서 실행한다고 생각하면 됩니다. 실제로 libuv는 이벤트 루프 안에 v8::Isolate, v8::Context 등을 가지고 있는데 이것을 사용해서 콜백 코드를 실행한다고 생각하면 됩니다.

만약 HTTP 응답 콜백에서 네이버에 HTTP 요청을 보내는 코드가 있다면 아래와 같은 순서로 진행된다고 생각하면 됩니다.

  1. main.js에서 구글에 HTTP 요청 보냅니다.
  2. 네트워크 요청을 보냄에 따라서 FD가 할당되고 libuvPoll Phase에서 이 FD를 기다리는 콜백을 큐에 넣습니다.
  3. 구글로부터 HTTP 응답이 오면 libuvFD를 통해 응답이 온 것을 감지하고 이 FD에 대응되는 콜백을 Poll Phase의 큐에서 찾아서 V8 엔진으로 이 콜백을 실행합니다.
  4. 이 콜백을 실행하면 네이버에 다시 HTTP 요청을 보내고 FD가 할당되고 이 FD를 기다리는 콜백이 다시 Poll Phase의 큐에 들어갑니다.
  5. 네이버 HTTP 응답이 오면 다시 libuvPoll Phase의 큐에서 콜백을 V8 엔진으로 실행합니다.
  6. 이러한 과정이 이벤트 루프에 남아있는 콜백이 없을 때까지 반복됩니다.

.

  1. 핵심 동작은 비슷할 수 있지만 구현이 달라 세부적인 동작이 다를 수도 있습니다.
    실제로 Chromelibevent를 사용하고 Node.jslibuv를 사용합니다.

찾아보니까 아래와 같은 Node.js와 브라우저 비교 글도 있네요.

저도 자세한 내용은 몰라서 아래 내용들을 참고해보면 좋을 것 같습니다.
https://www.youtube.com/watch?v=u1kqx6AenYw
https://stackoverflow.com/questions/25750884/are-there-significant-differences-between-the-chrome-browser-event-loop-versus-t
https://yoeubi28.medium.com/browser-vs-node-event-loop-차이-9c87f858051d
https://blog.insiderattack.net/javascript-event-loop-vs-node-js-event-loop-aea2b1b85f5c
https://www.reddit.com/r/javascript/comments/downgn/askjs_event_loop_browser_vs_node/

Copy link

정말 꼼꼼한 답변 감사드립니다!
이해가 잘 안되었던 부분이었는데 이제야 이해가 되네요 ㅎㅎ
좋은 글 보고 자극 얻어갑니다!

Copy link

epitone commented Jan 21, 2022

정말 좋은 글 감사드립니다. 이벤트 루프에 대해 이해가 전혀 되지 않았는데, 글을 읽고 크게 도움을 얻을 수 있었습니다. 계속 반복해서 글을 보면서, 공부하고 있는데 혹시 이 글을 보고 공부한 내용을 블로그에 출처를 남기고 작성해도 괜찮을까요?

@korECM
Copy link
Owner

korECM commented Jan 21, 2022

@epitoneproject 넵 괜찮습니다!

Copy link

정성이 느껴지는 게시글입니다. 재밌게 정독할 수 있었습니다!

Copy link

해당 레포에서
make -j n 의 n이 의미하는것이 무엇인가요?

@korECM
Copy link
Owner

korECM commented Feb 21, 2022

@dontbesatisfied
makej 옵션은 빌드를 할 때 병렬적으로 할당하는 작업의 개수를 말합니다. 컴퓨터 코어 수에 맞게 적당한 값을 적어주시면 됩니당

       -j [jobs], --jobs[=jobs]
            Specifies the number of jobs (commands) to run simultaneously.  If
            there is more than one -j option, the last one is effective.  If the
            -j option is given without an argument, make will not limit the
            number of jobs that can run simultaneously.

Copy link

작성자님의 정성으로 제 시간을 세이브했네요 ㅠㅠ... 너무 감사합니다...!!!!

Copy link

gaonK commented Apr 16, 2022

정성 가득한 글 너무 잘 읽었습니다. 많은 도움이 되었습니다 :)

Copy link

최고의 글입니다.

Copy link

정말 자세한글 감사합니다!

Copy link

엄청난 글이군요

Copy link

다 읽는데 두시간이 걸렸습니다.
좋은 글 정말 감사합니다 :)

Copy link

tre2man commented Oct 29, 2022

정보 정리가 잘되어있네요. 감사합니다.

Copy link

노드 내부 코드가 저렇게 생겼군요! 자세한 글 감사합니다.

Copy link

감사합니다.

Copy link

집요함에 감탄하고 갑니다 ㅎㅎ

Copy link

kscory commented Feb 9, 2023

지금까지 본 글 중에 최고에요. 감사합니다.

Copy link

memoer commented Feb 15, 2023

유용한 정보 감사합니다. 혹시 해당 글에서 적혀진 node 스레드 개수 확인하는 사진은 어떤 명령어를 치면 나오는 결과물인가요..?

Copy link

너무 재미있게 잘 읽었습니다!

Copy link

jhpung commented Apr 15, 2023

많은 수고가 묻어나오는 글이네요. 이벤트 루프 리마인드에 많은 도움이 됐습니다. 개인적으로 이벤트 루프에 대하 포스팅을 할까 했는데 이 글보다 더 잘 쓸런지 모르겠어서 보류해야겠네요 😅

Repository owner locked and limited conversation to collaborators Aug 7, 2023
@korECM korECM converted this issue into a discussion Aug 7, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests