TIL

12장 전자 지갑

1단계: 문제 이해 및 설계 범위 확정

2단계: 개략적 설계안 제시 및 동의 구하기

API 설계

// request
{
	"from_account": "...", // 인출할 계좌
	"to_account": "...", // 이체할 계좌
	"amount": "...", // 이체 금액
	"currency": "...", // 통화 단위
	"transaction_id": "..." // 중복 제거에 사용할 ID
}

인메모리 샤딩

graph LR
    A(이체 명령) -->|이체 요청| B[지갑서비스]
    B -->|파티션 조회| C[(주키퍼)]
    C -->|노드 정보 반환| B
    B <-->|-1$| D[레디스_A_잔액]
    B <-->|+1$| E[레디스_B_잔액]

분산 트랜잭션: 2단계 커밋

sequenceDiagram
    participant 조정자(지갑서비스)
    participant A_DB
    participant C_DB

    조정자(지갑서비스)->>A_DB: Write Data (Lock)
    조정자(지갑서비스)->>C_DB: Write Data (Lock)

    조정자(지갑서비스)->>A_DB: Prepare
    조정자(지갑서비스)->>C_DB: Prepare

    alt All DBs respond OK
        A_DB->>조정자(지갑서비스): OK
        C_DB->>조정자(지갑서비스): OK
        조정자(지갑서비스)->>A_DB: Commit
        조정자(지갑서비스)->>C_DB: Commit
    else Any DB responds NO
        A_DB->>조정자(지갑서비스): NO (or timeout)
        C_DB->>조정자(지갑서비스): NO (or timeout)
        조정자(지갑서비스)->>A_DB: Rollback
        조정자(지갑서비스)->>C_DB: Rollback
    end

분산 트랜잭션: TC/C

단계 A C
1(시도) - 1$ 아무것도 하지 않음
2(확정 절차) 아무것도 하지 않음 + 1$
2(취소 절차) + 1$ 아무것도 하지 않음

분산 트랜잭션: 사가

  TC/C 사가
보상 트랜잭션 실행 취소 단계 롤백 단계
중앙 조정 예(중앙 집중형에서만)
작업 실행 순서 임의 선형
병렬 실행 가능성 아니요(선형적)
일시적으로 일관성 깨진 상태 허용
구현 계층 애플리케이션 애플리케이션

이벤트 소싱

graph TD
    A(Command) --> B([State Machine])
    B -->|1 읽기| C[(State)]
    B -->|2 유효성 검사| D[Event]
    D --> E([State Machine])
    E -->|3 적용| C

3단계: 상세 설계

고성능 이벤트 소싱

신뢰할 수 있는 고성능 이벤트 소싱

풀 모델 vs 푸시 모델

graph LR
    A(Client)
    B[명령]
    C([상태 머신])
    D[[이벤트]]
    E([상태 머신])
    F[(상태)]
    G([읽기 전용 상태 머신])
    H[(읽기 모델)]
    I(리버스 프록시)
    
    A -->|명령| I
    I -->|응답| A
    I --> B --> C --> D --> E --> F
    D --> G --> H
    H -->|최신 상태 실시간 푸시| I

분산 트랜잭션