netty 시작하기 (3)
TRANSCRIPT
Netty 시작하기: 세번째 시간
Netty의 쓰레드 모델ChannelFuture와ChannelPromise
실습과 예제
텍스트 기반 채팅 서버 개발
쓰레드가 무엇인가요?멀티 프로세스와 멀티 쓰레드의 차이?
멀티쓰레드 처리가 어려운 이유
동기화를 놓치면 > 경쟁조건 발생동기화가 과도하면 > 성능병목, 교착상태 발생
교착상태(deadlock)의 4가지 필요조건
상호배제 Mutual exclusion
점유대기 Hold and wait비선점 No preemption순환대기 Circular wait
멀티쓰레드 프로그래밍
동시에 여러 일을 처리하기 쉬워보이지만,제대로 작성하기 어렵습니다
Netty의 깔끔한 쓰레드 모델ChannelHandler의 메소드는 동시에 불리지 않는다채널은 한 쓰레드에 할당되며, 그 쓰레드에서만 호출등록된 도 그 쓰레드가 호출한다
쓰레드 모델을 풀어서 설명하면
각 채널은 (사실상) 싱글쓰레드로 운영쓰레드 안전성(threadsafety)를 신경쓰지 않아도 됨
주의
채널핸들러 등록시에 별도 쓰레드를 지정할 수도 있는데,이 경우 다른 핸들러는 다른 쓰레드가 호출할 수 있음즉, 쓰레드 안전성을 고려해야함
채널과 쓰레드의 관계
은 에 등록는 Channel에 하나의 쓰레드를 할당
해당 쓰레드 입장에서는 여러개의 을 처리그러나 입장에서는 단일 쓰레드
Future & Promise비동기 호출의 결과도 받을 수 있지만,다른 쓰레드에 업무를 요청시에도 사용
Future 활용예
차례로 부르는 것처럼 이해하기 쉬움이미지 로딩을 동시에 진행필요한 시점에 로드가 끝나지 않았다면 알아서 대기
Promise
Future에 결과를 통보하는 입장에서 사용
Netty의 Promise
실습: 채팅 서버 프로토콜실습 목적의 UTF8 텍스트 기반 간단 채팅클라이언트는 우선 활용서버 전체에 통합 대화방 한개연결하면 서버가 임의 대화명 발급 (변경가능)
채팅 프로토콜 doc/protocol.md
: UTF8 텍스트, "\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/nettystartup/4.html