뮤테이션
뮤테이션은 엣지의 삽입, 업데이트, 삭제를 수행합니다. 이 과정은 일관성, 내구성, 쓰기 시점 최적화를 보장합니다.
배경 설명은 핵심 개념을 참조하세요.
뮤테이션 흐름
섹션 제목: “뮤테이션 흐름”flowchart TD
Request([Mutation Request
with Event, Operation]) --> WAL[Write WAL]
WAL --> Lock[Acquire Lock]
Lock --> Read[Read State
from storage]
Read --> Modify{State exists?}
Modify -->|Yes| ApplyEvent[Apply Event]
Modify -->|No| InitialState[Initial State]
InitialState --> ApplyEvent
ApplyEvent --> ComputeAdditionalInfo[Compute Index, Count
based on changed States]
ComputeAdditionalInfo --> Write[Write State with AdditionalInfo
to storage]
Write --> Release[Release Lock]
Release --> CDC[Write CDC]
CDC --> Response([Response])
뮤테이션 요청
섹션 제목: “뮤테이션 요청”뮤테이션 요청에는 다음이 포함됩니다:
- 이벤트: 데이터 변경 사항(예: 새로운 프로퍼티 값, 엣지 생성)
- 작업: 삽입, 업데이트, 삭제
뮤테이션 처리 과정
섹션 제목: “뮤테이션 처리 과정”1. WAL 기록
섹션 제목: “1. WAL 기록”변경 사항이 적용되기 전에 뮤테이션이 WAL에 기록됩니다. 복구 및 재생을 가능하게 합니다.
프로덕션 환경에서는 WAL 백엔드로 Kafka가 사용됩니다.
2. 락 획득
섹션 제목: “2. 락 획득”동시 수정을 방지합니다:
- 고유 엣지: (소스, 타겟)에 대한 락
- 다중 엣지: 엣지 ID에 대한 락
3. 상태 읽기
섹션 제목: “3. 상태 읽기”스토리지에서 현재 상태(프로퍼티, 타임스탬프, 메타데이터)를 읽습니다.
4. 이벤트 적용
섹션 제목: “4. 이벤트 적용”작업 및 클라이언트 타임스탬프에 기반한 전환 상태. 자세한 내용은 상태 전환을 참조하세요.
5. 인덱스 및 카운터 계산
섹션 제목: “5. 인덱스 및 카운터 계산”변경된 상태를 기반으로:
- 인덱스: 기존 인덱스 삭제, 새 인덱스 생성
- 카운터: 증가 또는 감소
6. 스토리지에 쓰기
섹션 제목: “6. 스토리지에 쓰기”상태, 인덱스 및 카운터가 원자적으로 기록됩니다.
7. 락 해제
섹션 제목: “7. 락 해제”쓰기 후 락이 해제됩니다.
8. CDC 기록
섹션 제목: “8. CDC 기록”뮤테이션이 CDC(프로덕션 환경에서는 Kafka)에 기록됩니다. 결과 상태가 다운스트림 시스템에서 사용할 수 있게 됩니다.
상태 전환
섹션 제목: “상태 전환”엣지는 작업(INSERT, DELETE)에 따라 상태가 전환됩니다. 각 이벤트는 클라이언트 타임스탬프를 포함하며, Actionbase는 이 타임스탬프를 사용하여 올바른 최종 상태를 계산합니다. 이는 순서가 뒤바뀐 도착 및 중복 요청(멱등성)에도 적용됩니다.
구현은 State.transit을 참조하세요.
다이어그램
섹션 제목: “다이어그램”flowchart LR
INITIAL[["INITIAL: No Edge"]]
ACTIVE(["ACTIVE: Edge Exists"])
INACTIVE["INACTIVE: Edge Deleted"]
INITIAL -->|"INSERT / +1"| ACTIVE
INACTIVE -->|"INSERT / +1"| ACTIVE
ACTIVE -->|"DELETE / -1"| INACTIVE
예시: 순서가 뒤바뀐 이벤트
섹션 제목: “예시: 순서가 뒤바뀐 이벤트”앨리스의 작업: like(t=100) → unlike(t=200) → like(t=300)
이벤트는 순서가 뒤섞여 도착할 수 있습니다: like(t=100) → like(t=300) → unlike(t=200)
| # | 이벤트 도착 시점 | 상태 | 카운트 변화 | 합계 |
|---|---|---|---|---|
| 1 | like (t=100) | INITIAL → ACTIVE | +1 | 1 |
| 2 | like (t=300) | ACTIVE → ACTIVE | 0 | 1 |
| 3 | unlike (t=200) | ACTIVE → ACTIVE | 0 | 1 |
최종 상태: ACTIVE, 카운트: 1 — 도착 순서와 상관없이 동일한 결과입니다.
쓰기 시점 최적화
섹션 제목: “쓰기 시점 최적화”뮤테이션 동안 Actionbase는 미리 계산합니다:
| 구조 | 목적 | 쿼리 유형 |
|---|---|---|
| EdgeState | 현재 엣지 상태 | GET |
| EdgeIndex | 정렬된 항목 | SCAN |
| EdgeCounter | 집계된 카운트 | COUNT |
읽기는 쿼리 시점의 계산 없이 간단한 GET, COUNT, SCAN을 사용합니다.
일관성 보장
섹션 제목: “일관성 보장”| 메커니즘 | 보장 내용 |
|---|---|
| 락킹 | 동시 수정 방지 |
| 원자적 쓰기 | 상태와 인덱스가 함께 기록됨 |
| WAL | 내구성 및 복구 |
| Read-Modify-Write | 최신 상태를 기반으로 한 뮤테이션 |
| State Transitions | 이벤트 도착에도 불구하고 올바른 최종 상태 유지 |
| Idempotency | 재실행해도 동일한 결과 생성 |
다음 단계
섹션 제목: “다음 단계”(이 문서는 Kanana-2로 번역되었습니다. 번역 기여를 환영합니다!)