[async] 아키텍처 및 DB 설계

maxxyoung·2025년 2월 18일

Async API

목록 보기
2/5

아키텍처

  • 유저는 Kafka Producer Server에 가격 비교를 요청한다.
    • 만약 요청한 상품의 가격 비교 데이터가 캐시에 hit하면 즉시 반환하고, Kafka로 요청하지 않는다.
    • 요청 상품의 가격 비교 데이터가 캐시 miss라면 Kafka로 상품 가격 데이터를 요청한다.
  • 비동기 방식으로 요청을 처리하기 위해 Kafka를 활용한다.
  • Kafka Producer Server는 가격 비교 요청을 Kafka Broker에 전송한다.
  • Kafka Consumer Server에서 제휴사 API를 호출하여 가격 데이터를 가져온다.
  • 코루틴을 사용하여 제휴사와의 통신을 비동기 처리함으로써, 스레드 리소스를 효율적으로 사용한다.
  • 제휴사로부터 받은 데이터를 RDB에 저장하고, Redis 캐시에 반영한다.
    이후 동일한 요청이 들어오면 캐시에서 빠르게 응답할 수 있도록 최적화한다.

API 설계

총 5가지의 API

  • 가격비교 요청 호출 API
  • 가격비교 제휴사 응답 API
  • 제휴사 저장 API
  • 상품 저장 API
  • 가격비교 사이트 저장 API

DB 테이블

RDB 설계

  • 제휴사
  • 상품
  • 가격비교
  • 가격비교 로그
  • 가격비교 사이트

CREATE TABLE partner (
    id             BIGINT AUTO_INCREMENT PRIMARY KEY,
    name           VARCHAR(255)       NOT NULL,
    code           VARCHAR(50)        NOT NULL,
    contact_email  VARCHAR(255),
    status         VARCHAR(20)        NOT NULL DEFAULT 'ACTIVE',
    created_at     TIMESTAMP          DEFAULT CURRENT_TIMESTAMP,
    updated_at     TIMESTAMP          DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT     UNIQUE (code)
);

CREATE TABLE product (
    id             BIGINT AUTO_INCREMENT PRIMARY KEY,
    partner_id     BIGINT             NOT NULL,
    name           VARCHAR(255)       NOT NULL,
    description    TEXT,
    price          DECIMAL(10,2)      NOT NULL,
    status         VARCHAR(20)        NOT NULL DEFAULT 'ACTIVE',
    created_at     TIMESTAMP          DEFAULT CURRENT_TIMESTAMP,
    updated_at     TIMESTAMP          DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE integration_site (
    id               BIGINT AUTO_INCREMENT PRIMARY KEY,
    name             VARCHAR(255)       NOT NULL,
    code             VARCHAR(50)        NOT NULL,
    base_url         TEXT,
    integration_type VARCHAR(20)        NOT NULL,
    api_endpoint     TEXT,
    status           VARCHAR(20)        DEFAULT 'ACTIVE',
    created_at       TIMESTAMP          DEFAULT CURRENT_TIMESTAMP,
    updated_at       TIMESTAMP          DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT       UNIQUE (code)
);

CREATE TABLE price_comparison (
    id                  BIGINT AUTO_INCREMENT PRIMARY KEY,
    product_id          BIGINT            NOT NULL,
    integration_site_id BIGINT            NOT NULL,
    price               DECIMAL(10,2)     NOT NULL,
    product_url         TEXT              NOT NULL,
    created_at          TIMESTAMP         DEFAULT CURRENT_TIMESTAMP,
    updated_at          TIMESTAMP         DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE price_comparison_log (
    id                  BIGINT AUTO_INCREMENT PRIMARY KEY,
    product_id          BIGINT            NOT NULL,
    integration_site_id BIGINT            NOT NULL,
    price               DECIMAL(10,2)     NOT NULL,
    product_url         TEXT              NOT NULL,
    fetched_at          TIMESTAMP         DEFAULT CURRENT_TIMESTAMP
);

캐시 설계

  • 제휴사
  • 상품
  • 가격비교는 TTL을 걸어 사용할 예정
profile
오직 나만을 위한 글. 틀린 부분 말씀해 주시면 감사드립니다.

0개의 댓글