acceptor에 해당하는 글 1

[SpringBoot] Embedded Tomcat, NioEndpoint

JAVA/Spring|2019. 6. 11. 19:22

SpringBoot Async 처리를 다시 학습 중에

어떻게 Embedded Tomcat에서는 요청을 처리하고 있는지 파악하기 위해 조금 코드를 살펴봤다.

 

 

일단 크게 별다른 설정을 하지 않고 디버그 모드로 붙었을 때 아래와 같이 스레드가 떠있다.

대략 오늘 살펴보려는 스레드는 4가지 정도다

 

  • http-nio-8080-Acceptor-0
    • Http Port accept 하는 스레드(ServerSocket.accept())
    • 관련 클래스는 org.apache.tomcat.util.net.Acceptor
    • accept 되면 getpoller() 후 채널을 regist 한다
      • getpoller는 poller가 여러 개의 경우 rr로 동작한다.
  • http-nio-8080-ClientPoller-0~1
    • Accept 된 Socket을 Selector에 OP_READ를 등록하고 Selector를 epoll 한다.
    • 관련 클래스는 org.apache.tomcat.util.net.NioEndpoint$Poller
    • 요청이 들어오면(read가 불리면), ThreadPoolExecutor.execute를 부르게 되고, 결국에 TaskQueue에 offer()를 부르게 된다.
    • poller가 하나가 아니라서 어떤 기준으로 동작 하나 살펴보니 아래와 같이 값이 설정되어있으며
      • polle는 많아도 2개
      • 기본 동작은 selector는 select()로 blocking이 아닌 select(1000), 1초마다 깨어 난다.

  • http-nio-8080-exec-1~10
    • 실제 ServletThread
    • TaskQueue(BlockingQueue)를 take 하며 대기, poller 혹은 다른 곳에서 TaskQueue에 이벤트를 넣어주면 동작
    • 선후 처리 및 Controller 코드가 보통 이 스레드를 통해 불리게 되며 Async 처리 이후 다시 돌아와(받은 스레드가 대기하여 다시 돌아온다는 이야기는 아니고, ServletThread->Async->ServletThread) 처리
    •  

  • MvcAsync
    • Controller에서 Async 처리(Callable이라던지 기타 등등..) 이후 응답을 직접 하려나? 해서 살펴보니
    • 마지막에 다시 TaskQueue에 offer를 하고 있었다.

 

 

전체 처리를 대략적으로 그리면 아래와 같이 될 것 같다.

 

 

댓글()