12.1 Reactor에서의 디버깅 방법 비동기, 선언형 프로그래밍 방식의 Reactor는 디버깅이 쉽지 않음 12.1.1 Debug Mode를 사용한 디버깅 Hooks.onOperatorDebug()를 통해 디버그 모드 활성화 (Example12_1) 체인상에서 에러가 시작된 지점부터 에러 전파 상태를 표시 비용이 많이 드는 동작 스택트레이스 캡처 에러가 발생한 Assembly의 스택트레이스를 원본 스택트레이스 중간에 끼워 넣음 운영 환경에서는 reactor.tools.agent.ReactorDebugAgent 이용 IntelliJ에서는 [Enable Reactor Debug mode]에서 Hooks.onOperatorDebug() 또는 ReactorDebugAgent.init() 중 택1 하여 활성화..
11.1 Context란? 어떠한 상황에서 그 상황을 처리하기 위해 필요한 정보 Reactor에서 Context의 정의Operator 같은 Reactor 구성요소 간에 전파되는 key/value 형태의 저장소 전파 : Downstream에서 Upstream 체인상의 각 Operator가 해당 Context 정보를 동일하게 이용할 수 있음 Reactor의 Context는 Subscriber와 매핑됨 cf. ThreadLocal의 경우 실행 스레드와 매핑됨 즉, 구독이 발생할 때마다 해당 구독과 연결된 하나의 Context가 생김 public static void main(String[] args) throws InterruptedException { Mono .deferContextual(ctx -> Mo..
Reactor Sequence에서 사용되는 스레드를 관리해 주는 역할 10.1 스레드(Thread)의 개념 이해 물리적인 스레드(Pysical Thread) : CPU 코어를 논리적으로 나눈 것 듀얼코어 4 스레드 (작업관리자 [성능]에서 확인 가능) 논리적인 스레드(Logical Thread) : 프로세스 내에서 실행되는 세부 작업의 단위 이론적으로는 제한이 없지만 실제로는 물리적인 스레드의 가용 범위내에서 생성 가능 병렬성(Parallelism) : 물리적인 스레드가 실제로 동시에 실행됨 동시성(Concurrency) : 동시에 실행되는 것처럼 보이지만 실제로는 아님 무수히 많은 논리적인 스레드가 물리적인 스레드를 아주 빠른 속도로 번갈아 가면서 사용 10.2 Scheduler란? 어떤 스레드에서 무..
9.1 Sinks란? Publisher와 Subscriber의 기능을 모두 지닌 Processor의 향상된 기능 제공 Sinks는 Reactor 3.4.0부터 지원 Processor API는 Reactor 3.5.0부터 제거 예정 Signal을 프로그래밍 방식으로 푸시할 수 있는 구조 멀티스레드 방식으로 Signal을 전송해도 스레드 안전성을 보장함 (Example9_2) 9.2 Sinks 종류 및 특징 Sinks.One : 한 건의 데이터를 프로그래밍 방식으로 emit (Example9_4) Mono 방식으로 Subscriber가 데이터를 소비할 수 있도록 함 asMono() 메서드를 사용하여 Mono 객체로 변환 Sinks.Many : 여러 건의 데이터를 프로그래밍 방식으로 emit Flux 방식으로..
8.1 Backpressure란? Publisher가 끊임없이 emit하는 무수히 많은 데이터를 제어하여 데이터 처리에 과부하가 걸리지 않도록 하는 것 8.2 Reactor에서의 Backpressure 처리 방식 데이터 개수 제어 Subscriber가 request() 메서드를 통해 데이터 개수 제어 Backpressure 전략 사용 (Downstream으로 전달할 데이터가 버퍼에 가득 찰 경우) IGNORE 전략 : Backpressure 적용하지 않음 ERROR 전략 : Exception 발생 (Example8_2) DROP 전략 : 버퍼 밖에서 대기하는 먼저 emit된 데이터부터 Drop (Example8_3) LATEST 전략 : 새로운 데이터가 들어오는 시점에 가장 최근의 데이터만 남겨 두고 나..
7.1 Cold와 Hot의 의미 Cold Booting, Hot Deploy, ... Cold : 새로 시작 Hot : 새로 시작하지 않음 7.2 Cold Sequence Subscriber가 구독할 때마다 데이터 흐름이 처음부터 다시 시작되는 Sequence public static void main(String[] args) throws InterruptedException { Flux coldFlux = Flux .fromIterable(Arrays.asList("KOREA", "JAPAN", "CHINESE")) .map(String::toLowerCase); coldFlux.subscribe(country -> log.info("# Subscriber1: {}", country)); System..
6.1 마블 다이어그램(Marble Diagram)이란? 마블 : 구슬 IJ에서 확인 가능 6.2 마블 다이어그램으로 Reactor의 Publisher 이해하기 Mono Mono[1] : 데이터 한 건을 emit하는 경우 public static void main(String[] args) { Mono.just("Hello Reactor") .subscribe(System.out::println); } > Hello Reactor Mono[0] : 데이터를 전달받을 필요는 없지만 작업이 끝났음을 알리고 이에 따른 후처리를 하고 싶을 때 public static void main(String[] args) { Mono .empty() .subscribe( none -> System.out.println("..
5.1 Reactor란? Spring Framework 팀의 주도하에 개발된 리액티브 스트림즈 구현체 Spring Framework 5 버전부터 리액티브 스택에 포함 Spring WebFlux 기반의 리액티브 애플리케이션을 제작하기 위한 핵심 역할 리액티브 프로그래밍을 위한 라이브러리로 Spring WebFlux 프레임워크에 포함된다고 보면 됨 Reactor 공식 사이트 : https://projectreactor.io Reactive Streams Non-Blocking Java's functional API Flux[N] : Refactor의 Publisher 타입 0개부터 N개, 즉 무한대의 데이터를 emit할 수 있음 Mono[0|1] : Refactor의 Publisher 타입 0개 또는 1개의..
- Total
- Today
- Yesterday