DynamoDB에서 동시 업데이트를 처리하는 모범 사례 - Amazon DynamoDB

DynamoDB에서 동시 업데이트를 처리하는 모범 사례

분산 시스템에서는 여러 프로세스 또는 사용자가 동시에 동일한 데이터를 수정하려고 시도할 수 있습니다. 동시성 제어가 없으면 이러한 동시 쓰기로 인해 업데이트 손실, 일관되지 않은 데이터 또는 레이스 조건이 발생할 수 있습니다. DynamoDB는 동시 액세스를 관리하고 데이터 무결성을 유지하는 데 도움이 되는 여러 메커니즘을 제공합니다.

참고

UpdateItem과 같은 개별 쓰기 작업은 원자성이며 동시성에 관계없이 항상 항목의 최신 버전에서 작동합니다. 다른 프로세스에서 읽기와 쓰기 간에 항목을 수정할 수 있으므로 애플리케이션이 항목을 읽고 읽기 값(read-modify-write 주기)을 기반으로 다시 기록해야 하는 경우 잠금 전략이 필요합니다.

동시 업데이트를 처리하기 위한 두 가지 기본 전략이 있습니다.

  • 낙관적 잠금 - 충돌이 드물다고 가정합니다. 동시 액세스를 허용하고 조건부 쓰기를 사용하여 쓰기 시 충돌을 감지합니다. 충돌이 감지되면 쓰기가 실패하고 애플리케이션이 다시 시도할 수 있습니다.

  • 비관적 잠금 - 충돌이 발생할 가능성이 있다고 가정합니다. 리소스를 수정하기 전에 리소스에 대한 독점 액세스 권한을 획득하여 동시 액세스를 방지합니다. 다른 프로세스는 잠금이 해제될 때까지 기다려야 합니다.

다음 표에는 DynamoDB에서 사용할 수 있는 접근 방식이 요약되어 있습니다.

접근 방식 메커니즘 최적의 용도
낙관적 잠금 버전 속성 + 조건부 쓰기 낮은 경합, 저렴한 재시도
비관적 잠금(트랜잭션) TransactWriteItems 다중 항목 원자성, 중간 경합
비관적 잠금(클라이언트 잠금) 리스 및 하트비트가 있는 전용 잠금 테이블 장기 실행 워크플로, 분산 조정

동시성 제어 전략 선택

다음 지침에 따라 워크로드에 적합한 접근 방식을 선택합니다.

다음과 같은 경우 낙관적 잠금을 사용합니다.
  • 충돌이 자주 발생하지 않습니다.

  • 실패한 쓰기를 재시도해도 비용 부담이 적습니다.

  • 한 번에 하나의 항목을 업데이트합니다.

다음과 같은 경우 트랜잭션을 사용합니다.
  • 여러 항목을 원자적으로 업데이트해야 합니다.

  • 항목 또는 테이블에 모두 또는 양자택일 의미 체계가 필요하지 않습니다.

  • 단일 작업에서 조건 확인을 쓰기와 결합해야 합니다.

다음과 같은 경우 잠금 클라이언트를 사용합니다.
  • 분산 프로세스 전반에 걸쳐 외부 리소스에 대한 액세스를 조정해야 합니다.

  • 중요한 섹션은 장기 실행이며 충돌에 대한 재시도 비용이 많이 듭니다.

  • 프로세스 실패를 처리하려면 자동 잠금 만료가 필요합니다.

참고

DynamoDB 글로벌 테이블을 사용하는 경우 글로벌 테이블은 동시 업데이트에 ‘마지막 작성자 성공’ 조정 전략을 사용한다는 점에 유의하세요. 한 리전의 쓰기가 버전 확인 없이 다른 리전의 동시 쓰기를 덮어쓸 수 있으므로 버전 번호를 사용한 낙관적 잠금은 리전 전체에서 예상대로 작동하지 않습니다. 글로벌 테이블을 사용할 때 애플리케이션 수준에서 충돌을 처리하도록 애플리케이션을 설계합니다.