netty 내부에서 blocking io 사용시 괜찮은 방법에 대해 고민하고 있습니다.

552 views
Skip to first unread message

최우선

unread,
Jan 9, 2018, 1:06:41 AM1/9/18
to Netty Korean User Group
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는 초보이기 때문에, 제가 모르는 사실이 아직 많을것 같습니다만, 
현업 전문가분들의 조언 부탁드립니다.



elliott

unread,
Jan 9, 2018, 3:14:35 AM1/9/18
to Netty Korean User Group
제 경우는 블럭킹IO같은것을 처리 해야 하게 되면 말씀하신데로 

쓰레드풀을 쓰는 워크큐를 하나 만들어서 그쪽으로 작업을 던지고. 클라이언트의 handler는 종료를 시켜 버립니다.
그리고 그 작업 결과에 대해서는 TCP같은 경우는 서버에서 클라로 노티를 주도록 했고요.





2018년 1월 9일 화요일 오후 3시 6분 41초 UTC+9, 최우선 님의 말:

조우철

unread,
Jan 9, 2018, 3:36:06 AM1/9/18
to nett...@googlegroups.com
저는 DB 혹은 블록킹 작업이 필요하면 pipeline에 handler를 추가할 때 EventExecutorGroup 지정하고 있습니다.
대략 아래와 같이 하고 있습니다.

        pipeline.addLast(new DefaultEventExecutorGroup(256), "handler", new BlockingWorkHandler());

DefaultEventExecutorGroup 생성자 파라메터는
예상되는 동시접속자 수로 지정하고 있습니다.

혹시 이게 올바른 방법이 아니면 의견 부탁드립니다.



2018년 1월 9일 오후 5:13, elliott <sey...@gmail.com>님이 작성:

--
이 메일은 Google 그룹스 'Netty Korean User Group' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 netty-ko+unsubscribe@googlegroups.com에 이메일을 보내세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/netty-ko/f181dffd-1d6d-4da1-9917-9511f51c5b27%40googlegroups.com을(를) 방문하세요.

더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.

최우선

unread,
Jan 9, 2018, 4:59:55 AM1/9/18
to Netty Korean User Group
아아..넵.. 역시 별도로 워크큐를 만드는게 좋겠군요..
답변 감사합니다.

2018년 1월 9일 화요일 오후 5시 14분 35초 UTC+9, elliott 님의 말:

최우선

unread,
Jan 9, 2018, 5:37:24 AM1/9/18
to Netty Korean User Group
돋움님 먼저 답변 감사드립니다~

역시나 별도 쓰레드로 운영하시는 거군요.
근데 채널 파이프라인에 new EventExecutorGroup 를  지정하게 되면, 
생성되는 채널마다 계속해서 쓰레드그룹이 생기지 않을까요?..,,(채널 A의 A쓰레드 그룹, 채널B의 B쓰레드 그룹, 채널C의 C쓰레드 그룹........) 이 부분이 조금 걱정이 되긴 합니다 ^^ 

블록킹 처리 쓰레드 그룹은 채널과 관계 없이 서버 인스턴스에서 하나만 존재해야 할것 같아서요~

혹시 제가 잘못 이해했거나 내용에 올바르지 않은 부분이 있으면 답변 부탁드리겠습니다.
감사합니다.


2018년 1월 9일 화요일 오후 5시 36분 6초 UTC+9, 돋움 님의 말:
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 netty-ko+u...@googlegroups.com에 이메일을 보내세요.

조우철

unread,
Jan 9, 2018, 6:55:07 AM1/9/18
to nett...@googlegroups.com
예시 코드는 예를 든다고 대강 적은 것이고
실제로는 말씀하신것 처럼 하나의 EventExecutorGroup을 사용합니다.
혼란을 드려 죄송합니다. ^^



2018년 1월 9일 오후 7:37, 최우선 <singw...@gmail.com>님이 작성:
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 netty-ko+unsubscribe@googlegroups.com에 이메일을 보내세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/netty-ko/009dae81-15ab-43cc-a673-8f15665b4816%40googlegroups.com을(를) 방문하세요.

최우선

unread,
Jan 9, 2018, 10:32:17 PM1/9/18
to Netty Korean User Group
아 아닙니다~ ^^
답변 감사합니다!

2018년 1월 9일 화요일 오후 8시 55분 7초 UTC+9, 돋움 님의 말:
Reply all
Reply to author
Forward
0 new messages