SlideShare une entreprise Scribd logo
1  sur  20
Télécharger pour lire hors ligne
Netty Internals
       and Core Concepts
이희승
Twitter, Inc.
CONTENTS


●   소개
●   이벤트 모델
●   스레드 모델
●   테스팅
●   생각할 거리
소개
●   네티란 ?
●   구성요소
    –   이벤트 루프
    –   파이프라인 (BiDiCoR)
네티란 ?


●   Java network application framework

    –   http://netty.io/

    –   @netty_project

●   Asynchronous & event-driven

    –   High-throughput & highly concurrent connection

    –   .. with less resources – threads, memory & CPU cycles

●   API as an I/O abstraction layer

    –   Works with NIO, OIO, AIO & more without many changes

●   Well-defined event model & thread model

●   Flexible event handling with bi-directional chain of responsibility pattern

●   Promotes 'separation of concerns'

    –   I/O layer (Netty)

    –   Protocol codec (Netty or user)

    –   Business logic (user)
구성요소


                                   Business Logic



                          Custom Event Handlers & Codecs


                                    User Code


                                                HTTP



       TCP      UDP        In-VM                Codec Framework



                                                       Event Handlers

             Transports                                  Handlers

              I/O Abstraction – Channels, Event Loops, and Pipelines



                                      Buffers

                                       Core
이벤트 루프


●   Similar to..

    –   Windows event dispatcher

    –   Swing event loop

    –   Reactor

●   사용자의 I/O 요청을 처리

    –   이벤트 루프 스레드 내에서 요청했을 경우 즉시

    –   이벤트 루프 스레드 외에서 요청했을 경우 이벤트 루프의 작업 큐에 넣어 스케쥴

●   외부의 자극에 반응하고 파이프라인에 알림

    –   데이터를 읽어들임

    –   소켓 버퍼가 꽉 찼음

●   사용자가 원하는 임의 작업 실행

    –   One-time or periodic
파이프라인


●   BiDiCoR

    –   Bi-directional Chain of Responsibility pattern

    –   Similar to Servlet filters and decorator pattern

●   Inbound event

    –   이벤트 루프가 발생시킨 이벤트 ( 소켓 연결 , 데이터 수신 등 )

    –   사용자가 작성한 inbound event handler 가 수신할 수 있도록 해 줌

●   Outbound event

    –   사용자가 요청한 동작 ( 쓰기 , 읽기 일시 중단 등 )

    –   사용자가 작성한 outbound event handler 가 다른 핸들러에서 요청한 동작을 가로챌 수 있도록 해 줌

    –   최종적으로 이벤트 루프에 전달되어 실제 I/O 가 수행되도록 함

●   예시

    –   [1:EvLoop] → [2:Protocol Decoder] → [3:Protocol Encoder] → [4:Business Logic]

    –   수신 : 1 → 2 → 4

    –   송신 : 4 → 3 → 1
이벤트 모델
●   Before, After & Considerations
기존의 이벤트 모델


●   이벤트 = 자바 객체                                              ●   Is GC cheap?

●   예시                                                           –   No at extreme scale

    –   ChannelOpen (instanceof ChannelStateEvent)
                                                             ●   Can buffer pool beat JVM's memory allocator?

    –   ChannelBound (instanceof ChannelStateEvent)              –   Think memory bandwidth took by memset

    –   ChannelConnected (instanceof ChannelStateEvent)          –   Modern concurrency constructs enable close-to-native
                                                                     efficiency in object pooling
    –   MessageEvent (inbound)
                                                             ●   Too many state events!
    –   MessageEvent (outbound)
                                                                 –   Open → bound → connected is an overkill in most TCP conns
    –   ChannelDisconnected (instanceof ChannelStateEvent)
                                                                 –   What's interesting to user is 'connected'.
    –   ChannelUnbound (instanceof ChannelStateEvent)

    –   ChannelClosed (instanceof ChannelStateEvent)
                                                             ●   New buffer is created on every MessageEvent.

                                                                 –   GC pressure

                                                                 –   User has no control over the buffer

                                                                     ●   Heap or direct
                                                                     ●   Bounded or unbounded
                                                             ●   No buffered flush

                                                                 –   Every write is an immediate flush

                                                                 –   Sometimes not desired
