본문 바로가기
728x90

Programming125

[Elasticsearch] 조회 성능 개선 팁 최근에 quadkey를 기반으로 한 poi 조회 API의 응답 속도가 느려져 elasticsearch의 조회 성능을 개선하면서 느낀 몇가지 팁을 공유해볼까 합니다. timeout QueryDsl로 데이터를 조회할 경우 timeout이라는 옵션을 요청에서 보낼 수 있습니다. timeout을 3초로 설정했을 때, 결과를 받는 시간이 3초가 넘어버리면 해당 결과를 받을 수 없게됩니다. 이는 쿼리의 병목현상을 막을 수가 있습니다. Search latency가 느려지는 경우 성능에 영향을 미칠 수 있기 때문입니다. Search Latency 일라스틱 서치의 클러스터에 전송된 요청은 큐에 쌓이게 됩니다. 이 때, 큐에 요청이 쌓여 지연이 발생하는 것을 Latency라고 부릅니다 대기 시간이 길어질 수록 검색 처리 .. 2021. 4. 7.
[리액티브 프로그래밍] 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.
728x90