WiseN

[Re18특집] Amazon DynamoDB Transaction 지원과 On-demand Capacity 업데이트

Dec 20,2018   |   AWS

작성자_김명수

페이스북 공유하기 트위터 공유하기
Blog thumbnail

여기서 다루는 내용


· Intro
· Transaction 기능 소개 및 간단 확인
· On-demand 옵션 소개 및 간단 확인
· 마무리


 




Intro






이번 Re:Invent 2018 에서 Amazon DynamoDB의  Transaction 지원 기능과  On-demand Capacity 모드가 업데이트 되었습니다.

트랜잭션이 필요한 비지니스 로직 구현이 가능해졌고,  On-demand 옵션으로 용량 산정 및 관리의 부담을 줄일 수 있게 되었습니다.

이번 포스팅에서는 해당 업데이트 주요 내용과 기능을 간단 확인 해보겠습니다.

 




Transaction 기능 소개 및 간단 확인






:: 기능 소개



  • ACID(원자성, 일관성, 격리, 영속성) 제공

  • 트랜잭션 단위: 동일 리전 및 단일 AWS 계정

  • 신규 추가 API: TransactWriteItems, TransactGetItems

  • DynamoDB Operation별 Isolation level

















































     Operation  Isolation level
    DeleteItem Serializable
    PutItem Serializable
    UpdateItem Serializable
    GetItem Serializable
    BatchGetItem Read-committed (단, 배치내 개별 작업은 Serializable)
    BatchWriteItem Not Serializable (단, 배치내 개별 작업은 Serializable)
    Query Read-committed
    Scan Read-committed
    TransactWriteItems Serializable
    TransactGetItems Serializable


  • 트랜잭션 prepare 및 commit 용도로 2회 read 또는 write 수행

  • AWS 공식 문서: Link



:: 트랜잭션 기능 간단 확인


간단하게 TransactWriteItems 을 요청해서 트랜잭션이 정상 실행되는지 확인 해 보겠습니다.

테이블 생성 및 초기 데이터 준비



트랜잭션 쓰기 요청

response = client.transact_write_items(
ReturnConsumedCapacity='INDEXES',
TransactItems=[
{
'Update': {
'TableName': table_name,
'Key': {
'name': {'S': 'tester1'}
},
'ConditionExpression': 'age = :ac',
'UpdateExpression': 'SET age = :au',
'ExpressionAttributeValues': {
':ac': {'N': '25'},
':au': {'N': '26'},
}
}
},
{
'Update': {
'TableName': table_name,
'Key': {
'name': {'S': 'tester2'}
},
'ConditionExpression': 'age = :ac',
'UpdateExpression': 'SET age = :au',
'ExpressionAttributeValues': {
':ac': {'N': '30'},
':au': {'N': '31'},
}
}
}
]
)


 

트랜잭션 쓰기 요청 응답
{u'CapacityUnits': 1.0, u'TableName': u'gstest1', u'Table': {u'CapacityUnits': 1.0}}
{'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': 'N10USCNNO3VG2917M5C175A7C3VV4KQNSO5AEMVJF66Q9ASUAAJG', 'HTTPHeaders': {'x-amzn-requestid': 'N10USCNNO3VG2917M5C175A7C3VV4KQNSO5AEMVJF66Q9ASUAAJG', 'content-length': '176', 'server': 'Server', 'connection': 'keep-alive', 'x-amz-crc32': '2753013158', 'date': 'Thu, 20 Dec 2018 07:27:11 GMT', 'content-type': 'application/x-amz-json-1.0'}}, u'ConsumedCapacity': [{u'WriteCapacityUnits': 4.0, u'CapacityUnits': 4.0, u'TableName': u'gstest1', u'Table': {u'WriteCapacityUnits': 4.0, u'CapacityUnits': 4.0}}]}

 

결과 확인



기타 확인

동일 primary 키에 대해 여러개의 update operation을 하나의 write 트랜잭션으로 묶어 봤습니다.

아래와 로그 같이 하나의 item에 여러 operation 사용이 불가능하다는 ValidationException이 발생합니다.
An error occurred (ValidationException) when calling the TransactWriteItems operation: Transaction request cannot include multiple operations on one item

 

하나의 write 트랜잭션에서 여러 update operation을 추가하고 ConditionalCheck 실패를 유발해봤습니다.

아래와 로그 같이 트랜잭션이 취소되었다는 TransactionCanceledException이 발생합니다.
An error occurred (TransactionCanceledException) when calling the TransactWriteItems operation: Transaction cancelled, please refer cancellation reasons for specific reasons  [ConditionalCheckFailed, None]

 




On-demand 옵션 소개 및 간단 확인






:: 기능 소개



  • read/write capacity 계획없이 request를 처리 할 수있는 요금 청구 옵션

  • On-demand로 변환시 인덱스도 동일하게 변환

  • 트래픽이 30분 이내 피크치의 2배를 초과하지 않도록 유의 필요

  • AWS 공식 문서: Link

  • 요금 관련: Link



:: On-demand 생성 및 확인


DynamoDB 테이블 생성시 코드상에서 BillingMode를 'PAY_PER_REQUEST' 로 하여 테이블을 생성하거나 아래 이미지와 같이 Capacity mode 선택 부분에서 On-demand로 체크하여 생성하면 됩니다.

 



 

생성되면 아래 이미지와 같이 On-Demand로 표시되는걸 확인할 수 있습니다.



 

 

생성된 DynamoDB 테이블에 write 요청 건수를 변경해 보았습니다.

아래 이미지와 같이 capacity가 사용량에 따라 변화되는게 확인 됩니다.



 




마무리






트랜잭션 기능이 지원되므로 더 이상 기존 제공되던 awslabs 의 dynamodb-transactions를 사용할 필요가 없고,

On-demand 요금 옵션을 통해 capacity 관리 부분이 수월해졌습니다.