새 이벤트 모델


●   이벤트 = 메소드 호출               ●   상태 전이 단순화

●   예시                         ●   핸들러가 수신 및 송신 버퍼를 만들어 네티에게 제공하면
                                   지속적으로 재사용
    –   ChannelRegistered
                                   –   버퍼 해제 시점이 명확하므로 풀링 구현 단순화 가능
    –   ChannelActive
                                   –   이벤트에 버퍼 정보가 없음
    –   InboundBufferUpdated
                               ●   Buffered flush
    –   Flush

    –   ChannelInactive            –   버퍼에 데이터를 채운 뒤 flush 이벤트를 발생시키는 것으로
                                       MessageEvent 대체
    –   ChannelUnregistered
                                   –   여러 개의 메시지를 쓴 뒤 flush 하여 시스템 콜 절약

                               ●   훨씬 적은 GC 빈도

                                   –   이벤트 객체 생성 → 호출 스택

                                   –   수신 및 송신 버퍼

                               ●   단점

                                   –   이벤트 유형별로 메소드를 전부 정의해야 함 ( 코드 중복 )

                                   –   사용자 정의 이벤트 처리 어려움

                                       ●   별도로 UserEventTriggered 메소드 추가
스레드 모델
●   Why is well-defined thread model necessary?
잘 정의된 스레드 모델의 필요성


●   프레임워크에서 사용자의 코드가 어느 스레드에서 언제 실행될 지 충분히 정확히 정의해야 함

●   프레임워크가 어느 정도의 thread safety 를 사용자 코드 (e.g. 이벤트 핸들러 ) 에게 제공할 것인가 ?

    –   이벤트 간의 happens-before 관계

    –   네티가 핸들러 메소드를 동시 실행하는 경우가 있는가

    –   비동기 I/O 요청 이후에 완료 알림은 어느 스레드에서 실행되어야 하는가

    –   사용자가 직접 동기화하도록 했을 때 dead lock 발생은 하지 않는가

●   정확한 스레드 모델이 제시되지 않으면 사용자 코드는 방어적으로 ( 또는 부정확하게 ) 작성됨

    –   불필요한 동기화 및 그에 따른 dead lock ( 또는 부족한 동기화로 인한 race condition)

    –   성능 저하 및 유지 보수 비용 증가

●   예 : 네티의 SSL 핸들러

    –   LoC: 1469 → 925 (3.5 vs 4.0)
네티 4 스레드 모델


●   3.x 대비 이벤트 모델 개선과 함께 가장 중요하고 긍정적인 변화

●   네티는 핸들러가 @Sharable 어노테이션이 붙어 있는 경우가 아니면 절대 같은 핸들러 메소드를 동시에 호출하지 않는다 .

    –   사용자는 자신이 작성한 핸들러 클래스의 메소드를 동기화할 필요가 없다 .

    –   단 , 사용자는 같은 핸들러 인스턴스를 파이프라인에 여러 번 추가할 수 없다 .

●   네티가 핸들러 메소드를 호출할 때 각 호출 사이에는 happens-before 관계가 성립한다 .

    –   사용자는 핸들러의 멤버 변수를 volatile 로 선언할 필요가 없다 .

●   이벤트루프는 항상 싱글 스레드로 실행된다 .

    –   핸들러 메소드는 항상 같은 스레드로부터 호출된다 .

●   비동기 요청에 대한 결과 통보 (ChannelFuture) 는 이벤트 루프 스레드에서 항상 이루어진다 .
테스팅
●   네티 유저의 테스트
●   네티 자체의 테스트
네티 유저의 테스트


●   네티는 EmbeddedChannel 이라 불리는 Channel 구현을 제공

