본문 바로가기
728x90

전체 글125

[리액티브 프로그래밍] WebFlux의 동시성 Thread per request 모델 스레드 하나당 하나의 요청을 처리 멀티 코어 환경에서 여러개의 스레드가 여러개의 요청을 처리할 수 있다 단점 하지만 하나의 요청(스레드)이 한시간 짜리 IO를 만나게 되면 여전히 block된다. 자바에서 사용하는 native 스레드는 context switching(스레드간 스위칭)할 때 비용이 매우 크다 요청이 많아지게되면 thread per model을 효율적이지 않다. Reactive Programming 모델 data flow(데이터 흐름)와 propagation(전파)를 사용한다 완전한 non blocking 환경을 보장한다 기존의 방법과 다른 스레드 사용법을 이용한다 데이터베이스에게 read 요청을 보내면, 데이터를 가져오는 동안 스레드를 block하지 .. 2021. 3. 25.
[리액티브 프로그래밍] Reactor 3 살펴보기 Publisher 생성 @DisplayName("Flux와 Mono를 생성한다") @Test void create() { Flux flux1 = Flux.just("foo", "bar", "foobar"); Flux flux2 = Flux.fromIterable(Arrays.asList("foo", "bar", "foobar")); Flux flux3 = Flux.range(5, 3); // 5, 6, 7 Mono mono1 = Mono.empty(); // empty여도 타입을 가진다 Mono mono2 = Mono.just("foo"); } Subscriber를 Subscribe /** * lambda interface (consumer)를 사용하여 subscriber를 subscribe한다 */ @.. 2021. 3. 23.
[Java] 스레드 monitor란? 자바에서 모든 객체는 monitor를 가지고 있다. monitor는 여러 스레드가 객체로 동시에 객체로 접근하는 것을 막는다. 여기서 모든 객체가 중요하다. heap 영역에 있는 객체는 모든 스레드에서 공유 가능하기 때문이다. 스레드가 monitor를 가지면, monitor를 가지는 객체에 lock을 걸 수 있다. 그렇게 되면 다른 thread들이 해당 객체에 접근할 수가 없게된다. 아래 코드를 살펴보자 class Hello implement Runnable { @Override public void run() { String hello = "hello"; synchronized (hello) { System.out.println(hello); } } } monitor를 가질 수 있는 것은 synchro.. 2021. 3. 20.
[리액티브 프로그래밍] Publisher, Subscriber 그리고 Subscription - 2 Publisher, Operator, Subscriber의 용어가 익숙하지 않다면 이전 글인 [리액티브 프로그래밍] Publisher와 Subscriber 을 참고하시기 바랍니다. Publisher(생산자)가 Subscriber(소비자)를 subscribe(등록)한다. 동시에 Subscriber(소비자)가 Subscription(전달자)을 onSubscribe(등록)한다 Subscriber(소비자)는 필요할 때 Subscribe(전달자).request(요청)을 통해 Publisher에게 데이터를 요청한다. Publisher(생산자)는 요청을 받으면 생성한 데이터를 보낸다 Subscriber는 onNext로 데이터를 받는다. 모든 요청이 성공적으로 완료되면 onComplete을 호출하고 흐름을 종료한다. .. 2021. 3. 18.
[리액티브 프로그래밍] Publisher와 Subscriber - 1 Publisher 생산자 데이터를 생산 생산된 데이터를 소비할 소비자(Subscriber)가 등록(subscribe)될 때까지 아무일도 일어나지 않는다. (매우중요) Operator 체인 연산자 연산자(Operator)는 새로운 생산자(Publisher)를 반환한다 Subscriber 소비자 데이터를 소비 데이터 가지고 무엇을 할 건지 결정 예제 Flux flux = Flux.range(1, 10); flux.subscribe(number -> System.out.println(number)); 예제를 설명하기 앞서 먼저 용어를 정리하면 다음과 같다. Publisher = Flux = 생산자 = 데이터를 생산 Operator = range = 연산자 = Publisher를 반환 Subscriber = S.. 2021. 3. 17.
[Elasticsearch] ElasticsearchOperations로 요청 보내기 ElasticsearchOperations Query를 받아서 Elasticsearch에 요청을 보내는 역할을 합니다 High Level Rest Client를 Spring Data Elasticsearch의 ElasticsearchOperations로 감싸 추가 기능을 제공합니다. High Level Rest Client는 Elasticsearch 내부적으로 Low Level Rest Client를 사용하고 있습니다 그래서 ElasticsearchOperations로, High Level Rest Client 둘 중 하나를 골라서 사용해도 무방합니다. 아래 Operations를 결합합니다 DocumentOperations : id를 기반으로 entity를 저장, 업데이트, 조회 SearchOperati.. 2021. 3. 16.
728x90