Upload
trustinlee
View
5.938
Download
0
Embed Size (px)
DESCRIPTION
'Java Networking – from Basics to Advanced' - presented at The 10th Korea Java Developer Conference (28 February 2009)
Citation preview
자바 네트워킹자바 네트워킹기초에서 응용까지기초에서 응용까지
이희승 / Trustin Lee오픈 소스 자바 서버 개발 전문가[email protected]/28/09
랩 목표랩 목표
자바 네트워크 어플리케이션 개발에 필요한 배경 지식 습득 후 JBoss Netty를 이용한 고속 네트워크 어플리케이션 개발 방법을 익힌다 .
강사 소개강사 소개
• 자바 클라이언트 서버 개발 6 년
• Principal software engineer @ JBoss– Netty, Remoting, APIviz
• Member & Committer @ ASF– MINA, Directory
• Proprietary Projects– 마이크로커널 기반 SMS 게이트웨이
– OSGi 기반 RPC 어플리케이션 서버
– 경량 ESB
목차목차
• Internet Protocol Suite
• Old Blocking I/O
• New Non-blocking I/O
• The Netty Project
Internet Protocol SuiteInternet Protocol Suite
Internet Protocol SuiteInternet Protocol Suite
• aka TCP/IP 모델
• 4 계층– Link
– Internet
– Transport
– Application
Link LayerLink Layer
Host 1Host 1 Host 2Host 2NICNIC NICNIC
Linkage
EthernetFiber
Satellite
FrameFrameHeaderHeader
FrameFrameFooterFooterFrame DataFrame Data
Network
Internet LayerInternet Layer
Network 1 Network 1 Network 2Network 2RouterRouter RouterRouterIPv4 · IPv6
FrameFrameHeaderHeader
IPIPHeaderHeader
FrameFrameFooterFooterIP DataIP Data
Internet
Transport LayerTransport Layer
FrameFrameHeaderHeader
IPIPHeaderHeader
FrameFrameFooterFooterIP DataIP Data
Transport Transport HeaderHeader Transport DataTransport Data
Transport Layer – UDPTransport Layer – UDP
• 대표적 Connection-less Datagram Protocol
• Unreliable, Unordered, Light-weight
• 메시지 단위 버퍼– 송신 : “ABC”, “DEF”, “GHI”, “JKL”
– 수신 : “DEF”, “GHI”, “ABC”, “JKL”
• 패킷이 클 경우 IP 규칙에 따름 – IPv4 vs. IPv6?
Peer 2Peer 2Peer 1Peer 1
33
44
1122
3344
11 22
Transport Layer – TCPTransport Layer – TCP
Peer 2Peer 2Peer 1Peer 1ReceiveReceiveBufferBuffer
ReceiveReceiveBufferBuffer
SendSendBufferBuffer
SendSendBufferBuffer33 33 4411 22
3344 1122
• 대표적 Connection-oriented Stream Protocol
• Reliable, Ordered, Heavy-weight
• 데이터가 누적되는 버퍼– 송신 : “ABC”, “DEF”, “GHI”
– 수신 : “A”, “BCD”, “EF”, “GHI”
• TIME_WAIT 상태
Application Layer – HTTPApplication Layer – HTTP
• RFC2616 – Hypertext Transfer Protocol
C: GET /index.txt HTTP/1.1C: Host: www.jboss.org
S: HTTP/1.1 200 OKS: Date: Mon, 23 May 2005 22:38:34 GMTS: Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)S: Last-Modified: Wed, 08 Jan 2003 23:11:55 GMTS: Content-Length: 13S: Connection: keep-aliveS: Content-Type: text/plain; charset=UTF-8S:S: Hello, World!
C: GET /index.txt HTTP/1.1C: Host: www.jboss.org
S: HTTP/1.1 200 OKS: Date: Mon, 23 May 2005 22:38:34 GMTS: Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)S: Last-Modified: Wed, 08 Jan 2003 23:11:55 GMTS: Content-Length: 13S: Connection: keep-aliveS: Content-Type: text/plain; charset=UTF-8S:S: Hello, World!
Application Layer – SMTPApplication Layer – SMTP
• RFC5321 – Simple Mail Transfer Protocol
S: 220 smtp.example.com ESMTP PostfixC: HELO relay.example.orgS: 250 Hello relay.example.org, greetings.C: MAIL FROM:<[email protected]>S: 250 OKC: RCPT TO:<[email protected]>S: 250 OKC: DATAS: 354 End data with <CR><LF>.<CR><LF>C: {..MAIL BODY..}C: .S: 250 OK: queued as 12345C: QUITS: 221 Bye{DISCONNECTION}
S: 220 smtp.example.com ESMTP PostfixC: HELO relay.example.orgS: 250 Hello relay.example.org, greetings.C: MAIL FROM:<[email protected]>S: 250 OKC: RCPT TO:<[email protected]>S: 250 OKC: DATAS: 354 End data with <CR><LF>.<CR><LF>C: {..MAIL BODY..}C: .S: 250 OK: queued as 12345C: QUITS: 221 Bye{DISCONNECTION}
Old Blocking I/OOld Blocking I/O
Old Blocking I/O – IllustratedOld Blocking I/O – Illustrated
Boss ThreadBoss ThreadServerSocket.accept()ServerSocket.accept()
Worker Thread #1Worker Thread #1Socket.getInputStream()Socket.getInputStream()Socket.getOutputStream()Socket.getOutputStream()InputStream.read()InputStream.read()비즈니스 로직 수행비즈니스 로직 수행OutputStrea.write()OutputStrea.write()Socket.close()Socket.close()
Worker Thread #3Worker Thread #3
Worker Thread #4Worker Thread #4
Worker Thread #Worker Thread #NN (10000!?) (10000!?)
Old Blocking I/O –Old Blocking I/O – 장단점장단점
• 장점– 단순하다
– 적은 수의 커넥션에서 고성능
– 이해하기 쉬운 직선적 코드 진행
• 단점– 많은 수의 커넥션에서 자원 소모 심함
– 많은 수의 커넥션에서 디버그 어려움
New Non-blocking I/ONew Non-blocking I/O
New Non-blocking I/O – IllustratedNew Non-blocking I/O – Illustrated
Boss ThreadBoss ThreadServerSocket-ServerSocket- Channel.accept()Channel.accept()SocketChannel.register()SocketChannel.register()
Worker Thread #1Worker Thread #1Selector.select()Selector.select()for each selected channels:for each selected channels: SocketChannel.read()SocketChannel.read() SocketChannel.write()SocketChannel.write()
Worker Thread #2Worker Thread #2
Worker Thread #3Worker Thread #3
Worker Thread #4Worker Thread #4
Worker Thread #Worker Thread #NN (# of CPU cores) (# of CPU cores)
균등분배
New Non-blocking I/O – IllustratedNew Non-blocking I/O – Illustrated
Worker ThreadWorker ThreadSocketChannel.read()SocketChannel.read()SocketChannel.write()SocketChannel.write()
Event HandlerEvent HandleronInit:onInit: 환영 전문 작성환영 전문 작성 WorkerThread.writeAsync()WorkerThread.writeAsync() 현재 상태현재 상태 == 인증 대기인증 대기onData:onData: switch (switch ( 현재 상태현재 상태 ):): 인증 대기인증 대기 :: 로그인 전문 해석로그인 전문 해석 인증 결과 전문 작성인증 결과 전문 작성 WorkerThread.writeAsync()WorkerThread.writeAsync() 현재 상태현재 상태 == 요청 대기요청 대기 요청 대기요청 대기 :: 요청 전문 해석요청 전문 해석 비즈니스 로직 수행비즈니스 로직 수행 요청 수행 결과 전문 작성요청 수행 결과 전문 작성 WorkerThread.writeAsync()WorkerThread.writeAsync() 현재 상태현재 상태 == 요청 대기요청 대기
New Non-blocking I/O –New Non-blocking I/O – 장단점장단점
• 장점– 많은 수의 커넥션에서 고효율 고성능
– 많은 수의 커넥션에서 디버그 쉬움
• 단점– 복잡한 스레드 모델
– 이해하기 어려운 다단계 State machine 기반• Old I/O 에서 쉬웠던 것도 어렵게 구현
• SSL / TLS 암호화
• 전문 완전히 받을 때까지 기다리기
– 벤더별 SelectorProvider 구현 특성
The Netty ProjectThe Netty Project
The Netty ProjectThe Netty Project
• 이벤트 기반 비동기 네트워크 어플리케이션 프레임워크
• Interceptor Chain 패턴– 손쉽게 다단계 State machine 구현
– 암복호화 + 전문 해석 + 스레드 풀링 + 비즈니스 로직
– 조립 가능한 컴포넌트 다수 제공
• 과부하 및 DoS 방어 메커니즘
• Old · New I/O 모두 지원
• NIO 구현 · 벤더별 최적화
The Netty ProjectThe Netty Project
• 주요 프로토콜 코덱 제공– HTTP
– Google Protocol Buffers
• 제한된 환경 지원– Android, Applet, WebStart
• 다양한 컨테이너 및 DI 프레임워크 지원– JBoss Microcontainer, OSGi, Guice, Spring
Echo · Discard Echo · Discard 예제 해부예제 해부
• 부트스트랩
• 이벤트 핸들러
• 메모리 넘치지 않게 하기
• 핸들러 직접 구현해 보기
Telnet Telnet 예제 해부예제 해부
• 구분자 기반– 텍스트 (CR / LF) · 플래쉬 XML Socket (NUL) 등
– OneToOneEncoder
– DelimiterBasedFrameDecoder
Factorial Factorial 예제 해부예제 해부
• 길이 필드 기반– 일반적으로 바이너리
– 길이 필드를 포함한 헤더 + 바디
– OneToOneEncoder
– FrameDecoder
– ReplayDecoder
• 상태 관리– 커넥션별 중간 계산값 저장
HTTP HTTP 서버 만들기서버 만들기
• HTTP 의 모든 면을 세세히 제어 가능– 대용량 데이터 송수신 – Chunked Encoding
– Comet / AJAX
• 서버– HttpRequestDecoder
– HttpResponseEncoder
• 클라이언트– HttpRequestEncoder
– HttpResponseDecoder
Google Protocol BuffersGoogle Protocol Buffers
• 정의 파일에서 고성능 고효율 코드 생성
message Person { required string name = 1; optional string email = 2; enum PhoneType { HOME = 0; WORK = 1; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4;}
message Person { required string name = 1; optional string email = 2; enum PhoneType { HOME = 0; WORK = 1; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4;}
Netty + Google Protocol BuffersNetty + Google Protocol Buffers
• 고속 개발– Encoder / Decoder 구현이 필요 없음
– 잘 작성된 정의 파일을 통해 하위 호환성 확보
• 상호 운용성 증대– Java, C++, Python 등 대부분의 언어용 코드 자동 생성
• Netty와 간단히 통합– ProtobufEncoder
– LengthFieldPrepender
– ProtobufDecoder
– LengthFieldBasedFrameDecoder
업무 적용 – 비즈니스 로직 수행업무 적용 – 비즈니스 로직 수행
• 대부분의 비즈니스 로직은 외부 자원 접근– Database CRUD
– 다른 서버로 릴레이 – Proxy
• NIO Worker 스레드에서 오래 걸리는 동작 수행 불가– 다른 커넥션에 영향
• ChannelPipeline 에 ExecutionHandler 추가– OrderedMemoryAwareThreadPoolExecutor
• 핸들러 내부에서 비동기 API만 사용– Asynchronous JDBC
– Netty in Netty
업무 적용 –업무 적용 – DoS DoS 및 과부하 방어및 과부하 방어
• Message flooding– (Ordered)MemoryAwareThreadPoolExecutor– Write buffer high·low water mark
– Channel.isWritable() 존중
• 접속 후 요청 ·응답 없이 자원 소모하는 경우– ReadTimeoutHandler
– WriteTimeoutHandler
– IdleStateHandler
업무 적용 –업무 적용 – DoS DoS 및 과부하 방어및 과부하 방어
• 적극적 방어를 위해서는 비즈니스 로직에 맞게 최적화
• '의심스러운 ' 커넥션 제거– Flooding 기준 정의
– 엄격한 전문 형식 · state machine 상태 유효성 검사
• 긴 전문은 Chunk 로 쪼개 처리
질의 및 응답질의 및 응답