반응형
빈페이로 결제하게 된 이유
서비스내의 결제 로직과 외부 API를 통한 충전로직을 분리함으로 써 외부 API에서 발생했을때 문제와 결제 기능과 분리할 수 있기 때문입니다! 또한 결제를 진행하는 중에는 외부API를 연동하지 않기 때문에 사용자의 경험을 향상시키고 결제 프로세스를 간소화할 수 있습니다.
서비스 자체 포인트인 빈페이를 관리하는 방법
- 유저 MSA에 beanpay 컬럼을 두어 결제 MSA API 요청을 통해 관리한다.
- 결제 MSA에 BeanPay 테이블과 BeanPay 상세 테이블을 두어 관리한다.
1. 유저 MSA에 beanpay 컬럼을 두어 결제 MSA API 요청을 통해 관리한다.
결제 MSA에서 출금, 결제, 환불, 사용 과 같은 행위를 할 때 유저 MSA에게 요청을 하고 로직을 수행합니다. 하지만 이러한 방식은 하나의 Transaction으로 묶이기 어렵고 롤백 처리도 직접 처리해줘야 합니다. 또한 정합성을 위해 비관적 락
을 사용하거나 분산락
을 사용하게 되면 회원의 읽기 성능도 떨어지게 됩니다.
2. 결제 MSA에 BeanPay 테이블과 BeanPay 상세 테이블을 두어 관리한다.
결제 MSA에서 빈페이의 총 금액을 관리함으로써 하나의 트랜잭션으로 로직을 처리할 수 있고비관적 락
을 적용하여 높은 정합성을 보장할 수 있습니다.
2번 선택 이유
- 회원에 불필요한 비관적락을 통해 조회 처리량이 감소합니다
- 결제 MSA에서 관리함으로써 데이터베이스의 트랜잭션을 사용할 수 있습니다
- 결제 파트에서 금액을 관리하는게 빈페이의 응집성이 높아지기 때문입니다
- 회원에서 관리하면 빈페이의 증감이 있을 때마다 API 호출이 발생합니다
데이터의 정합성을 유지하기 위한 방법
Redis를 활용한 분산락
- 단일 스레드 환경이기 때문에 동시성 문제가 발생하지 않습니다
- 데이터베이스가 여러개여도 Lock을 구현할 수 있습니다
- 락을 획득하고 해제하고 예외상황에 대한 로직을 직접 작성해야 합니다
데이터베이스의 Lock 활용
- 비관적 Lock(베타 락): 정합성이 매우 중요한 결제 파트에서는 처리량을 낮춰도
Phantom read
와Lost update
가 발생하지 않아 적절합니다. - 낙관적 Lock: 판매량이 많은 판매자의 경우 BeanPay가 동시에 변경될 가능성이 있어 적절하지 않습니다.
- 데이터베이스 샤딩을 적용할 때 수평적 확장을 하기 때문에 Lock의 어려움 발생 합니다.
Redis 분산락 사용한 이유
데이터베이스를 샤딩하거나 스케일 아웃하는 분산환경일 때 분산락을 적용하면 각 서버가 동일한 락을 공유하고 상호 배제적으로 작업할 수 있기 때문입니다.
반응형
'SpringBoot' 카테고리의 다른 글
BeanPay Detail 삭제 이유 (0) | 2024.06.03 |
---|---|
락 선택 이유와 성능 테스트 (0) | 2024.04.30 |
[SpringBoot] Spring Batch 이용권 만료 (0) | 2023.12.17 |
[SpringBoot] 스프링 배치란? (0) | 2023.12.16 |
주문내역을 내려줄 때 가격 멱등성에 대한 고민 (0) | 2023.10.29 |