온디맨드는 용량 계획 없이 초당 수천개의 요청을 처리 가능 읽기 및 쓰기 요청에 대해 요청당 지불 가격을 제공하기 때문에 사용하는 만큼 비용을 지불하면 되는 모드입니다.
온디맨드는 사용한 만큼만 가격을 지불하는 방식입니다. 많은 트래픽 요청이 발생하면 이전에 도달한 최대 트래픽 수준까지 확장됩니다. 만약 이전에 도달한 최대 트래픽을 넘는다면 새롭게 피크 트래픽이 경신되고 신속하게 해당 트래픽을 처리 할 수 있을 만큼 확장됩니다. 기존의 피크 트래픽을 기억하고 트래픽이 몰리게 되면 이전에 사용했던 만큼 크기를 확장시켜 트래픽을 처리합니다. 만약에 이전보다 더 많은 요청이 들어온다면 피크 트래픽을 갱신합니다. 피크 트래픽이 갱신될 경우 이전의 2배에 해당하는 크기로 자동 조정됩니다.
Ex) 이전 피크 트래픽: 50 -> 피크 트래픽이 갱신되면 즉시 100까지 피트 트래픽으로 설정되고 수용이 가능하다.
현재 피크 트래픽을 30으로 가정해보자
10시~ 13시까지 트래픽이 20이하로 유지되었다 : 트래픽을 20이하로 자동으로 관리
14시에 갑작스럽게 25의 트래픽이 발생하였다 : 이전에 한번 달성하였던 피크 트래픽인 30이하인 25까지 빠르게 확장하여 트래픽에 자동으로 대처
16시에 50의 트래픽이 발생하였다 : 기존의 피크 트래픽을 갱신한 수치이기 때문에 30에서 60으로 피트 트래픽이 수정된 후에 50의 트래픽을 자동으로 대처
20시에 250의 트래픽이 발생하였다 : 기존의 피크 트래픽인 60보다 높기 때문에 피트 트래픽을 갱신한다 60-> 120 그러나 여전히 피크 트래픽 갱신이 필요하다 120-> 240 여기서 또한번의 피크 트래픽의 갱신이 필요하다 240-> 480
여기서 발생하는 문제의 처리 방법 https://aws.amazon.com/ko/premiumsupport/knowledge-center/on-demand-table-throttling-dynamodb/
Ex) 이전 피크 트래픽: 50 -> 피크 트래픽이 갱신되면 즉시 100까지 피트 트래픽으로 설정되고 수용이 가능하다.
온디맨드 모드의 최소의 피크 트래픽은 2000회의 쓰기와 6000회 읽기 요청 단위를 가지고 있습니다. 따라서 새로운 테이블을 생성한다면 새로 생성된 테이블의 피크 트래픽은 2000회의 쓰기의 2배인 4000회 6000회의 읽기의 2배인 12000회로 설정됩니다.
프로비저닝된 모드는 애플리케이션에 필요한 초당 읽기 및 쓰기 횟수를 지정합니다. Auto Scaling을 사용하여 트래픽 변경에 따라 테이블의 프로비저닝된 용량을 자동으로 조정할 수 있습니다. 프로비저닝된 모드를 사용하면 비용을 예측하는데 많은 도움이 됩니다.
프로비저닝된 모드는 애플리케이션 트래픽이 예측이 가능한 경우에 사용이되고 트래픽이 일관되거나 점진적으로 변화하는 애플리케이션을 실행할 경우 사용합니다.
피크 트래픽 갱신이 자동적으로 일어나지 않고 사용자가 최대치와 최소치를 입력해주고 입력된 범위내에서 트래픽을 처리합니다.
DynamoDB는 한번에 최대 1MB의 데이터를 처리 할 수 있습니다. 만약 처리하고자하는 데이터의 크기가 1MB보다 크다면 한번에 처리가 불가능하고 나눠서 처리해야합니다.
Scan의 경우에는 한번에 최대 1MB의 데이터를 가져올 수 있습니다. scan에서 projectionexpression 파라미터를 사용하면 모두가 아닌 일부 속성만 가져올 수 있습니다. 1MB 보다 큰 데이터에서 모든 데이터를 조회하기 위해서는 페이지를 나눠서 스캔을 해야합니다. 페이지를 나눠서 1MB 한도 내에 맞는 결과 집합을 반환합니다. 그런뒤에 추가 결과가 있는지 확인하고 추가 결과가 있다면 두번째 페이지를 가져오는 방식으로 모든 데이터를 조회 할 수 있습니다.
Ex) amazonDynamoDb.scan(scanRequest).getLastEvaluatedKey().toString() 을 했을 때 결과가 있다면 1MB 보다 데이터의 크기가 크기 때문에 결과를 전부 가져오지 못해서 추가적인 검색이 필요하고
결과가 없다면 모든 데이터를 가져온 상태이다.
다음은 콩플레이스 트러블이슈에 대한 처리방법입니다.
상황: 총 13265 개의 데이터와 2.5MB의 크기의 테이블을 조회하려고 하였는데 5548개의 데이터만 조회가 되었다.
ScanRequest scanRequest = new ScanRequest().withTableName("BeaconHistoryData");
int beforeCount = amazonDynamoDb.scan(scanRequest).getCount();
System.out.println(beforeCount);
결과: 5548
페이지 처리 후 조회한 결과
int want = 0;
Map<String, AttributeValue> lastKeyEvaluated = null;
do {
ScanRequest scanRequest = new ScanRequest()
.withTableName("BeaconHistoryData")
.withExclusiveStartKey(lastKeyEvaluated);
ScanResult result = amazonDynamoDb.scan(scanRequest);
want = want + result.getCount();
lastKeyEvaluated = result.getLastEvaluatedKey();
} while(lastKeyEvaluated !=null);
System.out.println(want);
결과: 13265