중급6분 분량

DynamoDB의 싱글톤 항목

싱글톤 항목은 다음을 보유하는 고정된 하드코딩 키가 있는 단일 행입니다. 전체 애플리케이션에 대한 상태 — 사용자당 또는 주문당 하나의 기록이 아니라 하나 레코드, 마침표. 기능 플래그, 구성 blob, 전역 킬 스위치: 관계형 앱이 1행 설정 테이블에 보관하는 것과 같습니다.

SQL에서 id = 1SELECT * FROM config가 포함된 config 테이블에 도달하게 됩니다. DynamoDB에서는 하드코딩된 파티션으로 동일한 작업을 수행합니다. 키 — 그리고 여러분은 항상 그 키를 알고 있기 때문에 GetItem로 읽습니다. Query 또는 Scan.

DynamoDB의 싱글톤 항목이란 무엇입니까?

싱글톤 항목은 사용자 또는 주문당 하나의 레코드가 아니라 전체 애플리케이션(기능 플래그, 구성 Blob, 시스템 전체 버전)에 대한 전역 상태를 유지하는 고정된 하드코딩 키 아래에 저장된 단일 DynamoDB 행입니다. 키를 항상 알고 있으므로 GetItem로 읽고 에 조건식을 더해 업데이트합니다.

  • 싱글톤은 상수 키가 있는 하나의 항목입니다. PK/SK을 하드코딩합니다. 사용자 또는 주문 ID에 템플릿을 작성하는 대신 코드(예: CONFIG#GLOBAL)에 입력하세요.
  • GetItem로 읽으세요. 절대로 Scan로 읽지 마세요. 항상 전체 키를 알고 있으므로 포인트 읽기에는 균일하고 예측 가능한 비용(소형 항목의 경우 최대 1RCU)이 있습니다. 필터도 없고 테이블 워크도 없습니다.
  • 정의상 입니다. 모든 요청은 동일한 파티션에 접근할 수 있습니다. 따라서 캐시하고 항목을 작게 유지하십시오. 쓰기 병목 현상을 일으키지 마십시오.
  • 읽기-수정-쓰기가 아닌 업데이트 + 조건식으로 안전하게 변경 앱에서 — 업데이트 손실 경쟁이 일어나는 곳입니다.

패턴 인식

데이터 범위가 어느 하나의 엔터티로 지정되지 않으면 전역 상태가 됩니다. 몇 가지 내용은 다음과 같습니다.

  • 누구에게나 똑같은 깃발(signup_enabled = false).
  • 부팅 시 앱이 읽는 조정 가능 항목의 덩어리입니다(속도 제한, 기본 할당량).
  • 행별이 아닌 전체 시스템에 대한 카운터 또는 버전 번호입니다.

사용자, 테넌트 또는 주문으로 범위가 지정된 모든 항목은 싱글톤이 아닙니다. 해당 엔터티의 ID로 입력되는 일반 항목입니다. 싱글턴은 남은 전역변수입니다. 더 이상 살 곳이 없는 조각.

상수 키 제공

전체 패턴은 하나의 결정에 달려 있습니다. 즉, 키는 템플릿이 아니라 문자 그대로입니다. 오버로드된 단일 테이블의 전역 기능 플래그 항목의 경우 고정 항목을 선택하세요. 접두사 및 고정 값:

PKSKattributes
SETTINGS#APPFLAGS#V1signup_enabled, maintenance_mode, ai_search_enabled

PK = "SETTINGS#APP"SK = "FLAGS#V1"이 코드에 포함됩니다. 없다 사용자 ID, 테넌트 ID 없음 - 애플리케이션은 매번 정확히 이 항목을 요청합니다. 그 예측 가능성이 핵심입니다. 알려진 키는 GetItem이고 GetItem입니다. DynamoDB가 제공하는 가장 저렴하고 일관된 읽기 기능입니다.

V1 접미사는 의도적인 것입니다. 나중에 플래그 스키마의 모양이 변경되면 다음과 같이 작성합니다. FLAGS#V2 항목을 선택하고 리더를 뒤집는 대신 실제 항목을 변경하는 대신 장소. 싱글톤 키 버전 관리를 통해 깔끔한 마이그레이션 이음매를 확보할 수 있습니다.

GetItem으로 읽기

키가 완전히 알려져 있기 때문에 결코 Query도 아니고 Scan도 아닙니다. 싱글턴. Scan은 전체 테이블을 읽고 클라이언트 측을 필터링합니다. Scan footgun — 그리고 가져오기에는 터무니없는 과잉입니다 한 행에 직접 주소를 지정할 수 있습니다.

SETTINGS#APP / FLAGS#V1에 대한 GetItem는 단일 플래그를 반환합니다. 강력하게 또는 최종적으로 일관된 읽기. us-east-1의 온디맨드에 따라 AWS는 다음을 청구합니다. 항목 중 GetItem4KB, 0.5 RCU 최종 일관성 또는 1 RCU 강력한 일관성 (AWS read/write capacity docs). 싱글톤을 작게 유지하면 비용이 영원히 그대로 유지됩니다. 구성이 비대해집니다. 두 번째 4KB 블록에 블롭하면 청구된 읽기 양이 두 배가 됩니다.

읽기 경로는 다음과 같습니다. 앱이 부팅되거나 요청이 도착하면 고정됩니다. 키를 사용하면 결과를 캐시합니다. 흐름:

yesno / 요청GetItem PK=SETTINGS#APPSK=FLAGS#V1아이템을 찾았나?플래그 사용, 로컬 캐시안전한 기본값으로 폴백

고정 키는 전역 조회를 내장된 기본 경로를 사용하여 단일 지점 읽기로 전환합니다.

no 분기에 유의하세요. 누락된 싱글톤이 절대로 충돌해서는 안 됩니다. 기본값은 안전한 값(기능 꺼짐, 유지 관리 켜짐)이므로 첫 번째 배포 간격 또는 불량 키가 닫히지 않고 열리지 않습니다.

경주 없이 업데이트

트랩은 앱에서 읽기-수정-쓰기로 싱글톤을 업데이트하고 있습니다. GetItem 플래그를 메모리에서 하나 뒤집은 다음 PutItem 전체를 다시 되돌립니다. 두 명의 동시 작성자가 모두 이전 항목을 읽고 두 번째 Put가 첫 번째 변화. 업데이트가 손실되었습니다.

두 가지 DynamoDB 기능은 앱 측 잠금 없이 경쟁을 종료합니다.

  • 서버 측 속성 하나를 변경하고 나머지는 그대로 둡니다. 손대지 않은. 전체 항목을 다시 Put할 필요가 없습니다.
  • 항목이 여전히 보이는 경우에만 쓰기가 성공하도록 합니다. 예상한 대로 오래된 쓰기가 거부됩니다. ConditionalCheckFailedException (AWS condition expression docs).

하나의 플래그를 뒤집으려면 SET로 해당 속성을 대상으로 하고 동시 작성자가 서로를 짓밟을 수 없도록 버전 범프:

# UpdateItem
Key                  PK=SETTINGS#APP  SK=FLAGS#V1
UpdateExpression     SET signup_enabled = :on, schema_version = :next
ConditionExpression  schema_version = :current

두 명의 작성자가 경쟁하면 두 번째 작성자의 schema_version = :current 확인이 실패합니다. 새로운 값에 대해 재시도합니다. 이름, 값 및 이 정확한 표현 형태는 DynamoDB Expression Builder 배선 전 코드로 변환합니다. 연산자에 대한 자세한 내용은 다음을 참조하세요. update-expression idioms 가이드.

단축키에 주의하세요

싱글톤은 기본적으로 단축키입니다. 앱의 모든 부분이 읽을 수 있습니다. 같은 파티션. 캐시하면 읽기에는 괜찮지만 실제로는 그렇습니다. 패턴의 위험성

  • 적극적으로 캐시합니다. 플래그를 프로세스당(또는 N초마다) 한 번씩 읽습니다. 모든 요청에. 싱글톤의 값이 가장 저렴하게 기억됩니다.
  • 쓰기 핫스팟으로 만들지 마세요. 관리자가 하루에 몇 번씩 플래그를 전환합니다. 아무것도 아니다. 요청이 있을 때마다 증가하는 싱글톤은 파티션 처리량입니다. 병목 현상 — 이는 싱글톤이 아닌 카운터 문제입니다.
  • 작게 유지하세요. 읽기 비용은 항목 크기(4KB 블록)에 따라 달라집니다. 부풀어 오른 config blob을 사용하면 모든 부팅 비용이 필요한 것보다 더 비쌉니다.

쓰기량이 많은 글로벌 카운터가 정말로 필요한 경우 싱글톤은 잘못된 것입니다. 모양 — N개 항목으로 분할하고 읽기 시 합계를 냅니다. 그것은 다른 패턴입니다.

싱글톤 대 엔터티별 항목

이 줄은 단순히 _데이터의 범위가 무엇인지_입니다.

싱글톤 항목엔터티별 항목
열쇠하드코드된 상수(SETTINGS#APP)ID(USER#42)로 템플릿화됨
얼마나정확히 하나사용자/주문/테넌트당 하나
일반적인 읽기알려진 키의 GetItem엔터티별 GetItem 또는 Query
범위전체 지원서단일 엔터티
사용 대상글로벌 플래그, 구성, 시스템 버전프로필, 주문, ID별 모든 항목

같은 종류의 _두_개의 싱글톤을 원하는 경우에는 싱글톤 — 엔터티별 항목이 있고 엔터티는 잊어버린 항목입니다. (예를 들어 테넌트별 구성)을 기준으로 합니다.

함정과 다음 단계

  • Scan 하지 마세요. 당신은 열쇠를 알고 있습니다; 직접 해결하세요.
  • 읽고 수정하고 쓰지 마세요. 업데이트 + 조건식을 사용하세요.
  • 조용히 누락되지 않도록 하세요. 캐시 누락 시 안전한 값이 기본값으로 설정됩니다.
  • 빈도가 높은 쓰기로 오버로드하지 마세요. 이는 샤딩된 카운터 작업입니다.

싱글톤은 다음 집에서 편안하게 산다. single-table design — 항목이 하나 더 있습니다 엔터티 행과 함께 고정 키가 있는 컬렉션입니다.

Try DynoTable 테이블을 탐색하려면 해당 항목으로 싱글톤 행을 찾으세요. 고정 키를 사용하고 쓰기 경로를 구축하는 동안 플래그를 직접 편집합니다.

업데이트됨