Dynamo (1)

💻 Programming

[AWS DynamoDB] Conditional Check Failed Exception

현재 AWS 다이나모 DB를 이용해서 작업하는 부분이 있는데 

레가시 코드의 dynamoDB에 저장하는 부분에서 

ConditionalCheckFailedException 예외를 잡아서 debug 로깅을 하고 있는 부분이 있었다. 

 

이걸 왜 error 레벨로 로깅하지 않고 debug 레벨로 로깅을 하고 무시하고 있을까? 

실제로 얼마나 해당 로그가 남는지 확인해보니 매일 같이 10번 이상 발생하고 있었다. 

우선 throughput은 전혀 상관이 없어보였다.

stackoverflow를 찾아봐도 딱히 시원한 답을 얻을 수는 없었는데

그러다가 AWS 공식 문서를 찾게 되었다.

AWS DynamoDB Conditional Constraints

 

키포인트 한줄만 발췌해보면 아래와 같다.

You could specify a version attribute for your mapped objects, and the mapper would automatically apply conditional constraints to give you optimistic locking, but you couldn’t explicitly specify your own custom conditional constraints with the mapper.

 

위 페이지를 읽어보면 

dynamo DB는 기본적으로 version을 기준으로 logical condition을 검사한 뒤 

테이블에 데이터를 저장한다고 나와있다. 

실제 legacy코드에도 기존 데이터를 조회해서 version을 읽어와서 

새 데이터 입력할 때 세팅해주고 있었다. 

ok 그럼 뭔가 version충돌로 인해 데이터를 저장하지 못하고 있다는 추측을 해볼 수 있었다. 

왜 충돌이 날까? 

분산시스템에서 동일한 데이터의 업데이트 요청을 동시에 여러 개 받게 되면?

dynamo 테이블의 동일한 데이터를 동시에 업데이트를 하려고 시도를 하게 될 텐데,

실제로 업데이트 하기 전에 기존 version을 조회해와서 신규 데이터에 version 세팅을 해주고

업데이트를 시도하는데 처음 업데이트 시도는 성공! (이때 해당 데이터는 version이 올라가게 된다)

그 이후는 version충돌로 ConditionalCheckFailedException 예외가 발생하게 되는 것이다.