목차
1. 개요
경매는 정해진 시간에 높은 가격을 제시한 회원이 상품 구매 자격을 얻는 거래체결 방식이다.
경매를 진행하면 순간적으로 많은 입찰 요청이 들어 오고 실시간으로 상품 가격이 변동 된다.
수많은 트래픽과 사용자 경험을 개선하기 위해 프로젝트에서는 Redis, WebSocket, RabbitMQ를 이용해 경매 기능을 최적화 한다.
2. 경매 기능 구조
경매 기능은 프로젝트의 핵심 기능이며 요구사항은 다음과 같다.
- 상품을 보고 있는 사람은 매순간 변경된 입찰 최고 금액을 실시간으로 화면에 보여져야 한다.
- 높은 가격을 먼저 서버로 요청한 사람이 구매권한을 가진다. 즉, 순서에 민감하다.
이러한 요구사항을 만족하기 위해 프로젝트에는 WebSocket, Redis, RabbitMQ를 조합하여 사용하였다.
3. 상품 입찰액을 위한 캐싱
경매에서 상품액은 순간적으로 많은 요청이 발생하는 데이터이다. 즉, DB에 순간적으로 많은 읽기와 수정이 발생할 수 있는데 캐시를 두어 빠르게 사용자 요청에 대해 응답한다.
캐시의 읽기 전략으로는 Look aside Cache 패턴과 쓰기 전략으로는 Write Through 패턴을 사용하였다.
- 클라이언트가 최고 입찰액 요청
- 서버에서 캐시에 데이터 존재 유무 확인
- 데이터가 있다면 캐시의 최고 입찰액 사용 (빠른 조회)
- 데이터가 없다면 실제 DB 데이터에 접근
- DB에서 가져 온 데이터를 캐시에 저장하고 클라이언트에 반환
최고입찰액을 캐시에 저장함으로써 데이터베이스나 서버에 대한 부하를 줄이고 응답 시간을 단축 시켰다.
성능 향상률을 간략히 요약하면 다음과 같으며, 자세한 정보는 아래 링크를 통해 확인하실 수 있다.
- TPS : 1,524.8 → 1,995.5 / 약 30% 증가
- 최고 TPS : 1,822.0 → 2,368.5 / 약 30%증가
- 응답 시간 : 1,850.14 → 1,383.65 / 약 25% 감소
- 총 실행 테스트 건수 : 83,174 → 112,224 / 약 35% 증가
- https://systemdata.tistory.com/91
4. 실시간 최고 입찰액을 갱신하는 웹소켓
경매에서 상품 가격은 실시간으로 관리되어야 하며 사용자에게 제공해주어야 한다. 실시간으로 최고 입찰액을 제공하지 않는다면 이미 높아진 가격에 입찰을 실패하기 때문에 입찰에 실패하는 경우가 빈번해진다.
웹 소켓을 사용하여 다음과 같은 이점을 개선하였다.
- 실시간 입찰액 업데이트
- 최고 입찰액과 같은 정보의 변화가 발생할 때 마다 즉시 클라이언트에게 알린다. 이는 사용자가 최신 상태를 유지할 수 있도록 한다.
- 낮은 지연 시간
- 웹소켓은 초기 핸드쉐이크 이후 지속적으로 열려 있어, 데이터 전송시 추가적인 HTTP 요청을 필요로 하지 않는다. 이는 전체적인 통신 지연 시간을 줄이고 빠른 사용자 상호작용을 가능하게 하였다.
5. 대용량 트래픽 처리를 위한 메시지 큐
다수의 요청을 효과적으로 관리하고 비동기적으로 처리하기 위해, 메시지큐 시스템을 도입하여 입찰 요청을 큐에 저장한 후 순차적으로 처리하도록 구성하였다.
- 많은 입찰 요청
- 입찰 요청온 순서대로 메세지 큐에 담기. (입찰 순서 보장)
- 비동기적으로 DB에 입찰 요청 순차적으로 저장
입찰 요청으로 인해 고부하 상황에서도 입찰 요청을 효율적으로 관리할 수 있다. 입찰 요청을 큐에 저장하고 순차적으로 처리함으로써, 동시에 대량의 요청이 들어와도 시스템이 안정적으로 운영될 수 있었다.
또한, 요청을 비동기적으로 처리함으로써 사용자에게 빠른 응답을 제공할 수 있었다. 실제 입찰 처리 로직이 실행되는 동안 사용자는 입찰이 접수되었다는 즉각적인 피드백을 받을 수 있으며 사용자 경험이 크게 향상 시킨다.
성능 향상률을 간략히 요약하면 다음과 같으며, 자세한 정보는 아래 링크를 통해 확인하실 수 있다.
- TPS : 413.5 → 800.1 / 약 94% 증가
- 최고 TPS : 792.0 → 1,210.5 / 약 53% 증가
- 응답 시간 : 6,164.63 → 3,378.55 / 약 45% 감소
- 총 실행 테스트 건수 : 23,684 → 45,480 / 약 92% 증가
- https://systemdata.tistory.com/92
6. 결론
경매 시스템에서 성능 최적화를 위해 Redis, WebSocket, RabbitMQ를 조합하여 사용함으로써 위와 같은 성능 개선 결과를 얻었다.
Redis를 통한 효율적인 캐싱, WebSocket을 이용한 실시간 데이터 업데이트, RabbitMQ로 구현된 비동기 메시지 처리는 사용자 경험의 개선뿐만 아니라 시스템의 전반적인 성능과 안정성을 크게 향상 시킬 수 있었다.
'Etc.' 카테고리의 다른 글
Github 저장소에 Repository Rule 제약하기 (0) | 2024.11.22 |
---|---|
브라우저에 URL을 입력하면 어떤 일이 벌어질까? (0) | 2024.03.26 |
RabbitMQ 메세지큐 적용으로 성능 개선하기 (0) | 2024.03.19 |
Redis 캐시 적용으로 성능 개선하기 (0) | 2024.03.15 |
Auditing을 고려한 테이블 설계 과정 (0) | 2024.03.02 |