Netty 2

Spring Reactive Stack/Netty 2024. 1. 21. 19:43

Netty Channel 의 pipline 으로 수행되는 ChannelHandler 가 제공하는 메서드를 하나씩 정리해보겠다. ChannelInboundHandler inbound I/O 이벤트를 처리하기 위한 ChannelHandler 이다. inbound I/O 이벤트가 발생되면 각 이벤트에 맞는 아래 메서드를 호출 해준다. void channelRegistered(ChannelHandlerContext ctx) throws Exception; Netty Channel 이 EventLoop 에 등록되는 경우 호출된다. - Netty ServerSocketChannel 의 경우 서버를 시작하며 EventLoop 에 최초 1회 등록할 것이므로 그 때 1회 호출 될 것이다. - Netty SocketCha..

Netty 1

Spring Reactive Stack/Netty 2024. 1. 17. 01:11

Spring reactive stack 에서 사용되는.. Spring webflux 는 reactor 와 netty 를 의존한다. 뿐만 아니라, Spring data redis 도 netty 를 의존한다. 이번 포스팅에서는 netty 를 알아보겠다. Netty 소개 Netty 공식 홈페이지에 따르면 "Netty is asynchronous event-driven network application framework" 라 소개한다. (Server & Client) Netty 는.. HTTP, SMTP, FTP 등의 protocol 뿐만 아니라 다양한 protocol 을 지원한다. 또한, 불필요한 memory copy 를 최소화 하며 Java IO, NIO, selector 기반으로 적은 리소스로 높은 성능..

Article Thumbnail
Spring Data, Object Mapping

Spring Reactive Stack/DB, Cache 연동 2024. 1. 7. 18:13

R2dbc (Reactive Relational Database Connectivity), MongoDB 등에서 사용하는 Spring Data 의 기본적인 객체 매핑의 방법을 알아보겠다. 다양한 data store 에서 공통적으로 사용하는 방법이지만, 구현체 별로 다를 수 있다. 참고로.. 1. JPA(Jdbc) 는 Reactive Stack 에서 사용이 불가능 하여 R2dbc 가 나온 것이므로 헷갈리지 말 것. 2. JPA 는 앞으로 소개할 Spring Data 의 기본 Object mapping 과 좀 다르게 사용할 것을 권장 하므로 엮어서 생각하지 말 것. Object Mapping 은 크게 두 단계로 이루어진다. 1. Instance creation (Object creation) 2. Insta..

Proactor pattern

Spring Reactive Stack/Netty 2023. 11. 20. 01:27

Reactor pattern 에 이어서 Proactor pattern 을 알아보겠다. 두 패턴을 가르켜 Event handling pattern 이라 부르기도 한다. Proactor 패턴 Reactor 패턴에서는 단일 스레드로 IO 이벤트를 처리하였다. 단일 스레드가 커널에 epoll 을 활용하여 IO 작업의 준비 완료 상태를 주기적으로 확인하였는데.. (즉, Reactor, Selector 가 병목 지점인 것) Proactor 패턴에서는 AIO 로 동작하므로 커널이 AIO 로 IO 작업의 준비 완료 상태를 알려 주기 때문에 busy-wait 현상을 없앨 수 있다. 사용 기술 Proactor 패턴은 Java AIO를 사용한다. 특징 Java AIO 를 사용하기 때문에 비동기 non-blocking 으로 ..

Article Thumbnail
Reactor pattern

Spring Reactive Stack/Netty 2023. 11. 19. 03:36

이번 포스팅에서는 Reactor pattern 에 대해 알아보겠다. reactor pattern 의 목표 한정된 스레드로 동시에 들어오는 요청을 효율적으로 처리 가능 Reactor 패턴 대표 사용 기술 Java NIO, Selector, epoll 특징 Selector 기반의 Java NIO 를 사용하기 때문에 동기 non-blocking 으로 동작한다. (IO 관점) 작동 방식 accept, read, write 등의 이벤트(준비 완료)들을 한 곳(Selector)에 등록하여 모니터링 -> Selector 사용, Multiplexing 준비 완료 이벤트(처리될 준비가 됨)일 경우에는 request handler 에게 전달한다. -> Demultiplexing 대표 컴포넌트 Reactor 별도의 스레드에..

Article Thumbnail
Java AIO 와 비동기 non-blocking

Java 2023. 11. 19. 02:49

Java AIO (NIO2) 에 대해 알아보겠다. 참고 라이브러리가 따로 있는건 아니고.. java.nio 를 공유하며.. 대신 사용되는 클래스이름이.. 앞에 "Asynchronous" 가 붙는다. 예시 ) AsynchronousServerSocketChannel 이전 상황 Java NIO, Selector, epoll(커널) 을 쓰게되면... 커널에서 애플리케이션으로 accept, read 등의 준비 완료 이벤트를 전달해주지 않고 애플리케이션에서 커널로 직접 주기적 확인이 필요했다. 즉.. busy-wait 가 발생하고 있는 것이다. (동기 non-blocking) Java AIO 에서는 이를 해결한다. Java AIO 동작 커널의 역할 I/O 작업이 커널에 전달되고, 커널은 이 작업을 비동기적으로 처..

Java NIO 의 Selector 와 epoll

Java 2023. 11. 19. 00:34

이전 포스팅에서 selector 를 알아봤는데... 결국 selector 는... 여러 이벤트를 하나의 스레드로 한꺼번에 확인할 수 있는 객체였다. (IO Multiplexing) 그러면 다시 busy-wait 관점에서 생각하자면.. selector 가 도입 되면서.. busy-wait 가 사라졌을까.. 아니다.. 사용자 코드에서는 사라졌지만, selector 가 사용자를 대신해서 준비 완료되었는지.. 확인하고 있는 것이다. 혹은... selector 로 좀더 편하게 준비 완료되었는지 확인하는 것이다.. 좀더 설명하자면.. selector 사용 전에는 accept, read (IO 호출)를 직접 호출(사용자 코드가 Caller 입장)하였지만.. 이제는 사용자 코드가 Callee 느낌으로.. selecto..

Article Thumbnail
Java NIO 의 Selector

Java 2023. 11. 17. 22:51

이전 포스팅에서 Java NIO 를 사용할 때 Java NIO 가 동기 non-blocking 방식이라 busy-wait 이 발생하였다. busy-wait 에 대해 잠시 복습하고 진행하겠다. busy-wait 은 동기 non-blocking 구조에서 자주 보이는 현상으로.. non-blocking 이라 caller 는 callee 작업으로 부터 자유로운데 동기 방식이라 callee 의 작업이 끝났는지(결과를 받을 수 있는지) 주기적 확인이 필요한 상황이다. 그래서.. 주기를 늘리면 실시간성이 떨어지게 되고.. 주기를 좁히면 그만큼 blocking 과 다를 바가 없고 CPU 자원이 낭비 되는 것이다. 문제는 서버에서는 여러 이벤트를 동시에 다루고 여러 요청을 다룰 수 있어야한다. 위와 같은 방식에서는 ac..