토이프로젝트/상품주문

[상품 주문 1편] 개요 (Webflux, 코틀린, Redis, 분산락)

무대포 개발자 2023. 4. 5. 21:59
728x90
반응형

source 는 Github 에 있습니다.

목차는 상품 주문 에 있습니다.

[상품 주문 1편] 개요 (Webflux, 코틀린, Redis, 분산락)

Webflux, 코틀린, Redis, 분산락 공부를 위해 작성했습니다.

상품 주문 기능

  • 상품 주문 시, 동시성을 보장해줘야 합니다. (DB 데이터가 꼬이지 않아야 합니다)
  • 상품 주문 시, 재고 관리가 되야 합니다. (동시 요청에 재고 데이터가 꼬이면 안됩니다)

상품 주문 시나리오

  • 클라이언트에서 상품 주문 API 를 호출합니다. (동시성을 보장해줘야 합니다.)

    • 간단하게 입력 파라미터는 상품 ID, User Id, 구매수량을 입력받도록 진행했습니다.
  • 상품 주문 API 가 들어오면 Redis 를 통해 분산락을 잡고 내부에서 DB 처리를 합니다.

    • 분산락을 잡을 때는 상품 ID 로 잡으며, DB 작업이 끝날 때까지 분산락을 유지합니다.
    • 락을 잡고 진행한다면 재고 관리 및 동시성 보장이 가능합니다.

시스템 구성도

system architecure

체크 해야할 부분

  • Client 호출 부터 Redis, DB 처리까지 비동기적으로 처리가 가능한지?
  • 비동기적으로 처리되는 것을 어떻게 검증해야할지?
    • 지금 생각해둔 방법은 실행할 때, 수행되는 스레드를 체크하는 방법인데 좀 더 고민을 해보겠습니다.
  • 동시 요청 시, 재고 관리가 정상 처리돼는지?

기타 (용어 정리)

Webflux - publisher, subscriber, Flux, Mono

  • WebFlux는 Reactive Web 프로그래밍을 지원하는 모듈입니다. Reactive Web 프로그래밍은 논블로킹 및 비동기 방식의 웹 개발 방식을 의미합니다.
Publisher
  • 데이터를 발행하는 객체입니다. Flux나 Mono 가 Publisher 역할을 수행합니다.
Subscriber
  • 데이터를 소비하는 객체입니다. Subscriber는 Publisher가 발행하는 데이터를 받아서 처리합니다.
Flux
  • Flux 는 0개 이상 데이터를 포함하는 스트림을 나타내는 타입입니다.
Mono
  • Mono 는 하나의 요소를 방출하는 타입입니다. 단일 값만을 전달할 수 있습니다.
Stream
  • 스트림은 데이터를 시간적 순서에 따라 연속적으로 처리하는 것을 의미합니다. Webflux 에서 스트림은 Publisher 를 통해 생성된 데이터를 Subscriber 가 소비하는 그 사이의 연결로 구성됩니다. 스트림은 메모리에 모든 데이터를 한꺼번에 로드하지 않고, 필요할 때마다 데이터를 가져와 처리합니다. 또한, 스트림은 비동기적으로 처리가 가능하며, 멀티스레드 환경에서 효과적으로 동작합니다.