프로젝트/선착순 쿠폰 발급 시스템
-
Spring Boot + Redis 대기열 시스템 만들어보기 - 이론편프로젝트/선착순 쿠폰 발급 시스템 2023. 10. 29. 00:01
개요 이전부터 만들어보고 싶었던 대기열 시스템을 만들어보고자 합니다! 일시적으로 많은 트래픽이 발생하는 경우에 과도한 트래픽의 유입을 방지해 주는 대기열 시스템입니다. 특정 이벤트가 있을 때 예측된 트래픽을 대비하여 Scale out 할 수 있지만 폭주하는 짧은 기간이 지나가면 대부분의 자원들은 낭비됩니다. 이런 상황일 때 대기열 시스템을 도입할 수 있습니다. Redis 활용 이유 redis의 자료구조 중 sorted set을 활용하게되면 rdb를 활용하는 것보다 성능적인 면에서 우수합니다. Redis는 In-memory 저장소로 높은 처리량을 가지고 있기 때문에 많은 트래픽을 잘 버틸 수 있습니다. 많은 트래픽이 한번에 DB로 부하가 가지 않게 됩니다. Redis Sorted Set이란? score에 ..
-
Redis 주의사항프로젝트/선착순 쿠폰 발급 시스템 2023. 7. 1. 00:01
Cache Stampede Stampede를 해석하면 우르르 몰려오는 소떼등을 의미합니다. 우리는 레디스를 캐시로 사용할 때 데이터의 갱신을 위해 대부분의 서비스에서는 키에 대해 Expire Time(만료시간)인 TTL을 설정합니다. 키가 Expire Time이 도래하기전까지는 DB에 부하를 주지 않고 Redis에 부하를 주면서 빠른 응답을 제공하는 것이죠 하지만 대규모 트래픽 환경에서 이 TTL 값은 예상치 못한 문제를 발생시킬 수 있습니다. 대규모 트래픽에서 키가 만료되는 순간 Redis에 조회되지 않기 때문에 DB에는 순간적인 duplicate read가 발생하게 됩니다. 그리고 다시 이는 Redis에 키를 적재하기 위한 Duplicate write를 발생시킵니다. Cache Stampede를 해결..
-
Redis는 싱글스레드인가?프로젝트/선착순 쿠폰 발급 시스템 2023. 6. 19. 00:01
개요 대부분 Redis는 Single Thread라고 알고 있으며, 저 또한 그렇게 이해하고 있습니다. 이런 배경지식으로 병렬 프로그래밍 환경에서 원자성(Atomic)을 보장하기 위해 사용하기도 하였습니다. 하지만 종종 다음과 같은글들을 만날 수 있습니다. https://medium.com/javarevisited/go-crazy-is-redis-single-threaded-or-multi-threaded-96fe8ff99ab9 Go crazy, is Redis single-threaded or multi-threaded? For early programmers, Redis is single-threaded, no doubt about it. So why do many friends have doubts..
-
선착순 쿠폰 발급 시스템 성능테스트프로젝트/선착순 쿠폰 발급 시스템 2023. 6. 18. 00:01
개요 모든 구현이 끝났고 성능테스트만 남게 되었습니다. 성능테스트는 nGrinder로 진행할 예정입니다. nGrinder Script import static net.grinder.script.Grinder.grinder import static org.junit.Assert.* import static org.hamcrest.Matchers.* import net.grinder.script.GTest import net.grinder.script.Grinder import net.grinder.scriptengine.groovy.junit.GrinderRunner import net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess import n..
-
RedisTemplate으로 Set 자료구조 사용하기프로젝트/선착순 쿠폰 발급 시스템 2023. 6. 9. 00:01
개요 선착순 쿠폰 발급을 위해 이벤트 쿠폰을 Set에 저장하고 사용자에게 발급할 때는 pop 하여서 발급해 주자 RedisTemplate 등록 @Bean fun redisTemplate(): RedisTemplate { val objectMapper = ObjectMapper() objectMapper.registerModule(JavaTimeModule()) // Java 8 시간 타입 처리 모듈 등록 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) // 날짜 포맷 설정 val serializer = Jackson2JsonRedisSerializer(CouponRedisEntity::class.java) serializer.se..
-
Spring Event 사용하기프로젝트/선착순 쿠폰 발급 시스템 2023. 5. 30. 00:01
개요 이벤트를 사용하는 이유는 무엇일까요? 개인적으로 생각했을 때 가장 주된 이유는 서비스 간의 의존성을 줄이기 위해서입니다. 서비스 의존성을 줄이기 예를 들어 회원가입으로 보았을 때, 회원가입을 수행하고 사용자에게 회원가입 성공 알림을 전송하거나, 신규가입 쿠폰을 할당한다고 가정해 보겠습니다. 이때 알림에서 장애가 발생하거나, 신규가입 쿠폰할당 과정에서 오류가 난다면 회원가입도 같이 실패하게 됩니다. 하지만 회원가입은 성공하였는데 회원가입이 끝나고 수행되는 그 외의 작업들로 회원가입이 실패하면 안 됩니다. 이벤트 발행하기 @Service class SignUpService( private val memberRepository: MemberRepository, private val applicationE..
-
Kotlin JPA Update Query 작성하기프로젝트/선착순 쿠폰 발급 시스템 2023. 5. 28. 00:01
UserJpaRepositry @Repository interface UserJpaRepository : JpaRepository{ @Modifying @Query("update UserJpaEntity u set u.representationMobileNumber = :mobileNumber where u.userId = :userId") fun updateMobileNumber(mobileNumber: String, userId: String): Int } @Modifying과 @Query를 사용하여 update쿼리를 작성해 주었습니다. userId와 mobileNumber를 인자로 받아 userId가 동일한 row의 representationMobileNumber를 변경해 주는 역할을 수행합니다. ..
-
Kotlin JPA 양방향 연관관계 매핑프로젝트/선착순 쿠폰 발급 시스템 2023. 5. 25. 00:01
연관관계란? 객체와 관계형 데이터베이스의 테이블의 불일치를 해결하기 위해 테이블 간의 연관관계를 매핑할 수 있습니다. 데이터베이스와 객체와의 다른점 데이터베이스는 외래키 하나만으로 양쪽 테이블 조인이 어디에서나 가능합니다. 하지만 객체는 참조용 필드가 있는 객체만 다른 객체를 참조하는 것이 가능합니다. 예를 들어 Account에 Member 프로퍼티가 존재하면 Account에서 Member를 조회할 수 있습니다. JPA를 사용하여 데이터베이스와 패러다임을 맞추기 위해서 객체는 단방향 연관 관계를 가질지, 양방향 연관 관계를 가질지 선택해야 합니다. 양방향과 단방향 양방향은 기본적으로 단방향 참조 2개로 구성됩니다. 처음에는 외래키를 가진 쪽(연관관계의 주인)에 단방향으로 연관관계를 매핑하고 필요시에 양방..