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

분산 트랜잭션