

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon SQS로 클라이언트 측 버퍼링 및 요청 배치 처리 활성화
<a name="sqs-client-side-buffering-request-batching"></a>

[AWS SDK for Java](https://aws.amazon.com/sdkforjava/)는 Amazon SQS에 액세스하는 `AmazonSQSBufferedAsyncClient`를 포함합니다. 이 클라이언트는 클라이언트 측 버퍼링을 사용하여 간단한 요청 배치 처리를 허용합니다. 클라이언트에서 수행한 직접 호출을 먼저 버퍼링한 후 배치 요청 형태로 Amazon SQS로 전송합니다.

클라이언트 측 버퍼링을 통해 최대 10개의 요청을 버퍼링하여 배치 요청으로 전송할 수 있으므로 Amazon SQS 사용 비용이 절감되고 전송되는 요청 수가 줄어듭니다. `AmazonSQSBufferedAsyncClient` 버퍼는 동기식 및 비동기식 호출을 모두 버퍼링합니다. 배치 처리된 요청과 [긴 폴링](sqs-short-and-long-polling.md) 지원을 통해 처리량도 높일 수 있습니다. 자세한 내용은 [Amazon SQS로 수평적 조정과 작업 배치 처리를 사용하여 처리량 증대](sqs-throughput-horizontal-scaling-and-batching.md) 단원을 참조하십시오.

`AmazonSQSBufferedAsyncClient`는 `AmazonSQSAsyncClient`와 동일한 인터페이스를 구현하므로 `AmazonSQSAsyncClient`에서 `AmazonSQSBufferedAsyncClient`로 마이그레이션하려면 일반적으로 기존 코드를 최소한만 변경하면 됩니다.

**참고**  
Amazon SQS의 버퍼링된 비동기식 클라이언트는 현재 FIFO 대기열을 지원하지 않습니다.

## AmazonSQSBufferedAsyncClient 사용
<a name="using-buffered-async-client"></a>

시작하기 전에 [Amazon SQS 설정](sqs-setting-up.md)의 단계를 완료해야 합니다.

### AWS Java 1.x용 SDK
<a name="using-buffered-async-client-java1"></a>

 AWS SDK for Java 1.x의 경우 다음 예제를 `AmazonSQSBufferedAsyncClient` 기반으로 새를 생성할 수 있습니다.

```
// Create the basic Amazon SQS async client
final AmazonSQSAsync sqsAsync = new AmazonSQSAsyncClient();
 
// Create the buffered client
final AmazonSQSAsync bufferedSqs = new AmazonSQSBufferedAsyncClient(sqsAsync);
```

새 `AmazonSQSBufferedAsyncClient`를 생성한 후 이것을 이용해서 Amazon SQS에 다중 요청을 전송할 수 있습니다(`AmazonSQSAsyncClient`와 마찬가지로). 예를 들면 다음과 같습니다.

```
final CreateQueueRequest createRequest = new CreateQueueRequest().withQueueName("MyQueue");
 
final CreateQueueResult res = bufferedSqs.createQueue(createRequest);
 
final SendMessageRequest request = new SendMessageRequest();
final String body = "Your message text" + System.currentTimeMillis();
request.setMessageBody( body );
request.setQueueUrl(res.getQueueUrl());
 
final Future<SendMessageResult> sendResult = bufferedSqs.sendMessageAsync(request);
 
final ReceiveMessageRequest receiveRq = new ReceiveMessageRequest()
    .withMaxNumberOfMessages(1)
    .withQueueUrl(queueUrl);
final ReceiveMessageResult rx = bufferedSqs.receiveMessage(receiveRq);
```

### AmazonSQSBufferedAsyncClient 구성
<a name="configuring-buffered-async-client"></a>

`AmazonSQSBufferedAsyncClient`는 대부분의 사용 사례에 적용되는 설정으로 사전 구성됩니다. `AmazonSQSBufferedAsyncClient`를 추가로 구성할 수 있습니다. 예를 들면 다음과 같습니다.

1. 필요한 구성 파라미터로 `QueueBufferConfig` 클래스의 인스턴스를 만듭니다.

1. `AmazonSQSBufferedAsyncClient` 생성자에 인스턴스를 제공합니다.

```
// Create the basic Amazon SQS async client
final AmazonSQSAsync sqsAsync = new AmazonSQSAsyncClient();
 
final QueueBufferConfig config = new QueueBufferConfig()
    .withMaxInflightReceiveBatches(5)
    .withMaxDoneReceiveBatches(15);
 
// Create the buffered client
final AmazonSQSAsync bufferedSqs = new AmazonSQSBufferedAsyncClient(sqsAsync, config);
```


**QueueBufferConfig 구성 파라미터**  

| 파라미터 | 기본값  | 설명 | 
| --- | --- | --- | 
| longPoll | true |  `longPoll`이 `true`로 설정된 경우 `AmazonSQSBufferedAsyncClient`는 메시지를 사용할 때 긴 폴링을 사용하려고 시도합니다.  | 
| longPollWaitTimeoutSeconds | 20s |  `ReceiveMessage` 호출이 서버에서 차단되고 빈 수신 결과를 반환하기 전에 메시지가 대기열에 나타나기까지 대기하는 최대 시간(초)입니다.  긴 폴링을 비활성화하면 이 설정은 영향을 주지 않습니다.   | 
| maxBatchOpenMs | 200ms |  발신 호출이 동일한 유형의 메시지를 배치 처리할 다른 호출을 대기하는 최대 시간(밀리초)입니다. 설정이 높을수록 동일한 작업량을 수행하는 데 필요한 배치 수가 감소합니다(그러나 배치의 첫 번째 호출을 대기하는 시간이 길어짐). 이 파라미터를 `0`으로 설정하면, 제출된 요청은 다른 요청을 기다리지 않으므로 사실상 일괄 처리하지 않게 됩니다.  | 
| maxBatchSize | 배치당 요청 10개 |  단일 요청에서 배치 방식으로 함께 처리되는 최대 메시지 수입니다. 설정이 높을수록 동일한 요청 수를 수행하는 데 필요한 배치 수가 감소합니다.  배치당 요청 10개는 Amazon SQS에 허용되는 최대값입니다.   | 
| maxBatchSizeBytes | 1MiB |  클라이언트가 Amazon SQS에 전송하려고 시도하는 메시지 배치의 최대 크기(바이트 단위)입니다.  1MiB는 Amazon SQS에 허용되는 최댓값입니다.   | 
| maxDoneReceiveBatches | 배치 10개 |  `AmazonSQSBufferedAsyncClient`가 클라이언트 측에서 미리 가져와서 저장하는 수신 배치의 최대 개수입니다. 설정이 높을수록 Amazon SQS에 호출을 전송하지 않고도 만족할 수 있는 수신 요청 개수가 늘어납니다(그러나 미리 가져오는 메시지가 많을수록 메시지가 버퍼에 있는 시간이 길어지므로 표시 제한 시간이 만료될 수 있음).  `0`은 모든 메시지 미리 가져오기 기능이 비활성화되고 메시지가 요청 시에만 사용됨을 나타냅니다.   | 
| maxInflightOutboundBatches | 배치 5개 |  동시에 처리될 수 있는 활성 아웃바운드 배치의 최대 개수입니다. 설정이 높을수록 아웃바운드 배치 전송 속도가 빨라지고(CPU 또는 대역폭과 같은 할당량도 영향을 줌), `AmazonSQSBufferedAsyncClient`에서 사용하는 스레드 수가 많아집니다.  | 
| maxInflightReceiveBatches | 배치 10개 |  동시에 처리될 수 있는 활성 수신 배치의 최대 개수입니다. 설정이 높을수록 수신 가능한 메시지가 많아지고(CPU 또는 대역폭과 같은 할당량도 영향을 줌), `AmazonSQSBufferedAsyncClient`에서 사용하는 스레드 수가 많아집니다.  `0`은 모든 메시지 미리 가져오기 기능이 비활성화되고 메시지가 요청 시에만 사용됨을 나타냅니다.   | 
| visibilityTimeoutSeconds | -1 |  이 파라미터를 0이 아닌 양수 값으로 설정하면, 여기에 설정된 제한 시간 초과는 메시지가 사용되는 대기열에서 설정된 제한 시간 초과를 재정의합니다.  `-1`은 대기열에서 기본 설정이 선택되어 있음을 나타냅니다. 제한 시간 초과를 `0`으로 설정할 수 없습니다.   | 

### AWS Java 2.x용 SDK
<a name="using-buffered-async-client-java2"></a>

 AWS SDK for Java 2.x의 경우 다음 예제를 `SqsAsyncBatchManager` 기반으로 새를 생성할 수 있습니다.

```
// Create the basic Sqs Async Client
SqsAsyncClient sqs = SqsAsyncClient.builder() 
    .region(Region.US_EAST_1) 
    .build();

// Create the batch manager
SqsAsyncBatchManager sqsAsyncBatchManager = sqs.batchManager();
```

새 `SqsAsyncBatchManager`를 생성한 후 이것을 이용해서 Amazon SQS에 다중 요청을 전송할 수 있습니다(`SqsAsyncClient`와 마찬가지로). 예를 들면 다음과 같습니다.

```
final String queueName = "MyAsyncBufferedQueue" + UUID.randomUUID();
final CreateQueueRequest request = CreateQueueRequest.builder().queueName(queueName).build();
final String queueUrl = sqs.createQueue(request).join().queueUrl();
System.out.println("Queue created: " + queueUrl);


// Send messages
CompletableFuture<SendMessageResponse> sendMessageFuture;
for (int i = 0; i < 10; i++) {
    final int index = i;
    sendMessageFuture = sqsAsyncBatchManager.sendMessage(
            r -> r.messageBody("Message " + index).queueUrl(queueUrl));
    SendMessageResponse response= sendMessageFuture.join();
    System.out.println("Message " + response.messageId() + " sent!");
}

// Receive messages with customized configurations
CompletableFuture<ReceiveMessageResponse> receiveResponseFuture = customizedBatchManager.receiveMessage(
        r -> r.queueUrl(queueUrl)
                .waitTimeSeconds(10)
                .visibilityTimeout(20)
                .maxNumberOfMessages(10)
);
System.out.println("You have received " + receiveResponseFuture.join().messages().size() + " messages in total.");

// Delete messages
DeleteQueueRequest deleteQueueRequest =  DeleteQueueRequest.builder().queueUrl(queueUrl).build();
int code = sqs.deleteQueue(deleteQueueRequest).join().sdkHttpResponse().statusCode();
System.out.println("Queue is deleted, with statusCode " + code);
```

### SqsAsyncBatchManager 구성
<a name="configuring-SqsAsyncBatchManager"></a>

`SqsAsyncBatchManager`는 대부분의 사용 사례에 적용되는 설정으로 사전 구성됩니다. `SqsAsyncBatchManager`를 추가로 구성할 수 있습니다. 예를 들면 다음과 같습니다.

`SqsAsyncBatchManager.Builder`를 통한 사용자 지정 구성 생성:

```
SqsAsyncBatchManager customizedBatchManager = SqsAsyncBatchManager.builder() 
    .client(sqs)
    .scheduledExecutor(Executors.newScheduledThreadPool(5))
    .overrideConfiguration(b -> b 
        .maxBatchSize(10)
        .sendRequestFrequency(Duration.ofMillis(200))
        .receiveMessageMinWaitDuration(Duration.ofSeconds(10))
        .receiveMessageVisibilityTimeout(Duration.ofSeconds(20)) 
        .receiveMessageAttributeNames(Collections.singletonList("*"))
        .receiveMessageSystemAttributeNames(Collections.singletonList(MessageSystemAttributeName.ALL)))
    .build();
```


**`BatchOverrideConfiguration` 파라미터**  

| 파라미터 | 기본값  | 설명 | 
| --- | --- | --- | 
| maxBatchSize |  배치당 요청 10개  | 단일 요청에서 배치 방식으로 함께 처리되는 최대 메시지 수입니다. 설정이 높을수록 동일한 요청 수를 수행하는 데 필요한 배치 수가 감소합니다.  Amazon SQS에 허용되는 최댓값은 배치당 요청 10개입니다.  | 
| sendRequestFrequency |  200ms  | 발신 호출이 동일한 유형의 메시지를 배치 처리할 다른 호출을 대기하는 최대 시간(밀리초)입니다. 설정이 높을수록 동일한 작업량을 수행하는 데 필요한 배치 수가 감소합니다(그러나 배치의 첫 번째 호출을 대기하는 시간이 길어짐). 이 파라미터를 `0`으로 설정하면, 제출된 요청은 다른 요청을 기다리지 않으므로 사실상 일괄 처리하지 않게 됩니다. | 
| receiveMessageVisibilityTimeout |  -1  | 이 파라미터를 0이 아닌 양수 값으로 설정하면, 여기에 설정된 제한 시간 초과는 메시지가 사용되는 대기열에서 설정된 제한 시간 초과를 재정의합니다.   `1`은 대기열에서 기본 설정이 선택되어 있음을 나타냅니다. 제한 시간 초과를 `0`으로 설정할 수 없습니다.   | 
| receiveMessageMinWaitDuration |  50ms  | 사용 가능한 메시지를 가져올 때까지 `receiveMessage` 직접 호출이 대기하는 최소 시간(밀리초)입니다. 설정이 높을수록 동일한 요청 수를 수행하는 데 필요한 배치 수가 감소합니다.  | 