빗썸 테크 아카데미 (BE 심화 과정) - 2일차

donchanee·2022년 4월 13일
0

EDA를 설계할 때 고려할 점

낮은 결합도와 종속성 제거가 중요하다.

EDA를 고려한 이유

시스템 복잡도가 높아지며 요구사항이 변했는데, 이전의 거대한 앱에 모든 기능을 넣어두는 것에서 현재 도메인별로 기능을 분리하기 위하여 나온 것이 MSA(Micro Service Architecture)이고, 도메인간의 통신을 효율적으로 할 수 있는 것이 EDA를 고려한 이유이다.

  • 응답이 잘되고, 탄력적 유연하며 메세지 기반으로 동작하는 시스템이 필요 => Reactive System

Reactive System

  • 각자의 역할을 가지고 동작하자
  • 네 가지 요구사항이 존재함 (응답성, 탄력성, 유연성, 메세지 기반)
  • 요청자가 요청을 했을 경우, 어떤 응답이라도 해야하는 것이 응답성
  • 탄력성 유연성은 실패했을 때 자가복구 or 사용량에 대해 유연한 대응을 할 수 있는 것
  • 요청을 보낸 사람과 받는 사람이 누군지 신경쓸 필요가 없는 것

Reactive Programming

  • 데이터는 변화하고, 변화된 상황을 지속적으로 유지하며 동작하는 프로그래밍 패러다임
  • 데이터 스트림을 통해, 관심이 있는 데이터만 처리하는 것
  • 함수형 프로그래밍을 사용하게 됨

Marble Diagram

  • reactivex.io 에 가면 참고자료가 많다

  • 이런 이미지들을 마블 다이어그램이라고 표현함 (출처 : reactivex.io)

  • 마블 다이어그램은 항상 왼쪽에서 오른쪽으로 진행된다.

  • 타임라인이나 스레드 라고 부를 수 있다.

  • 스트림의 변화과정을 보여주는 다이어그램이다.

Blocking과 Nonblocking의 차이

비동기 vs 동기 / 블로킹 vs 넌블로킹

  • 이 두 개념의 차이도 있는데, 비동기와 동기는 시점에 관한 것이고 블로킹 논블로킹은 스레드가 멈추는가에 관한 것이다.

  • 블로킹 시에 스레드는 종료까지 무한으로 기다리고, 넌블로킹 시에는 불러서 실행시키기만 하고 종료까지 기다리지 않는다.

  • 비동기와 동기는 부른 쪽에서 작업 완료여부를 확인하는지 안하는지의 차이 / 블로킹 넌블로킹은 호출하는 시점에 제어권을 넘겨주는지의 차이

  • 고로, 동기 & Blocking / 비동기 & Nonblocking 등과 같은 식으로 조합해서 사용가능 -> 비동기 & Blocking 쓸 이유 없음

  • 생각을 해봐도, 실제로 비동기를 사용하는데 Blocking을 쓴다? 굳이..?

  • EDA에서는 비동기 & Nonblocking을 많이 사용한다.

Reactive Stream

  • 리액티브 스트림은 인터페이스와 같은 것이다
  • 리액티브 프로그래밍을 하기 위해선 인터페이스 명세를 구현해라!

Nonblocking Backpressure을 이용한 비동기 스트림 처리의 표준이라는 말이 있는데, Backpressure가 뭘까?

  • Backpressure의 사전적 의미는 다음과 같다.

Resistance or force opposing the desired flow of data through software.

이는 인풋 데이터 대비 아웃풋 데이터가 원활하지 못한 것을 의미한다고 하고, 대부분 컴퓨팅 스피드 때문에 출력속도가 입력속도보다 느릴 때 발생한다고 한다.

https://www.baeldung.com/spring-webflux-backpressure

위 웹사이트에 굉장히 좋은 설명이 있다.

  • 스프링에선 Reactor라는 인터페이스 구현체로 리액티브 스트림을 사용하고 있다.

