안녕하세요! 올리브영에서 쿠폰 Squad에서 Back-end 개발 업무를 맡은 레이입니다!
쿠폰 서비스는 많은 분이 직간접적으로 발급 받아 사용하는데요.
오늘 글에서는 안정적인 서비스를 제공하기 위해 어떻게 변화하고 있는지 시리즈로 설명해드리고자 합니다.
기존 쿠폰 발급 과정
먼저 쿠폰 서비스가 어떻게 개선되었는지를 이야기하기 전에 기존에 프로세스를 먼저 확인할 필요가 있습니다.
대부분의 프로세스가 위와 같은 구조가 되어 있을 건데요. 평소에는 위와 같은 프로세스는 크게 문제가 되지 않습니다. 그렇지만 대량의 트래픽이 몰리는 경우(세일, 세일, 세일...) 쿠폰 발급 처리를 위한 조건 체크 중 발급 수량 부분이 DB와 경합을 발생합니다. 6월 세일부터는 선착순 쿠폰이 00시 외에 12시에도 발급이 돼서 00시에 한번 몰리던 것이 12시에도 몰리게 되었습니다.
12시에는 쿠폰 외에 다른 활동들도 있습니다.
Redis
이러한 문제점을 해결하기 위해 발급 수량의 경우 DB에서 조회하기보다는 Redis를 통해 일차적으로 조회하고 Redis에서 조회를 못 하는 경우 이차적으로 DB에서 조회하도록 개선하기로 했는데요. 먼저 Redis가 어떤 역활을 하는지 알아볼 필요가 있을 거 같습니다.
Redis는 Open Source 기반에 In-Memory 데이터 저장소를 제공하는 애플리케이션입니다. Key-Value를 구조로 데이터를 저장하고 다양한 자료 구조를 제공하고 있습니다.
Redis vs Memcached
Redis와 유사한 애플리케이션으로 Memcached가 있습니다. 두 애플리케이션 간에는 비슷하지만, 차이점이 있는데요.
Redis와 Memcached 모두 처리 속도는 메모리에 저장돼서 차이가 없으나 Memcached와 Redis 사이에 메모리 재사용 방식이 달라 Redis는 명시적으로만 데이터를 삭제할 수 있습니다. 또한 데이터 타입도 차이가 있는데 Memcached는 문자열만 사용하고 Redis는 앞에도 이야기했지만 자료 구조로 문자열, Set, Sorted Set, Hash, List 자료 구조 등 지원을 합니다.
Redis 사용 시 주의점
이렇게 다양한 자료 구조를 지원하고 메모리에서 처리해서 빠른 Redis지만 사용 시 주의할 점이 있습니다.
- Collection 안에 너무 많은 아이템 사용금지(1만 개 이하)
- Expire는 아이템 단위가 아닌 Collection 단위로 동작
- Redis는 자기가 사용하는 메모리양을 모르기 때문에 사용 시 파편화가 발생할 수 있으므로 메모리 관리를 및 모니터링
- Write가 많은 Redis는 메모리를 두 배까지 사용할 수 있으므로 퍼포먼스가 떨어질 수 있음
- Hash, Sorted Set, Set은 메모리 사용이 많으므로 ZipList 등의 고려 필요(ZipList는 속도는 떨어지나 메모리 관리에 이점이 있음)
- 싱글 스레드이므로 시간이 오래 걸리는 명령어 사용 시 주의(Keys, Flushall, FlushDb, Delete Collections, Get All Collections) 또한 오래 걸리는 명령어 사용 시 1,000개 이하 권장
쿠폰 개선 방향성
Redis하고 Memcached 가운데 Redis를 이용해서 쿠폰 발급 수량을 개선하기로 했는데요. 그 이유는 Redis에서 지원하는 다양한 자료구조를 이용할 수 있는 부분이 있고 메모리 재사용 방식이 Memcached와는 다르게 Redis의 경우 명시적으로 데이터를 삭제할 수 있지만 전시/발급 기간을 제외하고는 발급 수량 데이터를 보관할 필요는 없고 이 경우 DB를 통해 조회할 수 있도록 하여 Redis로 변경하기로 했습니다.
우선 6월 세일에 DB 서버에 큰 부하를 주는 쿠폰 발급 수량에 대해 개선을 진행했고 9월 세일에는 발급 수량 관련한 부분에서 부하는 사라져 조금 더 안정적인 서비스 운영이 가능하여지도록 했습니다.
마무리
여전히 쿠폰 Squad는 아직 개선해야 할 포인트들이 많습니다! 이를 위해 쿠폰 Squad에서 열심히 개선 작업을 수행하고 있습니다.
또한 이러한 개선 작업에 대해 문제가 될 것이 없는지와 그 외 쿠폰 서비스가 원활하게 동작하는지 문제가 있는 경우 수정해야 할 부분이 있는지 등 파악을 해야 하는데요. 이러한 부분을 파악하기 위해 다른 포스팅에서도 언급된 Datadog을 통해 쿠폰 서비스도 모니터링하려고 하고 있습니다.
관련해서는 다음 포스팅에서 자세히 설명해 드리도록 하겠습니다. 그때 또 만나요!