Git Product home page Git Product logo

point's Introduction

SQS를 이용한 비동기 포인트 시스템

Build Status Coverage Status

Queue 시스템 소개

Skill Stack

  • AWS SQS
  • AWS RDS
  • AWS DynamoDB

프로젝트 상세

기능

  • 포인트 적립

    • 유효기간을 가진 포인트 적립
    • 적립 유형 기록
      • 리뷰 남겼을시
      • 제품 구매시
      • 이벤트 참여시
      • 포인트 선물 수령
      • 기타 등등
  • 포인트 소멸

    • 소멸 유형 기록
      • 유효기간이 지난 포인트는 소멸
      • 휴면처리된 계정은 포인트 소멸
      • 기타 등등
  • 포인트 사용

    • 먼저 적립된 포인트부터 사용
      • ex) 1000p/2018-02-01, 2000p/2018-01-31 이 있으면 2018-01-31 먼저 다 사용되고 2018-02-01 사용됨
    • 사용 유형 기록
      • 제품 구매
      • 포인트 선물
      • 기타 등등
  • 포인트 선물

    • 포인트를 타 계정으로 선물
    • 포인트 적립 / 사용이 함께 발생
  • 롤백

    • 환불, 리뷰 삭제, 이벤트 참여 취소 등으로 인해 포인트 처리 롤백
    • 환불시에는 포인트 적립이 롤백
    • 제품 구매시 포인트를 사용했다면 환불시에 적립된 포인트도 롤백

SQS

  • consumer가 동일 메세지를 2번 수신하는것 방지하기 위해 provider에선 uuid를 제공
    • consumer는 uuid가 이미 들어가있는지 확인후 save과정 진행

도메인

  • 사용자의 최종 포인트와 포인트 이벤트 이력만으로는 문제해결이 안됨
    • 이번에 사용할 포인트는 언제 적립된 포인트이며, 얼마가 남았으며, 부족하기 때문에 다음 적립포인트를 사용해야하는지 등등 확인이 어려움
    • 이번에 소멸할 포인트는 언제 적립된 포인트이며, 얼마가 남았는지 확인이 어려움
  • 적립/소멸/사용 테이블 분리하면 문제 발생
    • 이력조회시 10개 혹은 20개 단위 페이징 구현이 복잡해짐
    • 최대한 심플한 구조로 가야 유지보수가 하기 쉬움

그래서 아래와 같이 3개 도메인으로 설계

  • point_active

    • 활성화된 포인트
    • 포인트 적립: insert
    • 포인트 사용/소멸: update
    • save_point, remain_point 컬럼 2개로 나누어 포인트 사용시 remain_point에서 차감
    • remain_point가 0이 될 경우 다음 최신 적립 포인트에서 차감
    • 유효기간 만료시 remain_point를 0으로 update
    • 조회의 경우 remain_point가 0이 아닌 경우만 조회
    • 컬럼
      • customer_id
      • event_detail_type (제품구매, 제품리뷰, 이벤트참여, 보상, 충전)
      • save_point (제일 처음 등록된 포인트)
      • remain_point (남은 포인트)
      • created_date
      • updated_date
    • RDS에서만 관리
  • point_history

    • 포인트의 모든 이벤트
    • 포인트 적립/사용/소멸: insert
    • 컬럼
      • customer_id
      • message_id //queue uuid
      • trade_no
      • event_type (적립/사용/소멸)
      • event_detail_type
      • point
      • description
      • created_date
      • updated_date
    • RDS, DynamoDB 양쪽에서 모두 관리
    • uuid+customer_id가 유니크키
  • point_sum

    • 고객의 현재 총 포인트만 갖고 있음
    • point_active에 insert/update가 발생시마다 remain_point 의 총합계로 overwrite
    • 컬럼
      • customer_id
      • point_sum
    • DynamoDB에서만 관리

모듈

포인트 관련 모든 이벤트는 publisher를 통해서 처리하는 것을 전제로 한다.
(Batch를 통한 소멸/관리자페이지에서 수동 적립 등등 모두 publisher를 통해서 진행)

  • point-core
  • point-provider
    • SQS provide
  • point-consumer
    • SQS consume
    • RDS와 DynamoDB에 저장
  • point-batch
    • 포인트 소멸 관련 처리
      • 유효기간 만료된 포인트 소멸처리
    • 기존 데이터 마이그레이션
  • point-external-api
    • 외부용
    • DynamoDB의 내용을 조회
  • point-internal-api
    • 내부용
  • point-admin
  • point-test-web

남은 문제

  • 포인트 계산 로직의 주체는 누구?
    • 포인트 어드민 생기는것 보니 우리가 해야하나보다
    • 그럼 주문 금액과 포인트 키를 받아서 직접 포인트 계산해야하나?
    • 아니면 거기서 계산된 포인트를 주나?
    • 부분 결제 취소가 있으면 부분 포인트 취소도 있어야하는데?
      • 얼만큼 적립 취소를 시켜야하는지 포인트 시스템에서 어떻게 알지?

point's People

Contributors

jojoldu avatar

Stargazers

Joonyoung Hong avatar Min Yul avatar YEON avatar Revy avatar Choi Wang Gyu avatar Hyeon avatar jerry avatar Sumin Kim avatar Las avatar Soomin Sohn avatar ChungBeom Cho avatar DongHee Kang avatar Minseong Kim avatar Morris avatar Im Sejin avatar 안시원 avatar  avatar  avatar Taeyang Jin (Theo) avatar Seokhyeon Kim avatar polymorph avatar Seo, Yeong-Hak avatar shower avatar 강민희 avatar Seunghee Lee avatar 천광규 avatar  avatar 플람 avatar 훈 avatar LeeJi Eun avatar Seyun(Marco) / 김세윤 avatar  avatar 박윤상 (Younsang Park) avatar  avatar  avatar Yun avatar  avatar JuHyun Lee avatar 김영한 avatar YongGeun Kwon avatar

Watchers

James Cloos avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.