DynamoDB에서 동시 업데이트를 처리하는 모범 사례
분산 시스템에서는 여러 프로세스 또는 사용자가 동시에 동일한 데이터를 수정하려고 시도할 수 있습니다. 동시성 제어가 없으면 이러한 동시 쓰기로 인해 업데이트 손실, 일관되지 않은 데이터 또는 레이스 조건이 발생할 수 있습니다. DynamoDB는 동시 액세스를 관리하고 데이터 무결성을 유지하는 데 도움이 되는 여러 메커니즘을 제공합니다.
참고
UpdateItem과 같은 개별 쓰기 작업은 원자성이며 동시성에 관계없이 항상 항목의 최신 버전에서 작동합니다. 다른 프로세스에서 읽기와 쓰기 간에 항목을 수정할 수 있으므로 애플리케이션이 항목을 읽고 읽기 값(read-modify-write 주기)을 기반으로 다시 기록해야 하는 경우 잠금 전략이 필요합니다.
동시 업데이트를 처리하기 위한 두 가지 기본 전략이 있습니다.
-
낙관적 잠금 - 충돌이 드물다고 가정합니다. 동시 액세스를 허용하고 조건부 쓰기를 사용하여 쓰기 시 충돌을 감지합니다. 충돌이 감지되면 쓰기가 실패하고 애플리케이션이 다시 시도할 수 있습니다.
-
비관적 잠금 - 충돌이 발생할 가능성이 있다고 가정합니다. 리소스를 수정하기 전에 리소스에 대한 독점 액세스 권한을 획득하여 동시 액세스를 방지합니다. 다른 프로세스는 잠금이 해제될 때까지 기다려야 합니다.
다음 표에는 DynamoDB에서 사용할 수 있는 접근 방식이 요약되어 있습니다.
| 접근 방식 | 메커니즘 | 최적의 용도 |
|---|---|---|
| 낙관적 잠금 | 버전 속성 + 조건부 쓰기 | 낮은 경합, 저렴한 재시도 |
| 비관적 잠금(트랜잭션) | TransactWriteItems |
다중 항목 원자성, 중간 경합 |
| 비관적 잠금(클라이언트 잠금) | 리스 및 하트비트가 있는 전용 잠금 테이블 | 장기 실행 워크플로, 분산 조정 |
동시성 제어 전략 선택
다음 지침에 따라 워크로드에 적합한 접근 방식을 선택합니다.
- 다음과 같은 경우 낙관적 잠금을 사용합니다.
-
충돌이 자주 발생하지 않습니다.
실패한 쓰기를 재시도해도 비용 부담이 적습니다.
한 번에 하나의 항목을 업데이트합니다.
- 다음과 같은 경우 트랜잭션을 사용합니다.
-
여러 항목을 원자적으로 업데이트해야 합니다.
항목 또는 테이블에 모두 또는 양자택일 의미 체계가 필요하지 않습니다.
단일 작업에서 조건 확인을 쓰기와 결합해야 합니다.
- 다음과 같은 경우 잠금 클라이언트를 사용합니다.
-
분산 프로세스 전반에 걸쳐 외부 리소스에 대한 액세스를 조정해야 합니다.
중요한 섹션은 장기 실행이며 충돌에 대한 재시도 비용이 많이 듭니다.
프로세스 실패를 처리하려면 자동 잠금 만료가 필요합니다.
참고
DynamoDB 글로벌 테이블을 사용하는 경우 글로벌 테이블은 동시 업데이트에 ‘마지막 작성자 성공’ 조정 전략을 사용한다는 점에 유의하세요. 한 리전의 쓰기가 버전 확인 없이 다른 리전의 동시 쓰기를 덮어쓸 수 있으므로 버전 번호를 사용한 낙관적 잠금은 리전 전체에서 예상대로 작동하지 않습니다. 글로벌 테이블을 사용할 때 애플리케이션 수준에서 충돌을 처리하도록 애플리케이션을 설계합니다.