개발/Java
Netty란?
하프킴
2021. 5. 14. 15:36
728x90
- Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and streamlines network programming such as TCP and UDP socket server.
2009년 Ryan Dahl은 수천개의 동시 연결을 처리할 수 있는 Apache Http Server의 제한된 성능으로 인해 Node.js를 발명.
JS Engine + Event Loop, I/O를 결합함.
완전 새로운 개념은 아님. 이미 자바에 1.4 NIO가 있었음. Netty는 이를 이용하여 2004년부터 활발하게 개발됨.
넌 블럭킹 IO에 다양한 구현방식이 있음
OS마다 내장 API가 존재
리눅스 : epoll
BSD계열 : kqueue
자바에서는 NIO를 사용할 수 있음.
- Blocking I/O
- IO : 하드드라이브, 네트워크, 데이터베이스와 같은 장치와의 상호작용을 나타냄.
- *일반적으로 CPU에서 발생하지 않는 모든것을 IO라고 한다.
- Blocking : 스레드가 read(), write() 동작을 시키면 스레를 data를 읽을 때 까지 block된다.
- Linux에서 스레드가 차단되면 데이터가 호출자에게 반환될 때 까지 커널에 의해 슬립 상태가 됨.
- JVM에 Runtime Data Area의 스택영역을 점유하게 된다.
- Connection이 증가하면 스레드를 생성하고, 스레드간에 전환하는 것이 번거로워 진다.
- 주어진 시점에서 클라이언트 요청을 기다리는 여러 스레드가 있을 수 있다. 이는 리소스 낭비이다.
- 스레드 객체는 힙 영역에 생성되고, 이는 언젠간 GC의 대상이 되며, STW로 인해 성능이 저하될 수 있다.
- 스레드를 많이 생성해야하고, 스레드 컨텍스트 스위칭이 많이 일어날 수 있다.
- IO : 하드드라이브, 네트워크, 데이터베이스와 같은 장치와의 상호작용을 나타냄.
Non-blocking IO
Blocking IO를 사용하는 APIsms IO작업이 끝날 때 까지 스레드를 Block한다.
fun requestToUrl() {
// call network IO
Http.get("https://ing.com")
// when data is ready call .success() callback function
.success((response) -> print(response.data))
}
이런식으로 구현
대부분의 non-blocking 프레임워크는 계속해서 polls(만약 데이터가 IO로부터 리턴됐는지 체크하는 하는) 루프를 돈다.
이것을 이벤트 루프라고 부른다.
루프를 돌아서 CPU에 부하가 걸린다고 생각할 수도 있다
하지만 대부분의 OS는 커널레벨의 이벤트 루프를 생성하는 API를 제공한다.
Linux : epoll, io_uring
BSD : kqueue
Windows : IOCP
각각의 API는 FDs를