netty를 미들웨어로 하여 서버 개발 예정 이며, netty의 장점을 극대화? 하여 개발하고 싶은데요,,
블록팅 io 처리가 들어가야 하는 경우를 고민하고 있습니다.
예를들어 클라이언트 요청이 와서, 이벤트 핸들러의 channelRead 메소드에 도달하였고,
channelRead 메소드에서 DB 처리를 하는 부분이 있다고 가정하겠습니다.
이때 DB처리를 하는 부분은 블록킹 하게 되는데요, (커넥션풀은 당연히 쓸 예정이지만, 그거와는 상관없이 쿼리를 날리면, 결과를 기다리게 되겠죠?)
이러한 블록킹 처리가 심심치 않게? 들어가게 된다면, worker thread 자체에서도 블록킹이 일어날 것이고, 네티의 장점을 잘 살릴수 없을것 같습니다.
그래서 생각한것이 블록킹 IO 를 처리하는 쓰레드풀을 별도로 만들어서, 블록킹 IO 를 처리할때는 worker thread가 블로킹 IO 전담 쓰레드에게
처리를 위임하면 어떨가 싶습니다. (어제 알게 된 사실이지만,.nodejs 내부에는 비슷한 이슈로 블로킹 IO 전담 쓰레드가 있는것 같더군요)
이 블록킹 IO 전담 쓰레드는 비동기로 움직이게 할 예정이구요.
@Async
public void dbSelect(){
...
...
...
}
예를들어 위와 같이, DB를 셀렉하는 메소드를 비동기로 묶고 나서,
public void channelRead(...){
...
dbSelect();
...
}
위와 같이 netty의 이벤트 핸들러 에서 dbSelect()을 호출하게 되면, dbSelect() 처리 주체는 Async 애노테이션을 관리하는 별도 쓰레드 풀에서 비동기 처리 될것이고,
netty 입장에서는 dbSelect()는 블록킹 되지 않는 처리로 인식? 이 될 것 같습니다.
netty는 초보이기 때문에, 제가 모르는 사실이 아직 많을것 같습니다만,
현업 전문가분들의 조언 부탁드립니다.