netty 시작하기 (3)

Post on 19-Jul-2015

229 Views

Category:

Software

7 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

김대현@hatemogi

8

Netty 시작하기: 세번째 시간

Netty의 쓰레드 모델ChannelFuture와ChannelPromise

실습과 예제

텍스트 기반 채팅 서버 개발

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

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

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

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

상호배제 Mutual exclusion

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

멀티쓰레드 프로그래밍

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

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

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

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

주의

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

채널과 쓰레드의 관계

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

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

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

Future 활용예

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

Promise

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

Netty의 Promise

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

채팅 프로토콜 doc/protocol.md

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

프로토콜 예

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

서버가 보내는 메시지

대화의 예

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

본격 개발에 앞서: AttributeMap

Channel이나 ChannelHandler에 속성 바인딩

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

src/nettystartup/h3/ChatServer.java

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

src/nettystartup/h3/ChatMessage.java

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

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

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

src/nettystartup/h3/ChatMessageCodec.java

와 간 변환 담당

텔넷 접속 확인

참고자료

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

다음 시간에는...

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

top related