반응형

전체 글 68

Netty - EventLoop

NettyNetty는 비동기 이벤트 기반의 네트워크 어플리케이션 프레임워크이다. HTTP 뿐만 아니라 다양한 프로토콜을 지원하며, JavaIO, NIO, selector를 기반으로 적은 리소스로 높은 성능을 보장한다.불필요한 메모리 copy를 최소한으로 동작하고, 유연하며 확장 가능한 이벤트 모델 기반으로 서버와 클라이언트 모두 지원한다.NIOEventLoop이벤트루프는 EventExecutor, TaskQueue, Selector를 포함한다.EventExecutor : task를 실행하는 쓰레드풀TaskQueue : task를 저장하는 queue, eventExecutor가 즉시 task를 수행하지 않고 taskQueue에 넣은 후, 나중에 꺼내서 처리 가능하다.Selector : I/O Multipl..

Java - Reactor_pattern

Reactor patternReactor pattern은 동시에 들어오는 요청을 처리하는 이벤트 핸들링 방식이다.Service handler는 요청을 demultiplexing하여 동기적으로 request handler에 전달한다.Accept, read, write와 같은 이벤트들을 한 곳에 등록하여 관찰하고, 준비된 이벤트를 request handler에게 전달한다.이는 Java NIO의 selector를 이용한 처리와 유사한 방식으로 볼 수 있다.Reactor pattern의 구현Reactor, Selector, Acceptor, EventHandler 구현체로 구성되며, Acceptor는 EventHandler 구현체의 일부이고 accept 이벤트에만 집중한다.EventHandler 구현체는 rea..

Java 2024.05.07

Java NIO - Selector

Java NIO의 문제점은 main스레드에서 accept가 완료되었는지 주기적으로 확인하고, 각각의 스레드에서 read 가능한지 주기적으로 확인해야한다.채널의 상태를 개발자가 수동으로 관리해야하고 코드의 복잡성이 증가한다. main 스레드 하나에서 이벤트를 추적 관리하기 때문에 트래픽이 동시에 많이 생기는 경우 연결 처리가 순차적으로 발생하여 성능이 감소할 수 있다.이러한 동기 non-blocking에서 주로 발생하는 문제점이 busy-wait 문제이다.계속해서 callee 스레드의 작업 결과가 궁금하기 때문에 주기적으로 결과를 확인해야 한다. 이때, loop를 계속해서 돌면서 원하는 자원을 얻을 때까지 확인을 하기 때문에, 지속적인 cpu를 점유하게 되고, cpu의 낭비가 생기는 문제가 발생한다.그래서..

Java 2024.05.05

Java - Direct, Heap Buffer SelectableChannel

DirectBuffer, HeapByteBufferJava IO의 단점 중 커널 버퍼에 직접 접근이 불가능해서 메모리 copy가 발생해 CPU 자원이 소모된다는 단점이 있다.JavaNIO 에서는 이런 단점을 보완한 DirectByteBuffer, HeapByteBuffer를 제공한다. DirectByteBuffer의 특징은 native메모리(off-heap)에 저장하고, 커널 메모리에서 복사를 하지 않으므로 데이터를 읽고 쓰는 속도가 빠르며 비용이 많이 드는 system call을 사용하므로 allocate, deallocate가 느리다는 특징을 가지고 있다.HeapByteBuffer의 특징은 JVM heap 메모리에 저장하고 byte array를 랩핑하고 있다. 커널 메모리에서 복사가 일어나게 되는데..

Java 2024.04.25

Java - NIO Buffer

