Netty를 통해 JVM 옵션을 여러가지 설정 할 수 있지만 핵심이라고 생각하는 4가지만 정리하였다.



1) 메모리 leak 검출


java -Dio.netty.leakDetection.level=advanced ...


 DISABLED

  메모리 릭 감지를 비활성화

 SIMPLE

  디폴트 설정이며 버퍼의 1%의 누출이 있는지 나타낸다.

 ADVANCED

  누출된 버퍼의 액세스 위치를 나타낸다.

 PARANOID

  모든 단일 버퍼라는 점을 제외하면 advanced와 동일. 

  leak 검출 시 빌드가 실패 될 수 있다.







2)  DirectBuffer 선호 여부 


java -Dio.netty.noPreferDirect=true ...


noPreferDirect 옵션은 netty는 ByteBufAllocator.buffer(..) 메소드가 호출 될 때, direct buffer는 선호되지 않는다고 개발자에게 알려준다. 그렇다고 해서 . ByteBufAllocator.directBuffer(...)가 직접적으로 directBuffer를 호출할 때 Direct Buffer가 사용되지 않는 것은 아니다. 여전히 사용 중이다.






3) ByteBuf allocator의 풀링 타입


java -Dio.netty.allocator.type=unpooled ...


풀링 여부에는 pooled / unpooled 가 존재한다. 여기서 말하는 풀은 DBCP의 Connection Pool  혹은 Thread Excutor의 Thread Pool과 같은 맥락이다.


즉, ByteBuf의 레퍼런스 카운트와 같은 자원관리를 Pool이 관리할 것이냐 아니면 unpooled 함으로 써 ByteBufAllocator에서 직접 얻어 올 것이냐로 나뉠 수 있다.






4) sun.misc.Unsafe의 사용을 중지하도록 허용


java -Dio.netty.tryUnsafe=false ...


Java 9 이상에서 sun.misc.unsafe 기능이 활성화 됨에 따라 NETTY에서 WARN 및 ERROR를 발생할 만한 요소가 있는데, unsafe 옵션을 비활성화 함으로써 사용을 중지 할 수 있다.


https://github.com/netty/netty/issues/272













Netty Framework


네티는 전 세계에서 많은 개발자가 사용하는 범용 자바 네트워크 애플리케이션 프레임워크입니다.


다양한 오픈소스 프레임워크 내부에서 사용되고 있으며, 카카오/라인/애플/트위터 등 서비스 제공 업체에서도 사용됩니다.


네티는 Non-block 비동기 처리가 가능하기에 고성능으로 시스템을 유지할 수 있습니다.


또한, 상당 부분 프로그래머의 귀찮은 작업을 네티가 알아서 처리해줍니다.. ( 멀티 쓰레드 처리와 같은..)


훌륭하게도, 최소 10만 이상의 클라이언트의 접속이 가능합니다. 


Netty의 구조와 주요특징을 정확하게 알고 사용법을 익힌다면 , 효과적으로 네티 프레임워크를 사용할 수 있을 것입니다.




https://netty.io/


네티 공식 사이트에서 네티를 다음과 같이 정의하고 있습니다.



Netty는 비동기 이벤트 기반 네트워크 응용 프로그램 프레임 워크입니다.

유지 보수가 가능한 고성능 프로토콜 서버 및 클라이언트를 신속하게 개발할 수 있습니다.


Netty는 프로토콜 서버 및 클라이언트와 같은 네트워크 응용 프로그램을 빠르고 쉽게 개발할 수있는 NIO 클라이언트 서버 프레임 워크입니다.

 TCP 및 UDP 소켓 서버와 같은 네트워크 프로그래밍을 크게 간소화하고 간소화합니다.








주요 특징



네티 공식 홈페이지에선, 네티의 주요 특징을 첫줄에 정의하고 있습니다.

1. 비동기 이고 , 2. block&non-block 이 가능한, 3. 이벤트 기반 네트워크 프레임워크이다.





(1) 동기 / 비동기 처리 

- 동기: 특정 서비스를 호출하면 처리가 완료될 때까지 기다렸다가 결과를 받는 방식

-  비동기: 서비스를 호출하여 즉시 응답을 받고, 다른 작업을 하다가 처리가 완료되었는지 확인하여 결과를 받는 방식. NettryReactor 패턴 사용하고 있습니다.



(2)블로킹/논블로킹 소켓

블로킹 : read, write, accept 등의 메서드가 호출되면 완료될 때까지 쓰레드가 멈춤

- 논블로킹: 하나의 스레드로 여러 클라이언트 대응 가능




(3)이벤트 기반 프로그래밍

- 네트워크 이벤트의 주체는 소켓

- 데이터를 소켓에 전달하기 위해 데이터 핸들러 이용

- 로직 분리, 코드 재사용성 증가, 에러 처리 부담 완화


이벤트의 예) 연결 요청 , 데이터 전송, 데이터 수신







=> 다음과 같은 3가지 특징과 구조를 생각하며 , 네티를 사용한다면 조금 더 구조적으로 혹은 단계적으로 손쉽게 접근이 가능 할 것 같습니다.




참고

- https://netty.io/

- 자바 네트워크 소녀 Netty 

















+ Recent posts