Transcript
Page 1: Netty 시작하기 (3)

Netty 시작하기 (3)깔끔한 쓰레드 모델과 채널퓨처&프로미스

김대현@hatemogi

8

Page 2: Netty 시작하기 (3)

Netty 시작하기: 세번째 시간

Netty의 쓰레드 모델ChannelFuture와ChannelPromise

실습과 예제

텍스트 기반 채팅 서버 개발

Page 3: Netty 시작하기 (3)

쓰레드가 무엇인가요?멀티 프로세스와 멀티 쓰레드의 차이?

Page 4: Netty 시작하기 (3)

멀티쓰레드 처리가 어려운 이유

동기화를 놓치면 ­> 경쟁조건 발생동기화가 과도하면 ­> 성능병목, 교착상태 발생

교착상태(deadlock)의 4가지 필요조건

상호배제 Mutual exclusion

점유대기 Hold and wait비선점 No preemption순환대기 Circular wait

Page 5: Netty 시작하기 (3)

멀티쓰레드 프로그래밍

동시에 여러 일을 처리하기 쉬워보이지만,제대로 작성하기 어렵습니다

Page 6: Netty 시작하기 (3)

Netty의 깔끔한 쓰레드 모델ChannelHandler의 메소드는 동시에 불리지 않는다채널은 한 쓰레드에 할당되며, 그 쓰레드에서만 호출등록된 도 그 쓰레드가 호출한다

Page 7: Netty 시작하기 (3)

쓰레드 모델을 풀어서 설명하면

각 채널은 (사실상) 싱글쓰레드로 운영쓰레드 안전성(thread­safety)를 신경쓰지 않아도 됨

주의

채널핸들러 등록시에 별도 쓰레드를 지정할 수도 있는데,이 경우 다른 핸들러는 다른 쓰레드가 호출할 수 있음즉, 쓰레드 안전성을 고려해야함

Page 8: Netty 시작하기 (3)

채널과 쓰레드의 관계

은 에 등록는 Channel에 하나의 쓰레드를 할당

해당 쓰레드 입장에서는 여러개의 을 처리그러나 입장에서는 단일 쓰레드

Page 9: Netty 시작하기 (3)

Future & Promise비동기 호출의 결과도 받을 수 있지만,다른 쓰레드에 업무를 요청시에도 사용

Page 10: Netty 시작하기 (3)

Future 활용예

차례로 부르는 것처럼 이해하기 쉬움이미지 로딩을 동시에 진행필요한 시점에 로드가 끝나지 않았다면 알아서 대기

Page 11: Netty 시작하기 (3)

Promise

Future에 결과를 통보하는 입장에서 사용

Page 12: Netty 시작하기 (3)

Netty의 Promise

Page 13: Netty 시작하기 (3)

실습: 채팅 서버 프로토콜실습 목적의 UTF­8 텍스트 기반 간단 채팅클라이언트는 우선 활용서버 전체에 통합 대화방 한개연결하면 서버가 임의 대화명 발급 (변경가능)

Page 14: Netty 시작하기 (3)

채팅 프로토콜 doc/protocol.md

: UTF­8 텍스트, "\n" ; = | , " ", ; = | , ":", ;

프로토콜 예

Page 15: Netty 시작하기 (3)

클라이언트가 보내는 메시지

Page 16: Netty 시작하기 (3)

서버가 보내는 메시지

Page 17: Netty 시작하기 (3)

대화의 예

# 서버가 보냄 클라이언트1 HAVE:steve2 HELO:david3 NICK hatemogi4 NICK:david hatemogi5 SEND 안녕하세요6 FROM:hatemogi 안녕하세요7 FROM:steve 반갑습니다

Page 18: Netty 시작하기 (3)

본격 개발에 앞서: AttributeMap

Channel이나 ChannelHandler에 속성 바인딩

Page 19: Netty 시작하기 (3)

실습: 텍스트 기반 채팅 서버ChatServer.javaChatMessage.javaChatServerHandler.javaChatMessageCodec.java

Page 20: Netty 시작하기 (3)

src/nettystartup/h3/ChatServer.java

LineBasedDecoder, StringDecoder, StringDecoder는 마지막 시간에 설명

Page 21: Netty 시작하기 (3)

src/nettystartup/h3/ChatMessage.java

Page 22: Netty 시작하기 (3)

src/nettystartup/h3/ChatServerHandler.java (1)

Page 23: Netty 시작하기 (3)

src/nettystartup/h3/ChatServerHandler.java (2)

Page 24: Netty 시작하기 (3)

src/nettystartup/h3/ChatServerHandler.java (3)

Page 25: Netty 시작하기 (3)

src/nettystartup/h3/ChatMessageCodec.java

와 간 변환 담당

Page 26: Netty 시작하기 (3)

텔넷 접속 확인

Page 27: Netty 시작하기 (3)

참고자료

New and Noteworthy in Netty 4.0http://en.wikipedia.org/wiki/Futures_and_promises

Page 28: Netty 시작하기 (3)

다음 시간에는...

http://hatemogi.github.io/netty­startup/4.html


Top Related