●   사용자는 자신이 작성한 핸들러를 EmbeddedChannel 의 파이프라인에 추가하고 이벤트를 임의로 발생시켜 테스트

       @Test
       public void testLineProtocol() {
           EmbeddedByteChannel ch = new EmbeddedByteChannel(new LineDecoder());

           // Ordinary input
           ch.writeInbound(Unpooled.wrappedBuffer(new byte[] { 'A' }));
           assertNull(ch.readInbound());
           ch.writeInbound(Unpooled.wrappedBuffer(new byte[] { 'B' }));
           assertNull(ch.readInbound());
           ch.writeInbound(Unpooled.wrappedBuffer(new byte[] { 'C' }));
           assertNull(ch.readInbound());
           ch.writeInbound(Unpooled.wrappedBuffer(new byte[] { 'n' }));
           assertEquals(Unpooled.wrappedBuffer(new byte[] { 'A', 'B', 'C' }),
                        ch.readInbound());

           // Truncated input
           ch.writeInbound(Unpooled.wrappedBuffer(new byte[] { 'A' }));
           assertNull(ch.readInbound());
           ch.close();
           assertNull(ch.readInbound());
       }
네티 자체의 테스트


●   각 트랜스포트의 정확한 동작을 확인하기 위해 모든 트랜스포트 조합과 주요 프로토콜 조합에 대해 교차 테스트 수행

    –   TCP: NIO x AIO x OIO = 9 – 1 (OIO x OIO)

    –   UDP: NIO x OIO = 4

    –   프로토콜 : Echo, SSL, SPDY = 3 * TCP (8) = 24

●   자체 제공 핸들러의 경우는 EmbeddedChannel 을 이용

●   기타

    –   Jenkins

    –   Animal Sniffer: Build fails on violation before packaging

    –   Checkstyle: Build fails on violation before compilation
생각할 거리
●   Dynamic event routing
●   Statistical Distributed Performance Analysis on Mesos Cluster
●   Management and Monitoring
●   Native Transport
●   Scalable Community
유용할만한 곳


●   공식 자료

    –   홈페이지 - http://netty.io/

    –   4.0 변경 사항 모음 - http://goo.gl/E2BJ2

●   커뮤니티 자료

    –   블로그 모음 - http://goo.gl/2iMKP

    –   스택오버플로 - http://stackoverflow.com/questions/tagged/netty

●   네티 프로젝트 트위터 계정

    –   https://twitter.com/netty_project

●   네티 한국어 이용자 모임

    –   https://groups.google.com/forum/#!forum/netty-ko

Contenu connexe

Tendances

Social game programming footage 1 client to server connection
Social game programming footage 1 client to server connectionSocial game programming footage 1 client to server connection
Social game programming footage 1 client to server connectionNettention
 
Android Push Server & MQTT
Android Push Server & MQTTAndroid Push Server & MQTT
Android Push Server & MQTT광운 이
 
11 윈도우스레드풀
11 윈도우스레드풀11 윈도우스레드풀
11 윈도우스레드풀ssuser0c2478
 
Easy gameserver
Easy gameserverEasy gameserver
Easy gameserver진상 문
 
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것흥배 최
 
V8 engine internal
V8 engine internalV8 engine internal
V8 engine internalJinhyuck Kim
 
Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본ssuser0c2478
 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVAcooddy
 
IBM MQTT Mobile Push Solution 소개서
IBM MQTT Mobile Push Solution 소개서IBM MQTT Mobile Push Solution 소개서
IBM MQTT Mobile Push Solution 소개서Shaun LEE
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화sung ki choi
 
Windows via c/c++ ch03. 커널오브젝트
Windows via c/c++ ch03. 커널오브젝트Windows via c/c++ ch03. 커널오브젝트
Windows via c/c++ ch03. 커널오브젝트ssuser0c2478
 
05_Reliable UDP 구현
05_Reliable UDP 구현05_Reliable UDP 구현
05_Reliable UDP 구현noerror
 
Mastering ethereum(smart contract)
Mastering ethereum(smart contract)Mastering ethereum(smart contract)
Mastering ethereum(smart contract)제호 송
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6SukYun Yoon
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumerChang Yoon Oh
 

Tendances (19)

Social game programming footage 1 client to server connection
Social game programming footage 1 client to server connectionSocial game programming footage 1 client to server connection
Social game programming footage 1 client to server connection
 
Android Push Server & MQTT
Android Push Server & MQTTAndroid Push Server & MQTT
Android Push Server & MQTT
 
Multi thread
Multi threadMulti thread
Multi thread
 
11 윈도우스레드풀
11 윈도우스레드풀11 윈도우스레드풀
11 윈도우스레드풀
 
