SpringBoot

코리아노 BeanPay 고민

코카멍멍 2024. 4. 17. 23:41
반응형

빈페이로 결제하게 된 이유

서비스내의 결제 로직과 외부 API를 통한 충전로직을 분리함으로 써 외부 API에서 발생했을때 문제와 결제 기능과 분리할 수 있기 때문입니다! 또한 결제를 진행하는 중에는 외부API를 연동하지 않기 때문에 사용자의 경험을 향상시키고 결제 프로세스를 간소화할 수 있습니다.

서비스 자체 포인트인 빈페이를 관리하는 방법

  1. 유저 MSA에 beanpay 컬럼을 두어 결제 MSA API 요청을 통해 관리한다.
  2. 결제 MSA에 BeanPay 테이블과 BeanPay 상세 테이블을 두어 관리한다.

1. 유저 MSA에 beanpay 컬럼을 두어 결제 MSA API 요청을 통해 관리한다.

결제 MSA에서 출금, 결제, 환불, 사용 과 같은 행위를 할 때 유저 MSA에게 요청을 하고 로직을 수행합니다. 하지만 이러한 방식은 하나의 Transaction으로 묶이기 어렵고 롤백 처리도 직접 처리해줘야 합니다. 또한 정합성을 위해 비관적 락을 사용하거나 분산락을 사용하게 되면 회원의 읽기 성능도 떨어지게 됩니다.

2. 결제 MSA에 BeanPay 테이블과 BeanPay 상세 테이블을 두어 관리한다.

결제 MSA에서 빈페이의 총 금액을 관리함으로써 하나의 트랜잭션으로 로직을 처리할 수 있고비관적 락을 적용하여 높은 정합성을 보장할 수 있습니다.

2번 선택 이유

  1. 회원에 불필요한 비관적락을 통해 조회 처리량이 감소합니다
  2. 결제 MSA에서 관리함으로써 데이터베이스의 트랜잭션을 사용할 수 있습니다
  3. 결제 파트에서 금액을 관리하는게 빈페이의 응집성이 높아지기 때문입니다
  4. 회원에서 관리하면 빈페이의 증감이 있을 때마다 API 호출이 발생합니다

데이터의 정합성을 유지하기 위한 방법

Redis를 활용한 분산락

  • 단일 스레드 환경이기 때문에 동시성 문제가 발생하지 않습니다
  • 데이터베이스가 여러개여도 Lock을 구현할 수 있습니다
  • 락을 획득하고 해제하고 예외상황에 대한 로직을 직접 작성해야 합니다

데이터베이스의 Lock 활용

  • 비관적 Lock(베타 락): 정합성이 매우 중요한 결제 파트에서는 처리량을 낮춰도 Phantom readLost update가 발생하지 않아 적절합니다.
  • 낙관적 Lock: 판매량이 많은 판매자의 경우 BeanPay가 동시에 변경될 가능성이 있어 적절하지 않습니다.
  • 데이터베이스 샤딩을 적용할 때 수평적 확장을 하기 때문에 Lock의 어려움 발생 합니다.

 

Redis 분산락 사용한 이유

데이터베이스를 샤딩하거나 스케일 아웃하는 분산환경일 때 분산락을 적용하면 각 서버가 동일한 락을 공유하고 상호 배제적으로 작업할 수 있기 때문입니다.

 

https://github.com/Team-Koreano/Koreano

반응형