////
Search

25장 - 결제 시스템

생성일
2024/08/26 13:17
태그
Interview

1. 요구사항 정리

아마존과 같은 전자 상거래 애플리케이션을 위한 결제 시스템을 만든다 가정
직접 결제 처리가 아닌 서드파티 시스템 이용
페이-인 흐름 = 결제 시스템이 판매자를 대신해 고객으로부터 대금 수령
페이-아웃 흐름 = 결제 시스템이 전 세계의 판매자에게 제품 판매 대금 송금
결제 실패는 신중하게 처리
내/외부 시스템간 정보가 일치하는지 비동기적으로 확안

1.1. 규모추정

하루 100만 건의 트랜잭션 처리 가정
1,000,000 / 10^5 = 10 TPS

2. 청사진 그리기

이 시스템에서 제일 중요한건 대금의 라이프사이클이다.

2.1. 대금 수신 흐름

결제 서비스가 모든 시스템의 프로세스를 조율한다.
결제 실행자는 서드파티를 실행한다.
원장은 결제 트랜잭션 내역을 모두 보관한다.
오류 발생시 봐야한다! 매우 중요!!
지갑은 판매자의 계정 잔액을 기록한다.
혹은 특정 사용자가 결제한 총 금액을 기록할 수 있다.

2.1.1. 결제 서비스 데이터 모델

당연하지만 안정성이 매우 높고 인력 구하기 까다롭지 않아야 하며 숙련자가 있어야만한다.
각종 관리에 필요한 도구가 풍부해야 한다.
3가지 조건을 들으면 RDB밖에 떠오르지 않는다.

2.1.2. 복식부기 원장 시스템

Double-entry라는 아주 중요한 설계 원칙
결제 시스템에 필수이며 정확한 기록을 남기는 데 핵심적 역할을 한다.
하나의 계좌에선 증가가 다른 하나의 계좌에서는 차감이 이뤄져야 한다.
이 시스템 사용 시 결제의 시작과 끝까지 추적 가능하다.

2.1.3. 외부 결제 페이지

신용카드와 결제는 보안과 법과 같은 까다로운 부분들이 많다.
그러니까 외부 결제 시스템임 PSP에게 이를 떠넘기는게 제일 현명하다.

3. 상세 설계

3.1. PSP 연동

PSP와 결제 시스템은 토큰과 난수값을 통해서 결제를 식별할 수 있다.
난수 값은 결제 번호가 된다.
결제 토큰은 추후 웹훅을 통해서 이벤트 전달 시 해당 토큰으로 결제의 유무를 파악가능하다.

3.2. 조정

비동기적으로 시스템이 통신하는 경우 메시지가 전달되거나 응답이 반환된다는 보장이 없다.
정확성을 조정하기 위해서 주기적으로 서비스간 상태를 비교하여 일치하는지 확인하는 작업을 거친다.
예를 들어 매일 밤 PSP나 은행에게 정산 파일을 받아 결제 시스템과 비교한다.

3.3. 결제 지연 처리

PSP가 결제 위험성이 높다고 보고 담당자 검토를 요구하는 경우
신용 카드사가 추가 정보를 요청하는 3D 보안 인증을 요구하는 경우
대응 방법
사실 위에서 일어난 모든 일들은 PSP가 처리해야 하는 일들이고 우리는 웹훅을 기다리면 된다.
때론 웹훅 대신 폴링 하도록 권장하는 PSP도 있다.

3.4. 내부 시스템 통신

3.4.1. 동기 시스템

성능이 저하되고, 장애 발생 시 격리가 곤란해지고, 결합도가 높아지며, 확장성도 낮아진다.
단점밖에 없네? 팽!

3.4.2. 비동기 통신

그래 이 맛이지
메시지 큐를 통해서 내부 시스템 통신을 진행한다.
단일 서비스가 이를 받아 처리하는 경우 메시지는 한번 받으면 사라진다.
다중 시스템에서 이를 받아서 사용하는 경우 여러 시스템에서 메시지를 받아 사용할 수 있다.

3.5. 결제 실패 처리

결제 상태 추적
실패 이유를 파악하고 재시도 해야한다.

3.6. 이중결제 방지

결제 시스템에서 제일 주의해야할 것은 이중결제다!
때문에 시스템은 정확히 한 번만 전달해야 한다!

3.6.1. 재시도

즉시 재시도(immediate ret1Y): 클라이언트는 즉시 요청을 다시 보낸다.
고정 간격(fixed intewal): 재시도 전에 일정 시간 기다리는 방안이다.
증분 간격(incremental intewal): 재시도 전에 기다리는 시간을 특정한 양 만큼 점진적으로 늘려 나가는 방안이다.
지수적 백오프(exponential backoff): 재시도 전에 기다리는 시간을 직전 재시도 대비 두 배씩 늘려 나가는 방안.
예를 들어, 요청이 처음 실패하면 1초 후에 재시도하고, 두 번째로 실패하면 2초, 세 번째로 실패하면 4초를 기다린 후 재시도한다.
취소(cancel): 요청을 철회하는 방안. 실패가 영구적이거나 재시도를 하더라도 성공 가능성이 낮은 경우에 흔히 사용되는 방안이다.

3.6.2. 멱등성

멱등성은 수학 또는 컴퓨터 과학적 연상이 가질 수 있는 한 가지 속성으로 여러번 실행되어도 최초 실행 결과가 그대로 보존되는 특성
UUID를 통해서 멱등성을 확보하는 경우가 많고 권장된다.