[댕댕어디가] 선착순 이벤트 시스템 구현기 - 동시성 문제 해결
·
댕댕어디가 프로젝트/트러블슈팅
선착순 이벤트 시스템이란?댕댕어디가에는 펫 페스티벌 티켓을 선착순으로 받을 수 있는 이벤트가 존재합니다. 빠른 저장과 부하를 위해 이벤트 당시에는 티켓을 발급한 유저의 정보를 Redis에 저장한 후, MySQL에 영속화하는 과정을 거칩니다. 이전 글에서는 이러한 선착순 이벤트 시스템 구현 과정을 글로 정리하여 남겼으며 부하테스트를 진행하여 목표 시간내 실행되는 것을 확인하였습니다. 그런데 테스트 중간 중간에 원하는 발급량보다 더 많이 발급하는 것을 확인하였고, 이번엔 이를 해결하기 위해 글로 남기고자 합니다.https://gani-dev.tistory.com/154 1. 동시성 문제 발견여러번의 부하 테스트 도중, 300개보다 더 많이 티켓을 발급한 경우를 확인할 수 있었습니다.2. 동시성 문제 발생 원..
[댕댕어디가] 땅따먹기 주인 조회 API 속도 개선
·
댕댕어디가 프로젝트/트러블슈팅
1. 땅따먹기란댕댕어디가에는 땅따먹기 서비스가 존재합니다.'땅따먹기'란, 각 지역에 있는 반려동물 동반 가능 시설을 가장 많이 방문한 유저가 땅 주인이되는 기능을 말하며, 땅 주인이 되면 보상으로 스토리 업로드 혜택이 주어집니다.  2. 부하테스트그러나 모든 지역의 땅 주인을 조회하는 API가 응답 속도가 느린 문제가 있었습니다.잦은 요청이 있는 API임에도 불구하고 다른 API보다 속도가 느려 부하테스트를 진행하였습니다. DAU가 2만명인 것을 가정하여, 10%인 2000명이 동시에 요청했을 때의 시나리오로 테스트해 봤습니다..결과는 실패율 100%..! 아래와 같은 오류가 발생했습니다. DB 연결시 파일 디스크립터를 할당받는데, 할당 받을 수 있는 파일 디스크립터가 초과했다는 뜻입니다.허용 가능한 파..
[댕댕어디가] 선착순 이벤트 시스템 구현기
·
댕댕어디가 프로젝트/트러블슈팅
'댕댕어디가' 서비스에는 선착순으로 티켓을 발급받을 수 있는 기능이 있습니다. (ex. 펫 페스티벌 입장권)1.이벤트 시스템 구현 유저의 티켓 발급 요청을 받으면, 애플리케이션에서 유저의 아이디를 추출해 Redis에 저장합니다.이때, Redis에는 HashMap 자료형으로 {"유저ID" : "발급시간"} 값을 저장합니다. 기존 발급 가능 인원까지 저장한 후,  목표 인원이 모이면 마감되었다는 응답을 전달합니다.  이벤트가 마감되면 Redis에 저장된 유저의 정보와 발급시간을 활용해, 가장 빨리 발급한 순서대로, 가능 인원수만큼 DB에 저장하여 영속화하는 과정을 거칩니다. Redis에 저장하는 이유선착순 이벤트 기능은 동시에 트래픽이 가장 많이 몰리는 기능 중 하나입니다.이때, 유저가 요청할 때마다 유저 ..