비동기 구조 3단계: Redis Script 적용
Redis 분산 락은 트래픽 증가 시 경합으로 인해 병목 현상이 발생하였다. 이를 해결하기 위해 Redis Script를 도입하여 검증 및 발급 로직을 하나의 원자적 트랜잭션으로 처리하여 성능과 데이터 일관성을 동시에 확보했다. Redis Script는 Lua 스크립트를 사용하여 Redis 내부에서 실행되며, 모든 명령을 단일 실행으로 처리해 I/O 비용을 줄이고 동시성 문제를 방지한다.
이 개선을 통해 응답 시간은 약 22배 감소하고 RPS는 9배 증가했으며, MySQL 부하를 50% 줄이는 효과를 얻었다.
소스코드 구현
구조 및 구현
coupon-BE/
├── coupon-core/
│ ├── build.gradle.kts
│ └── src/main/java/com/example/couponcore/
│ ├── repository/
│ │ └── redis/
│ │ ├── RedisRepository.java
│ │ └── CouponIssueRequestCode.java
│ └── service/
│ └── AsyncCouponIssueServiceV2.java
└── coupon-api/
└── src/main/java/com/example/couponapi/
├── CouponIssueController.java
└── service/
└── CouponIssueRequestService.java
Java
복사
파일명 | 역할 및 내용 |
RedisRepository.java | Redis 스크립트를 사용해 쿠폰 발급 검증과 요청 저장을 원자적으로 처리 |
CouponIssueRequestCode.java | Redis Script의 응답 코드를 Enum으로 정의하여 가독성과 유지보수성을 개선 |
AsyncCouponIssueServiceV2.java | Redis Script를 호출하여 쿠폰 발급 요청 처리 |
CouponIssueController.java | /v2/issue-async 엔드포인트를 제공하여 비동기 발급 요청 처리 |
CouponIssueRequestService.java | API 요청 데이터를 처리하고, AsyncCouponIssueServiceV2로 전달 |
소스코드
coupon-core
RedisRepository.java
CouponIssueRequestCode.java
AsyncCouponIssueServiceV2.java
coupon-api
CouponIssueController.java
CouponIssueRequestService.java
성능테스트
3단계: Redis 적용(v2.3)
버전 정보
버전 | 변경 사항 |
v2.3 | 비동기 구조 3단계 Redis Script 적용
- RedisRepository.java
- CouponIssueRequestCode.java
- AsyncCouponIssueServiceV2.java
- CouponIssueController.java
- CouponIssueRequestService.java |
테스트 결과
•
테스트 환경: Local 환경에서 성능 테스트 3회 실시, 평균 값 도출
소스코드
버전정보 | 인프라 환경 | 쿠폰 발급 수량 비교
(정상발급확인) | #Request | #Fails | Failures | Average
(ms) | RPS | MySQL
CPU(%) | Redis
CPU(%) |
v2.3 | localhost | 일치 | 3,819,035 | 2,240 | 0.06% | 75.43 | 5187.10 | 29.90 | 19.76 |
v2.3 Redis Script 적용 부하테스트 결과
테스트 결과 요약
•
Redis Script 적용 전후 성능 비교:
항목 | v2.1 | v2.2 (캐시 적용) | v2.3 (Redis Script) | 비교 |
RPS (초당 요청 처리) | 582.55 | 585.96 | 5,187.10 | 약 9배 증가 |
평균 응답 시간 (ms) | 1699.80 | 1,690.48 | 75.43 | 약 22배 빨라짐 |
MySQL CPU MAX 사용량 (%) | 75.11% ← 아직 부하가 높음 | 60.62 | 29.90 | 50% 감소 |
Redis CPU 사용량 (%) | 20.39 | 19.76 | 거의 동일, 리소스 효율적 사용 |
•
Redis Script 적용 전후 성능 변화 요약:
◦
RPS: 초당 요청 처리 속도가 약 9배 증가 (585.96 → 5,187.10)
◦
응답 시간: 평균 응답 시간이 약 22배 감소 (1,690.48ms → 75.43ms).
◦
MySQL CPU 사용량: 50% 감소 (60.62% → 29.90%)
◦
Redis CPU 사용량: 거의 변화 없음 (20.39% → 19.76%)
•
Redis Script 도입 효과:
◦
쿠폰 발급 과정의 모든 단계를 원자적 트랜잭션으로 처리
◦
MySQL 부담을 줄이며 Redis 성능을 극대화
◦
동시성과 데이터 일관성을 동시에 보장
◦
처리 효율성과 시스템 안정성 대폭 향상
결론
Redis Script를 통해 병목 문제를 해결하여 성능을 개선하였다. MySQL 부하를 줄이는 동시에 높은 동시성을 처리할 수 있는 시스템을 구현하였다. 이로 인해 쿠폰 발급 시스템의 처리 효율성과 안정성이 크게 향상되었다.
•
성능 개선
◦
RPS 약 9배 증가 (585.96 → 5187.10).
◦
평균 응답 시간 약 22배 감소 (1,690.48ms → 75.43ms).
◦
MySQL CPU 사용량 50% 감소 (60.62% → 29.90%).
•
효율성 향상
◦
동시성 문제를 원자적으로 처리하여 데이터 일관성과 무결성 보장.
◦
Redis 스크립트를 통해 불필요한 락(lock)을 제거하여 처리 속도 최적화.
•
시스템 안정성 증가
◦
트래픽이 높은 환경에서도 경합 문제를 제거하여 대규모 요청을 안정적으로 처리.
Q&A
Q. Redis Script를 왜 사용했나요?
Q. 성능 향상은 구체적으로 어떤 부분에서 이루어졌나요?
Q. Lua Script 사용의 주요 장점은 무엇인가요?
Q. Redis Script가 적합하지 않은 경우는 언제인가요?
Q. Redis CPU 사용량이 거의 동일한 이유는 무엇인가요?
Q. Lua Script의 단점은 없나요?
Related Posts
Search