Dynamo DB Retry 횟수 설정

- AS-IS : default 10회
- TO-BE : 8회 설정 예정 (사유 : default 설정인 경우 최대 51~60초에 delay 발생으로 response time이 길어지는 악순환이 되기 때문에 재시도 횟수를 줄여서 빠른 response 처리로 서버 부하 감소하기 위함)

[Dynamo DB Retry 정책 참고]

 • DynamoDB 읽기/쓰기 재시도 정책

https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff 

• 요약 : 요청은 최대 1분이니 1분내에서 retry를 해라

 예를 들어 첫 번째 재시도 전에는 최대 50밀리초, 두 번째 재시도 전에는 최대 100밀리초, 그리고 세 번째 전에는 최대 200밀리초를 기다리는 방식입니다.
 하지만 1분 후에도 요청이 실패하면 요청량이 아니라 할당 처리량을 초과하는 요청 크기가 원인일 수도 있습니다.
 따라서 약 1분 정도에서 멈추도록 최대 재시도 횟수를 설정하십시오.

[총 재시도 횟수 별 시간 참고]

[설정 방법]

/**
 * 처음 설정할 때 대기 시간 (밀리 초)
 * */
private static final int CONNECTION_TIMEOUT = 60 * 1000;

/**
 * 클라이언트가 실행을 완료 할 수있는 시간 (밀리 초)
 * */
private static final int CLIENT_EXECUTION_TIMEOUT = 60 * 1000;

/**
 * 요청이 완료되기까지 대기하는 시간 (밀리 초)
 * */
private static final int REQUEST_TIMEOUT = 60 * 1000;

/**
 * 데이터가 전송 될 때까지 기다리는 시간 (밀리 초)
 * */
private static final int SOCKET_TIMEOUT = 60 * 1000;

/**
 * 요청 실패시 재시도 카운트
 * */
private static final int RETRY_COUNT = 8;

private AWSCredentialsProvider awsCredentialsProvider() {
   final BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
   final AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(awsCredentials);
   return credentialsProvider;
}

private ClientConfiguration createDynamoDBClientConfiguration() {
ClientConfiguration clientConfiguration = new ClientConfiguration()
   .withConnectionTimeout(CONNECTION_TIMEOUT)
   .withClientExecutionTimeout(CLIENT_EXECUTION_TIMEOUT)
   .withRequestTimeout(REQUEST_TIMEOUT)
   .withSocketTimeout(SOCKET_TIMEOUT)
   .withRetryPolicy(PredefinedRetryPolicies.getDynamoDBDefaultRetryPolicyWithCustomMaxRetries(RETRY_COUNT));

return clientConfiguration;
}

@Bean
public DynamoDBMapper dynamoDBMapper() {
Regions region = Regions.fromName(regionName);
AmazonDynamoDBClientBuilder builder = AmazonDynamoDBClientBuilder.standard()
   .withCredentials(awsCredentialsProvider())
   .withClientConfiguration(createDynamoDBClientConfiguration())
   .withRegion(region);
if (!StringUtils.isEmpty(serviceEndpoint)) {
   System.out.println(String.format("serviceEndpoint: '%s'", serviceEndpoint));
   EndpointConfiguration configuration = new EndpointConfiguration(serviceEndpoint, regionName);
   builder.withEndpointConfiguration(configuration);
}
AmazonDynamoDB dynamoDB = builder.build();

DynamoDBMapper mapper = new DynamoDBMapper(dynamoDB);
   return mapper;
}

+ Recent posts