DynamoDB GSI Read Consistency

Wonwoo Seo·2024년 1월 11일

Global Secondary Index

DynamoDB 테이블에 생성 가능한 글로벌 보조 인덱스(Global Secondary Index)는 파티션 키를 테이블과 다르게 설정할 수 있어 다양한 속성에 대해 쿼리가 필요한 경우에 대응할 수 있다.

다만 GSI의 제약 중 하나가 Strongly Consistent Read가 불가능하다는 것인데, 이는 GSI에 실행한 읽기 작업의 결과에 최근에 완료된 쓰기 작업의 내용이 반영되지 않을수도 있음을 의미한다.

Read Consistency 관련 AWS Documentation

문서상에는 일반적으로 1초 내에 테이블에 일어난 변경사항이 GSI로 전파된다고 하는데, 긴 시간은 아니지만 데이터의 부정합으로 인한 이슈가 발생할 가능성은 충분히 존재한다고 볼 수 있다.

Consistency Issue

최근 진행한 작업 중 GSI에서 데이터를 폴링 해 읽어와 처리 후 완료상태로 업데이트하는 패턴의 배치 프로그램을 작성하였는데, 빠른 처리를 위해 모든 데이터의 처리를 완료한 이후 별도의 대기시간 없이 바로 다음 데이터를 읽어오는 형태로 코드를 작성했다가 위 이슈를 만날 수 있었다.

pseudocode로 표현하자면 아래와 같은데,

1  while true:
2      query unprocessed data
3      if nothing was queried:
4          sleep and continue to next loop
5      for each item in queried unprocessed data:
6          process
7          update item as processed

읽어온 데이터 중 마지막 항목을 처리후 업데이트(7번 줄)한 이후에 다시 데이터를 쿼리했을 때(2번 줄) 간헐적으로 방금 처리했던 데이터가 다시 쿼리 결과에 포함되어 돌아와 중복 처리되는 현상이 발생했다.

이처럼 실제로도 발생하기 쉬운 이슈이기 때문에 GSI에서 데이터를 읽어와 테이블을 업데이트하는 경우에는 각별한 주의가 필요하다.

profile
Blockchain / Backend Developer

0개의 댓글