카테고리 없음

동시성 제어에 대한 비관락/낙관락 성능 테스트

멋쟁휘개발자 2024. 10. 29. 20:24

동시성 제어에 대한 비관락/낙관락 성능 테스트


`콘서트 예약 서비스`를 만들고, 서비스의 기능 중 동시성 이슈가 발생할 것으로 예상되는 기능에 대해 락 종류와 환경에 따른 `동시성 제어 성능 테스트`를 해보고자 합니다.

 

 

| 동시성 제어 방식에 따른 비교

항목 낙관적 락 비관적 락 Redis Kafka
장점 - 충돌이 적을 때 성능이 뛰어남
- 락을 걸지 않아 자원 효율성 높음
- 데이터 일관성 보장 강력
- 충돌 시 안전한 트랜잭션 처리
- 빠른 응답 시간과 높은 처리 속도
- 실시간 메시지 전송 기능 제공
- 높은 내구성
- 대용량 데이터의 안정적 전송
- 확장성 우수
단점 - 충돌 발생 시 성능 저하
- 높은 재시도 비용
- 락 경합 시 성능 저하
- 트랜잭션 대기 시간 증가
- 락 분산 관리가 복잡
- 다중 노드 환경에서 일관성 유지 어려움
- 지연 시간이 발생할 수 있음
- 메시지 순서 보장 복잡도 높음
구현 복잡도 - 쉬움
- 버전 필드 추가만으로 구현 가능
- 쉬움
- 락 어노테이션 선언
- Redis 구성 및 분산 환경 설정 필요
- 락 만료 시간 설정 필수
- 상대적으로 복잡
- Topic, 파티션 관리 필요
성능 - 락 경합이 적으면 성능 좋음
- 트랜잭션 경합 시 재시도 필요
- 낮은 성능
- 락 획득과 해제 과정으로 처리 시간 증가
- 높은 성능
- 메모리 기반으로 빠른 메시지 처리
- 높은 처리량
- 다량의 메시지 동시 처리 가능
효율성 - 충돌이 적은 환경에서 효율적
- 낮은 자원 소모
- 충돌이 많은 환경에서 안전함
- 자원 사용량 증가
- 실시간 성능과 효율성 높음
- 트래픽 많은 서비스에 적합
- 대규모 분산 처리에 효율적
- 데이터 파이프라인에 적합

| 주요 API 및 동시성 제어 포인트

  • 유저 토큰 발급
  • 예약 가능 날짜 / 좌석 조회
  • 좌석 예약: 빈 좌석을 조회 할 때
  • 잔액 충전: 중복 충전 이슈(`따닥` 문제)
  • 좌석 결제: 중복 결제 이슈

| 시나리오

구분 비관락 낙관락
시나리오 - 요청자는 전부 성공
- 정책에 따른 예외자는 실패해야 함
- 요청자는 최초 1명
- 이외 동시 예약자는 실패해야 함
- 성능상으로 비관락 보다 낙관락이 더 빠를 것으로 예상

| 실행결과

구분 좌석예약 잔액 충전 결제
비관락 1 sec 526 ms 1 sec 859 ms 1 sec 046 ms
낙관락 1 sec 2 ms 965 ms 1 sec 372 ms

(3회 평균 속도)

 

| 실행 후 시나리오 비교

구분 비관락 낙관락
시나리오 - 요청자는 전부 성공
- 정책에 따른 예외자는 실패해야 함
- 요청자는 최초 1명만 성공해야함
- 이외 동시 예약자는 실패해야 함
- 성능상으로 비관락 보다 낙관락이 더 빠를 것으로 예상
실제 - 시나리오와 동일 - 비교적 적은 스레드에서는 시나리오와 일치하였음
- 스레드 수를 100개 이상 늘리면, 30여개정도가 추가 성공
 

| 알게된 점

낙관락에서의 발생한 예상 밖의 결과는,
아무리 동시에 스레드가 버전을 조회한다고 하더라도, 조회의 시점 차이가 발생할 수밖에 없다.
따라서, 앞쪽에 들어온 스레드가 버전을 증가시키고, 나중에 들어온 스레드는 증가된 버전을 조회하고-매칭하기 때문에 정상으로 처리된다.