Easy gameserver
Easy gameserverEasy gameserver
Easy gameserver
 
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
 
V8 engine internal
V8 engine internalV8 engine internal
V8 engine internal
 
Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본
 
네트워크 기본
네트워크 기본네트워크 기본
네트워크 기본
 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVA
 
Lock free queue
Lock free queueLock free queue
Lock free queue
 
IBM MQTT Mobile Push Solution 소개서
IBM MQTT Mobile Push Solution 소개서IBM MQTT Mobile Push Solution 소개서
IBM MQTT Mobile Push Solution 소개서
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
Windows via c/c++ ch03. 커널오브젝트
Windows via c/c++ ch03. 커널오브젝트Windows via c/c++ ch03. 커널오브젝트
Windows via c/c++ ch03. 커널오브젝트
 
MutiCore 19-20
MutiCore 19-20MutiCore 19-20
MutiCore 19-20
 
05_Reliable UDP 구현
05_Reliable UDP 구현05_Reliable UDP 구현
05_Reliable UDP 구현
 
Mastering ethereum(smart contract)
Mastering ethereum(smart contract)Mastering ethereum(smart contract)
Mastering ethereum(smart contract)
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumer
 

En vedette

자바 네트워크 소녀 Netty 리뷰
자바 네트워크 소녀 Netty 리뷰자바 네트워크 소녀 Netty 리뷰
자바 네트워크 소녀 Netty 리뷰Woojin Joe
 
Network 초보자를 위한 Netty
Network 초보자를 위한 NettyNetwork 초보자를 위한 Netty
Network 초보자를 위한 NettyChoulhyouc Lee
 
Netty 시작하기 (1)
Netty 시작하기 (1)Netty 시작하기 (1)
Netty 시작하기 (1)Daehyun Kim
 
OB1K - New, Better, Faster, Devops Friendly Java container by Outbrain
OB1K - New, Better, Faster, Devops Friendly Java container by OutbrainOB1K - New, Better, Faster, Devops Friendly Java container by Outbrain
OB1K - New, Better, Faster, Devops Friendly Java container by OutbrainEran Harel
 
Vert.x - Dessì
Vert.x - DessìVert.x - Dessì
Vert.x - DessìCodemotion
 
Netty 시작하기 (2)
Netty 시작하기 (2)Netty 시작하기 (2)
Netty 시작하기 (2)Daehyun Kim
 
오픈 소스 개발자 이희승 총집편
오픈 소스 개발자 이희승 총집편오픈 소스 개발자 이희승 총집편
오픈 소스 개발자 이희승 총집편우영 유
 
The Power Of Event Chapter 7
The Power Of Event Chapter 7The Power Of Event Chapter 7
The Power Of Event Chapter 7Woojin Joe
 
Netty 시작하기 (4)
Netty 시작하기 (4)Netty 시작하기 (4)
Netty 시작하기 (4)Daehyun Kim
 
Baidu push 연동하기
Baidu push 연동하기Baidu push 연동하기
Baidu push 연동하기Choulhyouc Lee
 
Docker (Compose) 활용 - 개발 환경 구성하기
Docker (Compose) 활용 - 개발 환경 구성하기Docker (Compose) 활용 - 개발 환경 구성하기
Docker (Compose) 활용 - 개발 환경 구성하기raccoony
 
Netty 4-based RPC System Development
Netty 4-based RPC System DevelopmentNetty 4-based RPC System Development
Netty 4-based RPC System DevelopmentAllan Huang
 

En vedette (12)

자바 네트워크 소녀 Netty 리뷰
자바 네트워크 소녀 Netty 리뷰자바 네트워크 소녀 Netty 리뷰
자바 네트워크 소녀 Netty 리뷰
 
Network 초보자를 위한 Netty
Network 초보자를 위한 NettyNetwork 초보자를 위한 Netty
Network 초보자를 위한 Netty
 
Netty 시작하기 (1)
Netty 시작하기 (1)Netty 시작하기 (1)
Netty 시작하기 (1)
 
OB1K - New, Better, Faster, Devops Friendly Java container by Outbrain
OB1K - New, Better, Faster, Devops Friendly Java container by OutbrainOB1K - New, Better, Faster, Devops Friendly Java container by Outbrain
OB1K - New, Better, Faster, Devops Friendly Java container by Outbrain
 
