Giter Club home page Giter Club logo

coupon-issuance's Introduction

프로젝트 설명

  • coupon-issuance : 쿠폰 발급
  • coupon-issuance-request : 쿠폰 발급 요청

docker-compose 로 redis 실행

  • docker-compose 폴더에 있는 docker-compose-redis.yml 을 실행시킵니다.
docker-compose -f ./docker-compose-redis.yml up -d

동작 확인

  • redis-cli 로 접속해서 ping 명령어를 날리면 동작 확인이 가능합니다.
docker exec -it redis_main redis-cli

container 종료

docker-compose -f ./docker-compose-redis.yml down

coupon-issuance's People

Contributors

leechoongyon avatar

Watchers

 avatar

coupon-issuance's Issues

쿠폰 발급 선착순 시스템 설계

요구사항

  • 같은 쿠폰을 여러 사람에게 중복 발급해주면 안됩니다.
  • 쿠폰을 몇 번만에 받았는지 확인할 수 있어야 합니다.
  • 동일한 유저가 여러번 발급 요청했을 시, 최초 요청만 허용됩니다.

설계

  • 쿠폰 발급 요청을 받는 서버, 쿠폰을 발급해주는 서버를 분리해서 처리합니다.
  • client --> 쿠폰 발급 요청 서버 --> Redis
  • 쿠폰 발급 서버 --> Redis 조회 후, DB 저장
  • 사용자 입장에서는 쿠폰 발급 버튼을 누른 것이고, 그것을 추후 SNS 등으로 확인 가능

API 설계

  • 쿠폰 발급 요청 API 설계 #18

Redis 자료 구조 설계

  • 선착순 요구사항이니 Queue 타입이 필요합니다.
  • Redis 에서 지원하는 Queue 타입은 List, SortedSet, Stream, Blocking 이 있습니다.
  • 같은 유저에 대해서 중복 요청을 처리하면 안되므로 List 는 좀 힘들고 Set 이 괜찮은 것 같습니다.
  • 발급 받은 순서를 알 수 있어야 하므로 시간복잡도를 비교해봐야 합니다.
    • List 는 O(n), SortedSet 은 O(logN) 입니다.

redis 발급 요청 개발 (lua script 이용)

  • redis 에 데이터가 1000건이 넘었는지 확인하고, 1000건이 안넘었으면 add 시키는 것을 소스 코드로 작성
  • lua script 를 통해 작성하기. 동시성 보장

쿠폰 발급 설계 고민

쿠폰 발급 설계 상세화

  • Redis 자료구조를 어떻게 저장할지
    1.발급 요청이 들어오면 Redis 에 저장된 데이터 개수를 확인
    2.데이터 개수가 특정 쿠폰 개수를 넘지 않으면 redis 에 데이터를 add
    위 1,2 번은 lua script 로 묶어서 한 번에 처리하도록 하기.
    예를 들면, 1000개만 쿠폰 발행한다 하면 1000개 초과부터는 redis 에 데이터를 못넣는 신호를 가지고 Exception 을 던지면 되겠지.

SortedSet key : coupon 명, value : userId, score : timestamp

  • 쿠폰 발급서버에서는 데이터를 어떻게 저장하고 가져갈지
    redis 에 저장된 것을 하나씩 빼서 DB 에 저장하면 되겠지.

선착순 쿠폰 발급 할일

  • k6 블로그 정리
  • k6 + 그라파나 연동
  • redis 에서 데이터를 가져와서 DB 연동하는 부분을 한 트랜잭션으로 처리하는법
  • 쿠폰 미리 발급 k6 이용해서 수천개 날려보기. redis 에 user - coupon 맵핑이 제대로돼는지

테스트툴 이용해서 동시 요청

내용

  • 쿠폰 미리 발급 (2000개정도)
  • k6 이용해서 요청. userId 를 다르게 줘서 요청해야 함
    • 요청을 해서 user-mapping 에 coupon 개수만큼 생성이 됐는데. 이걸 어떻게 검증하지?
    • 가장 좋은건 empty, exist 이런 값들을 total count 를 찍는건데

쿠폰 발급 요청 API 설계

API 설계

  • coupon/issuance/request
  • 쿠폰 발급 요청
  • 사용자 입장에서는 쿠폰발급을 요청 --> 추후 SNS 등을 통해 쿠폰 발급이 됐는지 확인 가능

순서

  • 쿠폰 발급 요청 --> Redis 에 대기열 쌓음. --> 쿠폰 발급 서버에서 해당 데이터를 꺼내서 실제 DB 에 반영

쿠폰 발급 설계

쿠폰 발급 설계

  • 전체적인 구조를 어떻게 잡을지 설계
  • API, Redis 등

부하테스트 공부 후 적용

Ngrinder

ngrinder java.lang.IllegalArgumentException: Unsupported class file major version 61 에러

  • script validate 를 돌렸는데 위 에러가 나옴.
  • jdk 1.8 로 변경해서 돌렸더니 잘됨.
  • --port 옵션은 controller port 를 지정해줌.

Unable to make field private static transient java.net.InetAddress$NameService

  • validation 돌렸더니 에러 내용을 보면 field 를 private transient 로 설정해서 그런거 같은데 이건 왜 이러는건지 모르겠네

Docker 로 controller 설치해서 기동

  • script validation error 라고만 나오네..

Q&A

jmeter

  • 사용해봤는데 음.. 약간 옛날 디자인이라고 해야하나.. 그냥 손이 좀 안가는 것 같음..
  • 그리고 동적 변수를 할당해 사용해볼려고 했는데 가이드 찾기가 좀 빡세네.

K6

  • 진행중

개요

쿠폰 발급 선착순 시스템

목적

  • 코틀린, Redis 공부

설계

1.쿠폰발급요청을 받아주는 서버, 쿠폰을 실제로 발급하는 서버는 달리 만들어야 함
2.동시성 처리문제

개발프로세스

이슈 만들어서 처리
ex) 레디스 docker 로 띄우기
고려할점
서버 확장 시 어떻게 할지 (Redis, 서버 등)
HA 는 어떻게 구성할지
주의사항
어려웠던점 고민했던점을 써주기
Refernece
https://jgrammer.tistory.com/m/entry/Redis%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%84%[…]0-%EB%B0%9C%EA%B8%89-%EC%84%9C%EB%B2%84-%EC%84%A4%EA%B3%84
https://youtu.be/MTSn93rNPPE
https://pkgonan.github.io/2020/04/stock

[개발] 발급 요청 API 개발

내용

  • 발급 요청 API 개발
  • 발급 요청 API 테스트 코드 작성
  • Redis docker 로 띄우기
  • Redis SortedSet 에 저장하기.

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.