본문 바로가기

서버/Kotlin (Spring Boot)

Spring WebFlux를 쓰려는데, Netty.. EventLoop?

반응형

Spring WebFlux를 써볼ㄲ…

Spring Webflux 를 써본 적이 없어서 간단하게 한 번 사용해보려고 프로젝트를 열었다.

Spring Initializer가 Spring Reactive Web 템플릿을 선택하면 알아서 생성해주므로, 바로 생성하고 어플리케이션을 실행해본다. 기존 Spring MVC와 다른 점은 뭔가 로그가 적고 컨테이너가 tomcat이 아닌 netty로 설정되어 있다는 점이 눈에 띈다.

 

netty..?

이벤트 기반의 비동기 I/O 모델을 제공한다.

 

Chapter 1. Netty—asynchronous and event-driven · Netty in Action

Networking in Java · Introducing Netty · Netty’s core components

livebook.manning.com

익숙한 키워드인 event loop 나왔다.

nodejs 가 장점으로 내세우는 이벤트 기반 비동기 I/O처리는 event loop 를 통해서 이루어진다.

예전에 nodejs를 공부할 때,

event loop 라는 게 있어서 I/O 처리를 비동기로 해줄 수 있다.
libuv라는 라이브러리에서 event loop 구현체를 제공해서 그걸 받아서 쓴다.

 

정도로 알고 있었는데,

Spring Webflux가 MVC와 뭐가 다른가에 대한 의문에서 출발해서 여기까지 왔다.

이벤트 루프는 사실 프로그래밍 모델일 뿐이고, 이 모델이 비동기로 I/O를 처리하기에 적합해서 많은 진영에서 이 이벤트 루프 모델을 채택해서 더 많은 작업을 동시에 처리할 수 있는 어플리케이션을 만들기 위해서 노력해온 듯 하다.

 

libuv?

nodejs 의 현재 메이저 버전이 20까지 올라왔는데, nodejs는 약 14, 5년 전에 릴리즈 당시부터 이벤트 루프를 통한 비동기 I/O 처리를 지원했었다.

https://github.com/nodejs/node/tree/v0.0.1

 

GitHub - nodejs/node: Node.js JavaScript runtime :sparkles::turtle::rocket::sparkles:

Node.js JavaScript runtime :sparkles::turtle::rocket::sparkles: - GitHub - nodejs/node: Node.js JavaScript runtime :sparkles::turtle::rocket::sparkles:

github.com

 

 

앞서 이야기한 것 처럼 이벤트 루프는 모델에 불과하기에 당시에도 이미 이벤트 루프를 구현해서 제공하는 라이브러리가 존재했고 nodejs의 초기버전 (v0.0.1 ~ v0.4.12) 까지는 libev 라는 C 기반의 event loop 구현체 라이브러리를 사용했었다.

nodejs v0.5.0 부터는 libuv로 라이브러리를 교체했는데, libuv는 사실 nodejs를 위해서 작성된 라이브러리다.

GitHub - libuv/libuv at node-v0.5.0

 

GitHub - libuv/libuv: Cross-platform asynchronous I/O

Cross-platform asynchronous I/O. Contribute to libuv/libuv development by creating an account on GitHub.

github.com

libuv? netty?


결국 둘 다 비동기 I/O 처리를 도와준다.

libuv는 windows, unix 위에서 모두 실행 가능한 multiplatform 비동기 I/O 라이브러리로 내세우고 있고,

netty는 server & client application의 성능 향상을 도와주는 network layer framework로써 내세우고 있다.

이러한 개념은 거슬러 올라가면 상당히 오래된 것을 알 수 있다.

 

1. Linux에는 파일과 매핑되는 fd (파일 디스크립터)를 검사하기 위해 select 라는 명령어가 존재한다. 이는 비동기 I/O는 아닌 동기 I/O 였다.

2. 2000년 초 (아마) linux에 비동기로 I/O 처리를 지원하는 epoll 이라는 기능이 추가된다.

3. Windows에서는 IOCP라는 개념이 있는데, 아마 비슷한 시기인 듯 하다.

  • 참고링크 (2005)

Win32 IOCP를 따라잡을 Unix, Linux, *BSD계열의 방법은? | KLDP

 

Win32 IOCP를 따라잡을 Unix, Linux, *BSD계열의 방법은? | KLDP

정말 평소엔 낭비라 생각했던 Windows의 이벤트방식과 쓰레드의 결합이란게 엄청난 효율을 발휘하는 것을 보고 놀랐습니다. 이렇듯 국내 대부분이 아니라 거의 모든 온라인 게임회사의 서버는 Win

kldp.org

 

 

쭉 거슬러 올라가보면서 느낀 점은, 서버 성격 상 동시에 많은 트래픽을 처리해야하는 게임과 같은 도메인에서는 이러한 개념이 일찍이 자리잡아 있었고 (그리고 그 시기에는 C/C++로 개발하고..) 일반적인 웹 서비스를 지원하는 서버에서는 상대적으로 늦게 생태계에 안착해서 지원이 되기 시작한게 아닐까 싶다.

그렇다고 하기엔 상당히 오래되기도 했지만.. (nodejs, netty 모두 최소 15년 이상)

반응형

'서버 > Kotlin (Spring Boot)' 카테고리의 다른 글

동시성 문제  (0) 2023.07.07