Nginx는 Reactor 패턴을 사용한다. 

기본적으로 Single-threaded를 사용하며 필요에 따라 fork를 사용하여 몇개의 프로세스를 사용한다. 

Main event loop라는 것이 OS의 Socket으로부터 읽을 수 있는 데이타를 기다린다. 

Single thread는 몇천개의 Connection을 매우 효율적으로 관리할 수 있게 된다. 

 

기존의 ThreadPool 을 이용하는 경우를 고려 해 보자.

1. ServerSocket 으로 request A 가 들어오면 Thread 를 할당 해 준다. 

2. 그럼 이 Thread 는 그 socket 을 가지고 read, write 작업(IO) 등을 할 것이다. 

3. 그런데 이 와중에 ServerSocket 에 request B가 들어오면, context switching 이 일어난다. 

4. 그럼 새로 들어온 request 에 대해 Thread 를 배분해주고, 또 이 socket 으로 read()/write() 등의 작업을 할 것이다. 

5. 그러면서 A 의 작업을 하기 위해 중간에 다시 context switching 하고, 그러다 다시 B 작업하려고 context switching 하면서 IO 작업을 모두 처리할 것이다

 

Reactor pattern 에 중요한 2가지 요소가 있다. 

하나는 event 를 받고 전달해주는 Reactor 와 다른 하나는 Reactor 가 보낸 event 를 실제로 처리하는 Handler 가 있다. 

UI programming 과 연관지어서 설명한 것을 인용하면,

 

1. Reactor 는 UI 를 처리하는 thread 이고, Handlers 는 UI의 ActionListeners 라고 생각하면 된다. 

2. Reactor 로 event 가 들어오면 알맞는 handler 로 dispatch 주는 역할을 담당하고,  

3. Handler 는 이 dispatch 된 event 를 받아서 처리하는 역할을 하게 된다.