'RCU/WCU'에 해당하는 글 1건



Throughput Capacity


Table 이나 Index 를 생성할 때 읽기(RCU : Read Capacity Units) 및 쓰기(WCU : Write Capacity Units) 에 대한 처리량(capacity) 을 지정해야 한다.

처리량을 미리 정의함으로써, DynamoDB 는 읽기 및 쓰기 작업량에 충족할 만큼의 리소스를 예약하여 일관되고 낮은 대기 시간의 성능을 보장한다.


  • 1 RCU 는 4 KB 크기의 Item 의 경우, 초당 strongly consistent read 1 또는 초당 eventually consistent read 2 를 나타낸다. 4 KB 미만의 Item 은 4 KB 단위로 반올림 된다.
  • 1 WCU 는 1 KB 크기의 Item 의 경우, 초당 쓰기 1 을 나타낸다. 1 KB 미만의 Item 은 1 KB 단위로 반올림 된다.


Secondary Indexes 가 있는 Table 의 경우, Table 용과 별도로 해당 Index 의 RCU/WCU 가 더 필요하다.



Burst Capacity


읽기나 쓰기 요청이 Table 의 프로비저닝된 처리량을 초과하더라도 300초에 해당하는 미사용 용량의 일부를 남겨 두어 어느 정도를 처리해 주는 기능이다

이 용량이 모두 소진된다면 HTTP 400 코드(Bad Request) ProvisionedThroughputExceededException 과 함께 표시되면서 요청이 실패한다.

AWS SDK 에서 제한된 요청을 다시 시도할 수 있으며, 모니터링을 하여 처리량 설정을 변경할 수 있다.

예를 들어, WCU 를 5 로 설정했다고 하자. 

그럼 1초에 5번의 putItem 요청을 처리할 수 있는데, 1초에 1500 개의 요청을 보냈다고 치자.

WCU 처리량의 5 를 넘어서는 순간 바로 에러를 발생시키는게 정상이겠지만, Burst Capacity 덕분에 즉시 처리하지 못하는 요청들은 대기열에 쌓이며 처리될 것이다.

Burst Capacity 의 처리량을 넘어가는 순간 에러를 발생할 것이고, SDK 를 이용하는 경우 에러를 catch 하여 재시도 간 대기 시간을 점진적으로 늘려주는 것이 좋다.
언제 다시 300초의 Burst Capacity 가 충전되는지는 정확하게 알 수 없지만, Burst Capacity 자체가 순간적인 병목현상을 방지하기 위한 기능이니, 이를 활용하여 처리량을 설정하려고 하는 것은 좋지 않다. 일반적으로 에러난지 1분 뒤의 재요청에도 계속해서 에러가 발생한다면 처리량을 높이는 것이 좋다.



Consistent Read


읽기는 두가지 옵션이 있다.


  • Eventually Consistent Read
    DynamoDB 테이블의 데이터를 읽을 때, 응답은 최근 완료된 쓰기 작업에 대해서 부실 데이터가 일부 포함될 수 있다.
    잠시 후 읽기 요청을 반복하면 응답이 최신 데이터를 반환한다.(기본값)

  • Strongly Consistent Read
    strongly consistent read를 요청하면 DynamoDB는 성공한 모든 이전 쓰기 작업의 업데이트를 반영하여 가장 최신 데이터로 응답을 반환한다. 
    API 사용시 ConsistentRead 파라미터를 true 로 설정하면 Strongly Consistent Read 사용.



RCU / WCU 설정 예)


1. 초당 10 개의 Items 를 쓸 것이고, Item 크기가 1.2KB 라고 하면.

  2 (1.2 의 올림) x 10 (초당 write) = 20 WCU 필요


2. 초당 100개의 Items 를 읽을 것이고, Item 크기가 6KB 라고 하면. (GetItem)

  2 (6 / 4 = 1.5 의 올림) * 100 (초당 read) / 1 (strongly consistent read) = 200 RCU 필요

  2 (6 / 4 = 1.5 의 올림) * 100 (초당 read) / 2 (eventually consistent read) = 100 RCU 필요


3. 초당 100개의 Items 을 읽을 것이고, Item 크기가 6KB 라고 하면, (BatchGetItem)

  150 (6 * 100 / 4 = 150 ) / 1 (strongly consistent read) = 150 RCU 필요

  150 (6 * 100 / 4 = 150 ) / 2 (eventually consistent read) = 75 RCU 필요


여러개의 데이터를 효율적으로 가져오는 것은 GetItem < BatchGetItem 임을 알 수 있다.




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,