Reactive stream 인터페이스에 대해

그렇다면, 이 인터페이스는 어떤 것들이 있을까?

  • Processor - 연산을 하는 연산자
  • Publisher - 데이터를 스트림으로 퍼블리싱
  • Subscriber - onNext, onError 등으로 스트림의 데이터를 Pick
  • Subscription - 어떤 이벤트를 구독할지 정의하는 기능

이렇게 4가지가 있다

  • 리액터는 리액티브 스트림을 구현한 구현체
  • 리액터의 코어 피쳐
    • Mono
    • Flux
    • Schedulers
    • Errors
    • Processors

Sequence

  • 시퀀스는 스트림과 비슷한 개념이다
  • 변화 가능한 데이터의 흐름이 시퀀스
  • 시퀀스가 발생될 때마다 Next가 발생하고, 4가지의 onNext, onError, onSubscribe, onComplete가 시퀀스 데이터를 가져다 씀

Flux

  • flux는 쉽게 리스트라고 생각해보자
  • 0개부터 N개 까지의 아이템을 가질 수 있는데, 마블 다이어그램에서 플럭스가 흘러가며 오퍼레이터에서 플럭스를 처리하고, 또 다른 플럭스로 새로운 데이터 스트림이 만들어짐

Mono

  • Mono는 0또는 1개만 가지게 되는 데이터 시퀀스이다.
  • 리액티브 스트림의 Publisher 구현체이고, 0개를 가지는지 1개를 가지는지 까보기 전까지 모른다.
  • 모노는 하나의 아이템을 뱉고나면 바로 complete or error이다. (1개밖에 없기 때문)

Flux와 Mono를 어떻게 만드냐?

  • 리액티브 스트림의 Processor의 구현체인 리액터 Processors에 생성 Operations를 통해 만듬

스케쥴러

  • 리액터는 비동기 실행을 강제하지 않는다. 스레드를 분리해서 사용할 필요가 있을 수 있는데, 이 때 넌블로킹 비동기지만 스레드 하나에서 동작하고, 만약 블락해야할 필요성이 있을 때 스레드 하나인데 블락하면 모든게 멈추니까 스레드를 지정하여 분리하고 블락하여 실행할 수 있는 기능이 있다.
  • 스레드를 분리시켜주기 위하여 publishOn, subscribeOn을 사용함

오퍼레이션

  • 변환은 한 시퀀스를 다른 시퀀스로 바꿔주는 역할
  • 필터링 / 결합 / 유틸리티 / 조건 / 집계 등 다양한 오퍼레이션이 있음
  • 가장 많이 쓰이는 것 : 플랫맵, 맵, 그룹바이

에러 처리

  • onErrorResume() -> try catch문과 비슷하지만, 구문을 작성할 수 없고 Exception 이름만 작성가능
  • 테스터는 stepVerifier를 사용

2022.04.12 Daily 회고 (혹은 TIL, TIW 등등)

오늘 한 일
- EDA 설계 시 고려사항 복습
- Reactive System
- Blocking / Non-Blocking
- 마블 다이어그램
- 리액터 (시퀀스, 모노, 플럭스, 스케쥴러, 에러, 프로세서)
- 오퍼레이션

느낀 점
- Java의 스트림과 유사한, 함수형 프로그래밍 방식으로 구현된 시스템에 대한 흥미를 느꼈다.
- 다만, subscribeOn, publishOn 등 개념이 실제로 와닿지 않았다. 실제 코드를 보고 이해해야 할듯하다.
- 다양한 오퍼레이션이 파이썬에서 사용되는 개념들 (reduce, map)과 유사해서 조금 더 수월하게 이해할 수 있었다.

현재 나의 상태
- 복습을 해서 TIL 작성을 하고, 내일 강의전까지 RxJava 및 리액터에 대해 사전학습을 하고 가야겠다.

0개의 댓글