1. 전통적인 스레드 네트워크 모델
Node.js 이벤트 중심 모델을 이해하기 전에 먼저 기존 스레드 네트워크 모델을 이해합니다. 요청이 웹 서버(IIS, Apache)에 들어간 후 스레드 풀에 스레드가 할당되어 요청 처리가 완료됩니다. 요청 처리가 완료되고 응답이 발행되며 완료 후 스레드 풀이 재활용될 때까지 선형 및 동기적으로 수행됩니다.
이로 인해 다음과 같은 문제가 발생합니다.
1. 스레드 풀의 스레드 수 제한으로 인해 빈번한 요청이 대기하게 되며 심한 경우 서버가 중단될 수도 있습니다
2. 높은 동시성을 위해 더티 데이터가 나타나는 것을 방지하기 위해 잠금이 사용됩니다. 일부 I/O 트랜잭션은 시간이 오래 걸릴 수 있으며 이로 인해 일부 스레드가 대기하게 되어 비효율적입니다.
2. 이벤트 중심 모델
1. Node.js에는 이벤트 큐가 있습니다. 각 작업은 이벤트 큐에 들어가고, 결과를 처리하기 위해 콜백 함수가 남습니다. (개인적으로는 RunLoop과 약간 비슷하다고 생각됩니다.) ios)는 콜백 함수가 더 이상 존재하지 않을 때까지 작업의 이벤트 대기열 작업을 처리합니다.
2. Non-Blocking의 경우 콜백과 함께 함수로 이벤트 큐에 들어가고, 이벤트 루프 스레드에서 추출되어 실행됩니다.
3. 실행 중(파일 읽기, 데이터베이스 쿼리, 소켓 요청, 원격 서비스 액세스 등) I/O 차단이 발생하면 이벤트 루프 스레드는 결과 대기를 멈추지 않지만 대기열을 계속 실행합니다. . 다음 작업은 이벤트 루프 스레드에서 실행되지 않습니다. 함수가 실행되면 Node.js는 콜백 함수를 이벤트 큐에 배치하고 함수의 순서는 함수가 얼마나 빨리 완료되는지에 따라 결정됩니다.
4. 1에서 언급한 것처럼 I/O 차단이 발생하면 루프 스레드는 결과를 기다리지 않고 대신 대기열의 다음 작업을 실행합니다.
Node.js는 이벤트 콜백을 사용하여 I/O 차단을 기다리지 않고 백그라운드에서 스레드 풀을 구현합니다. I/O 차단 작업이 발생하면 스레드 풀에서 스레드를 가져와 함수와 콜백을 넣습니다. 거기에서 실행되면 차단된 스레드에서 실행되는 콜백 함수는 여전히 이벤트 큐에 이벤트를 추가할 수 있습니다.
위 내용은 모두 Node.js 이벤트 중심 모델에 관한 것입니다. 모든 사람의 학습에 도움이 되기를 바랍니다.