Vert.x - Dessì
Vert.x - DessìVert.x - Dessì
Vert.x - Dessì
 
Netty 시작하기 (2)
Netty 시작하기 (2)Netty 시작하기 (2)
Netty 시작하기 (2)
 
오픈 소스 개발자 이희승 총집편
오픈 소스 개발자 이희승 총집편오픈 소스 개발자 이희승 총집편
오픈 소스 개발자 이희승 총집편
 
The Power Of Event Chapter 7
The Power Of Event Chapter 7The Power Of Event Chapter 7
The Power Of Event Chapter 7
 
Netty 시작하기 (4)
Netty 시작하기 (4)Netty 시작하기 (4)
Netty 시작하기 (4)
 
Baidu push 연동하기
Baidu push 연동하기Baidu push 연동하기
Baidu push 연동하기
 
Docker (Compose) 활용 - 개발 환경 구성하기
Docker (Compose) 활용 - 개발 환경 구성하기Docker (Compose) 활용 - 개발 환경 구성하기
Docker (Compose) 활용 - 개발 환경 구성하기
 
Netty 4-based RPC System Development
Netty 4-based RPC System DevelopmentNetty 4-based RPC System Development
Netty 4-based RPC System Development
 

Similaire à [E6]2012. netty internals

[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축Ji-Woong Choi
 
Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Sung-jae Park
 
지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기Ted Won
 
세션3 node.js의 의미와 자바의 대안
세션3 node.js의 의미와 자바의 대안세션3 node.js의 의미와 자바의 대안
세션3 node.js의 의미와 자바의 대안Lee Ji Eun
 
Multithread pattern 소개
Multithread pattern 소개Multithread pattern 소개
Multithread pattern 소개Sunghyouk Bae
 
Ch7,8. Configmaps, Secrets and API
Ch7,8. Configmaps, Secrets and APICh7,8. Configmaps, Secrets and API
Ch7,8. Configmaps, Secrets and APIHongmin Park
 
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안Jeongsang Baek
 
웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD활 김
 
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현NAVER Engineering
 
11st Legacy Application의 Spring Cloud 기반 MicroServices로 전환 개발 사례
11st Legacy Application의 Spring Cloud 기반 MicroServices로 전환 개발 사례11st Legacy Application의 Spring Cloud 기반 MicroServices로 전환 개발 사례
11st Legacy Application의 Spring Cloud 기반 MicroServices로 전환 개발 사례YongSung Yoon
 
한대희 Web proxy_개발_2006년11월_pas_ktf
한대희 Web proxy_개발_2006년11월_pas_ktf한대희 Web proxy_개발_2006년11월_pas_ktf
한대희 Web proxy_개발_2006년11월_pas_ktfDaehee Han
 
서버를 위한 동시성 모델과 Staged eventdrivenarchitecture
서버를 위한 동시성 모델과 Staged eventdrivenarchitecture서버를 위한 동시성 모델과 Staged eventdrivenarchitecture
서버를 위한 동시성 모델과 Staged eventdrivenarchitectureHyeonSeok Choi
 
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...hoondong kim
 
[112]clova platform 인공지능을 엮는 기술
[112]clova platform 인공지능을 엮는 기술[112]clova platform 인공지능을 엮는 기술
[112]clova platform 인공지능을 엮는 기술NAVER D2
 
2. klaytn developer meetup #2 univ chain
2. klaytn developer meetup #2 univ chain2. klaytn developer meetup #2 univ chain
2. klaytn developer meetup #2 univ chain전 민규
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링xxbdxx
 
resource on openstack
 resource on openstack resource on openstack
resource on openstackjieun kim
 

Similaire à [E6]2012. netty internals (20)

[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
 
Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Implementing remote procedure calls rev2
Implementing remote procedure calls rev2
 
지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기지금 핫한 Real-time In-memory Stream Processing 이야기
지금 핫한 Real-time In-memory Stream Processing 이야기
 
세션3 node.js의 의미와 자바의 대안
세션3 node.js의 의미와 자바의 대안세션3 node.js의 의미와 자바의 대안
세션3 node.js의 의미와 자바의 대안
 
Multithread pattern 소개
Multithread pattern 소개Multithread pattern 소개
Multithread pattern 소개
 
Ch7,8. Configmaps, Secrets and API
Ch7,8. Configmaps, Secrets and APICh7,8. Configmaps, Secrets and API
Ch7,8. Configmaps, Secrets and API
 
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
 
웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD웹기반원격감시제어 2010 CPD
웹기반원격감시제어 2010 CPD
 
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
 
11st Legacy Application의 Spring Cloud 기반 MicroServices로 전환 개발 사례
11st Legacy Application의 Spring Cloud 기반 MicroServices로 전환 개발 사례11st Legacy Application의 Spring Cloud 기반 MicroServices로 전환 개발 사례
11st Legacy Application의 Spring Cloud 기반 MicroServices로 전환 개발 사례
 
KAFKA 3.1.0.pdf
KAFKA 3.1.0.pdfKAFKA 3.1.0.pdf
KAFKA 3.1.0.pdf
 
한대희 Web proxy_개발_2006년11월_pas_ktf
한대희 Web proxy_개발_2006년11월_pas_ktf한대희 Web proxy_개발_2006년11월_pas_ktf
한대희 Web proxy_개발_2006년11월_pas_ktf
 
서버를 위한 동시성 모델과 Staged eventdrivenarchitecture
서버를 위한 동시성 모델과 Staged eventdrivenarchitecture서버를 위한 동시성 모델과 Staged eventdrivenarchitecture
서버를 위한 동시성 모델과 Staged eventdrivenarchitecture
 
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
 
[112]clova platform 인공지능을 엮는 기술
[112]clova platform 인공지능을 엮는 기술[112]clova platform 인공지능을 엮는 기술
[112]clova platform 인공지능을 엮는 기술
 
2. klaytn developer meetup #2 univ chain
2. klaytn developer meetup #2 univ chain2. klaytn developer meetup #2 univ chain
2. klaytn developer meetup #2 univ chain
 
Kafka slideshare
Kafka   slideshareKafka   slideshare
Kafka slideshare
 
Warp
WarpWarp
Warp
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
 
resource on openstack
 resource on openstack resource on openstack
resource on openstack
 

Plus de NAVER D2

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다NAVER D2
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...NAVER D2
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기NAVER D2
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발NAVER D2
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈NAVER D2
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&ANAVER D2
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기NAVER D2
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep LearningNAVER D2
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applicationsNAVER D2
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingNAVER D2
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지NAVER D2
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기NAVER D2
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화NAVER D2
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)NAVER D2
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기NAVER D2
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual SearchNAVER D2
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화NAVER D2
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지NAVER D2
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터NAVER D2
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?NAVER D2
 

Plus de NAVER D2 (20)

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual Search
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
 

[E6]2012. netty internals

  • 1. Netty Internals and Core Concepts 이희승 Twitter, Inc.
  • 2. CONTENTS ● 소개 ● 이벤트 모델 ● 스레드 모델 ● 테스팅 ● 생각할 거리
  • 3. 소개 ● 네티란 ? ● 구성요소 – 이벤트 루프 – 파이프라인 (BiDiCoR)
  • 4. 네티란 ? ● Java network application framework – http://netty.io/ – @netty_project ● Asynchronous & event-driven – High-throughput & highly concurrent connection – .. with less resources – threads, memory & CPU cycles ● API as an I/O abstraction layer – Works with NIO, OIO, AIO & more without many changes ● Well-defined event model & thread model ● Flexible event handling with bi-directional chain of responsibility pattern ● Promotes 'separation of concerns' – I/O layer (Netty) – Protocol codec (Netty or user) – Business logic (user)
  • 5. 구성요소 Business Logic Custom Event Handlers & Codecs User Code HTTP TCP UDP In-VM Codec Framework Event Handlers Transports Handlers I/O Abstraction – Channels, Event Loops, and Pipelines Buffers Core
  • 6. 이벤트 루프 ● Similar to.. – Windows event dispatcher – Swing event loop – Reactor ● 사용자의 I/O 요청을 처리 – 이벤트 루프 스레드 내에서 요청했을 경우 즉시 – 이벤트 루프 스레드 외에서 요청했을 경우 이벤트 루프의 작업 큐에 넣어 스케쥴 ● 외부의 자극에 반응하고 파이프라인에 알림 – 데이터를 읽어들임 – 소켓 버퍼가 꽉 찼음 ● 사용자가 원하는 임의 작업 실행 – One-time or periodic
  • 7. 파이프라인 ● BiDiCoR – Bi-directional Chain of Responsibility pattern – Similar to Servlet filters and decorator pattern ● Inbound event – 이벤트 루프가 발생시킨 이벤트 ( 소켓 연결 , 데이터 수신 등 ) – 사용자가 작성한 inbound event handler 가 수신할 수 있도록 해 줌 ● Outbound event – 사용자가 요청한 동작 ( 쓰기 , 읽기 일시 중단 등 ) – 사용자가 작성한 outbound event handler 가 다른 핸들러에서 요청한 동작을 가로챌 수 있도록 해 줌 – 최종적으로 이벤트 루프에 전달되어 실제 I/O 가 수행되도록 함 ● 예시 – [1:EvLoop] → [2:Protocol Decoder] → [3:Protocol Encoder] → [4:Business Logic] – 수신 : 1 → 2 → 4 – 송신 : 4 → 3 → 1
  • 8. 이벤트 모델 ● Before, After & Considerations
  • 9. 기존의 이벤트 모델 ● 이벤트 = 자바 객체 ● Is GC cheap? ● 예시 – No at extreme scale – ChannelOpen (instanceof ChannelStateEvent) ● Can buffer pool beat JVM's memory allocator? – ChannelBound (instanceof ChannelStateEvent) – Think memory bandwidth took by memset – ChannelConnected (instanceof ChannelStateEvent) – Modern concurrency constructs enable close-to-native efficiency in object pooling – MessageEvent (inbound) ● Too many state events! – MessageEvent (outbound) – Open → bound → connected is an overkill in most TCP conns – ChannelDisconnected (instanceof ChannelStateEvent) – What's interesting to user is 'connected'. – ChannelUnbound (instanceof ChannelStateEvent) – ChannelClosed (instanceof ChannelStateEvent) ● New buffer is created on every MessageEvent. – GC pressure – User has no control over the buffer ● Heap or direct ● Bounded or unbounded ● No buffered flush – Every write is an immediate flush – Sometimes not desired
  • 10. 새 이벤트 모델 ● 이벤트 = 메소드 호출 ● 상태 전이 단순화 ● 예시 ● 핸들러가 수신 및 송신 버퍼를 만들어 네티에게 제공하면 지속적으로 재사용 – ChannelRegistered – 버퍼 해제 시점이 명확하므로 풀링 구현 단순화 가능 – ChannelActive – 이벤트에 버퍼 정보가 없음 – InboundBufferUpdated ● Buffered flush – Flush – ChannelInactive – 버퍼에 데이터를 채운 뒤 flush 이벤트를 발생시키는 것으로 MessageEvent 대체 – ChannelUnregistered – 여러 개의 메시지를 쓴 뒤 flush 하여 시스템 콜 절약 ● 훨씬 적은 GC 빈도 – 이벤트 객체 생성 → 호출 스택 – 수신 및 송신 버퍼 ● 단점 – 이벤트 유형별로 메소드를 전부 정의해야 함 ( 코드 중복 ) – 사용자 정의 이벤트 처리 어려움 ● 별도로 UserEventTriggered 메소드 추가
  • 11. 스레드 모델 ● Why is well-defined thread model necessary?
  • 12. 잘 정의된 스레드 모델의 필요성 ● 프레임워크에서 사용자의 코드가 어느 스레드에서 언제 실행될 지 충분히 정확히 정의해야 함 ● 프레임워크가 어느 정도의 thread safety 를 사용자 코드 (e.g. 이벤트 핸들러 ) 에게 제공할 것인가 ? – 이벤트 간의 happens-before 관계 – 네티가 핸들러 메소드를 동시 실행하는 경우가 있는가 – 비동기 I/O 요청 이후에 완료 알림은 어느 스레드에서 실행되어야 하는가 – 사용자가 직접 동기화하도록 했을 때 dead lock 발생은 하지 않는가 ● 정확한 스레드 모델이 제시되지 않으면 사용자 코드는 방어적으로 ( 또는 부정확하게 ) 작성됨 – 불필요한 동기화 및 그에 따른 dead lock ( 또는 부족한 동기화로 인한 race condition) – 성능 저하 및 유지 보수 비용 증가 ● 예 : 네티의 SSL 핸들러 – LoC: 1469 → 925 (3.5 vs 4.0)
  • 13. 네티 4 스레드 모델 ● 3.x 대비 이벤트 모델 개선과 함께 가장 중요하고 긍정적인 변화 ● 네티는 핸들러가 @Sharable 어노테이션이 붙어 있는 경우가 아니면 절대 같은 핸들러 메소드를 동시에 호출하지 않는다 . – 사용자는 자신이 작성한 핸들러 클래스의 메소드를 동기화할 필요가 없다 . – 단 , 사용자는 같은 핸들러 인스턴스를 파이프라인에 여러 번 추가할 수 없다 . ● 네티가 핸들러 메소드를 호출할 때 각 호출 사이에는 happens-before 관계가 성립한다 . – 사용자는 핸들러의 멤버 변수를 volatile 로 선언할 필요가 없다 . ● 이벤트루프는 항상 싱글 스레드로 실행된다 . – 핸들러 메소드는 항상 같은 스레드로부터 호출된다 . ● 비동기 요청에 대한 결과 통보 (ChannelFuture) 는 이벤트 루프 스레드에서 항상 이루어진다 .
  • 14. 테스팅 ● 네티 유저의 테스트 ● 네티 자체의 테스트
  • 15. 네티 유저의 테스트 ● 네티는 EmbeddedChannel 이라 불리는 Channel 구현을 제공 ● 사용자는 자신이 작성한 핸들러를 EmbeddedChannel 의 파이프라인에 추가하고 이벤트를 임의로 발생시켜 테스트 @Test public void testLineProtocol() { EmbeddedByteChannel ch = new EmbeddedByteChannel(new LineDecoder()); // Ordinary input ch.writeInbound(Unpooled.wrappedBuffer(new byte[] { 'A' })); assertNull(ch.readInbound()); ch.writeInbound(Unpooled.wrappedBuffer(new byte[] { 'B' })); assertNull(ch.readInbound()); ch.writeInbound(Unpooled.wrappedBuffer(new byte[] { 'C' })); assertNull(ch.readInbound()); ch.writeInbound(Unpooled.wrappedBuffer(new byte[] { 'n' })); assertEquals(Unpooled.wrappedBuffer(new byte[] { 'A', 'B', 'C' }), ch.readInbound()); // Truncated input ch.writeInbound(Unpooled.wrappedBuffer(new byte[] { 'A' })); assertNull(ch.readInbound()); ch.close(); assertNull(ch.readInbound()); }
  • 16. 네티 자체의 테스트 ● 각 트랜스포트의 정확한 동작을 확인하기 위해 모든 트랜스포트 조합과 주요 프로토콜 조합에 대해 교차 테스트 수행 – TCP: NIO x AIO x OIO = 9 – 1 (OIO x OIO) – UDP: NIO x OIO = 4 – 프로토콜 : Echo, SSL, SPDY = 3 * TCP (8) = 24 ● 자체 제공 핸들러의 경우는 EmbeddedChannel 을 이용 ● 기타 – Jenkins – Animal Sniffer: Build fails on violation before packaging – Checkstyle: Build fails on violation before compilation
  • 17. 생각할 거리 ● Dynamic event routing ● Statistical Distributed Performance Analysis on Mesos Cluster ● Management and Monitoring ● Native Transport ● Scalable Community
  • 18.
  • 19.
  • 20. 유용할만한 곳 ● 공식 자료 – 홈페이지 - http://netty.io/ – 4.0 변경 사항 모음 - http://goo.gl/E2BJ2 ● 커뮤니티 자료 – 블로그 모음 - http://goo.gl/2iMKP – 스택오버플로 - http://stackoverflow.com/questions/tagged/netty ● 네티 프로젝트 트위터 계정 – https://twitter.com/netty_project ● 네티 한국어 이용자 모임 – https://groups.google.com/forum/#!forum/netty-ko