Java NIO Java 1.4부터 도입된 NIO는 기존의 Java IO의 단점을 보완하기 위해 도입되었다. NIO는 Non-blocking이 아니라 Java New Input/Out의 약자로, 파일과 네트워크 데이터를 읽고 쓰는 API를 제공한다. 이는 기존의 Stream 기반의 입출력 대신 Buffer 기반으로 작동하고, Non-blocking을 지원하여 성능을 향상시켰다. Selector와 Channel이 도입되어 높은 성능이 보장된다. Java NIO 와 Java IO의 비교 Java NIO Java IO 데이터의 흐름 양방향 단방향 종류 Channel InputStream, OutputStream 데이터의 단위 buffer byte 혹은 character blocking 여부 non-blocki..

Java 2024.04.23

Java - OutputStream

Java IO - OutputStream InputStream과 동일하게 Closeable 인터페이스를 구현하고 있고 추가로 Flushable도 같이 구현하고 있다. 명시적으로 close도 가능하고, try-with-resources 사용이 가능하다. write시 바로 전송하지 않고 버퍼에 저장한 다음 일정량의 데이터가 모이면 한번에 전달한다. 만약 일정량의 데이터가 모이기 전에 바로 buffer에 있는 값을 전달하고 다음 로직을 처리해야 한다면 Flushable에서 제공하는 flush 메서드를 사용해서 buffer를 비우고 다음 로직을 수행한 후 원하는 결과를 내보낼 수 있다. import java.io.Closeable; import java.io.Flushable; import java.io.IOE..

Java 2024.04.23

Java - InputStream

Java IO - InputStream Java IO는 동기 Blocking으로 동작한다. Java 1.0 에서 처음 도입 되었으며 파일과 네트워크에 데이터를 읽고 쓸 수 있는 API들을 제공한다. byte 단위로 읽고 쓸 수 있는 stream이다. (InputStream과 OutputStream) InputStream InputStream은 Closable을 구현한다. 명시적으로 close하거나 try-with-resource 사용이 가능하다. read는 stream으로 데이터를 읽고, 읽은 값을 반환하고 -1 이라면 끝에 도달했다는 것을 의미하며, close는 stream을 닫고 더 이상 데이터를 읽지 않는다. import java.io.Closeable; import java.io.IOExcepti..

Java 2024.04.22

Project reactor

Project reactor Reactive Streams는 publisher, subscriber, subscription 개념을 활용하여 메시지를 비동기적으로 교환하고, 이를 이벤트로 전달한다. 또한 backpressure를 통해 필요한 만큼의 요청을 처리할 수 있다. Project Reactor는 Reactive Streams를 기반으로 한 라이브러리다. Project Reactor 외에도 RxJava와 Mutiny 같은 라이브러리가 있고, WebFlux의 기본 라이브러리는 Project Reactor다. Pivotal에서 개발한 Project Reactor는 Spring Reactor에서 사용되며, Mono와 Flux publisher를 제공한다. SimpleSubscriber 예제에 사용할 Su..

Java - CompletableFuture class

CompletableFuture CompletableFuture 클래스는 Future 인터페이스가 가진 한계점을 보완하기 위해 CompletionStage 인터페이스와 합쳐진 형태의 클래스로, Java 8부터 제공되는 클래스이다. Future와 다르게 외부에서 작업을 완료시킬 수 있고, 콜백 등록 및 Future 조합 등...이 가능하다. import java.util.concurrent.CompletionStage; import java.util.function.Supplier; public class CompletableFuture implements Future, CompletionStage { public static CompletableFuture supplyAsync(Supplier suppl..

Java 2024.04.21

Java - CompletionStage then* vs then*Async

CompletionStage에서 Async가 붙어있는 함수와 붙지 않은 함수의 차이는 무엇인가? CompletionStage의 제공되는 함수들에 같은 이름인데 Async가 붙어있는 함수가 있고 붙어있지 않은 함수들이 있는데 무슨 차이점이 있을까? 반환받은 Future가 Done인 경우 import com.example.webfluxstudy.basicReactiveProgramming.completableFuture.completionStage.thenAsyncSufix.Helper; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CompletionStage; @Slf4j public class CompletionStageThenAccept..

Java 2024.04.19
반응형