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 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..

Java NIO 와 동기 non-blocking + CPU 자원

Java 2023. 11. 15. 23:37

Java NIO (new IO) 를 이용한 Server - Client 의 동작을 동기 / 비동기, blocking / non-blocking 관점에서 알아보겠다. 참고로 java.nio 패키지에 존재하는 selector 는 다음 포스팅에서 다루겠다. Java IO 와 다르게 Java NIO 는 non-blocking 하게 동작할 수 있는 옵션이 존재한다. -> ServerSocketChannel::configureBlocking 메서드를 호출해주고 파라미터 값으로 false 를 전달한다. 해당 옵션을 사용하면, accept 와 read 에서 blocking 되지 않고 바로 넘어간다. 각각 null, 0 을 리턴해버린다. accept 의 예시 코드를 보며 계속 하겠다. 즉, non-blocking mod..

Article Thumbnail