

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

# Amazon SQS 임시 대기열
<a name="sqs-temporary-queues"></a>

임시 대기열을 사용하면 *request-response*와 같은 공통 메시지 패턴을 사용할 때 개발 시간 및 배포 비용을 줄일 수 있습니다. [임시 대기열 클라이언트](https://github.com/awslabs/amazon-sqs-java-temporary-queues-client)를 사용하여 대량고속처리가 가능하고 비용 효율적인 애플리케이션 관리 임시 대기열을 생성할 수 있습니다.

클라이언트는 여러 개의 임시 대기열**(특정 프로세스에 대한 요구 시 생성되는 애플리케이션 관리형 대기열)을 하나의 Amazon SQS 대기열로 자동으로 매핑합니다. 따라서 애플리케이션에서 API 호출 수를 줄이고 각 임시 대기열에 대한 트래픽이 낮을 때도 높은 처리량을 얻을 수 있습니다. 임시 대기열을 더 이상 사용하지 않을 때는 클라이언트를 사용하는 프로세스가 명확하게 종료된 경우라 하더라도 클라이언트가 임시 대기열을 자동으로 정리합니다.

임시 대기열은 다음과 같은 이점이 있습니다.
+ 임시 대기열은 특정 스레드 또는 프로세스에 대해 경량 통신 채널 역할을 합니다.
+ 또한 추가 비용 없이도 생성 및 삭제가 가능합니다.
+ 이는 정적(정상) Amazon SQS 대기열과 API 호환이 가능합니다. 따라서 메시지를 전송 및 수신하는 기존 코드가 가상 대기열과 메시지를 주고 받을 수 있습니다.

## 가상 대기열
<a name="virtual-queues"></a>

*가상 대기열*은 임시 대기열 클라이언트가 생성하는 로컬 데이터 구조입니다. 가상 대기열을 사용하면 Amazon SQS 대기열에 트래픽이 낮은 대상을 여러 개 결합할 수 있습니다. 모범 사례는 가상 대기열에서 동일한 메시지 그룹 ID 재사용 방지를 참조하세요.

**참고**  
가상 대기열을 생성하면 소비자가 들어오는 메시지를 수신할 수 있는 임시 데이터 구조만 생성됩니다. 가상 대기열은 Amazon SQS에 대해 API 호출을 수행하지 않기 때문에 어떤 비용도 발생하지 않습니다.
한 호스트 대기열 내의 모든 가상 대기열에는 TPS 할당량이 적용됩니다. 자세한 내용은 [Amazon SQS 메시지 할당량](quotas-messages.md) 단원을 참조하십시오.

`AmazonSQSVirtualQueuesClient` 래퍼 클래스는 가상 대기열과 관련된 속성 지원을 추가합니다. 가상 대기열을 생성하려면 `HostQueueURL` 속성을 사용하여 `CreateQueue` API 작업을 호출해야 합니다. 이 속성은 가상 대기열을 호스팅하는 기존 대기열을 지정합니다.

가상 대기열의 URL은 다음 형식을 따릅니다.

```
https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue#MyVirtualQueueName
```

생산자가 가상 대기열 URL에서 `SendMessage` 또는 `SendMessageBatch` API 작업을 호출하면 임시 대기열 클라이언트가 다음과 같은 작업을 수행합니다.

1. 가상 대기열 이름을 추출합니다.

1. 가상 대기열 이름을 추가 메시지 속성으로 연결합니다.

1. 호스트 대기열에 이 메시지를 전송합니다.

생산자가 메시지를 전송할 때 백그라운드 스레드는 호스트 대기열을 폴링하고, 해당되는 메시지 속성에 따라 가상 대기열에 수신한 메시지를 전송합니다.

소비자가 가상 대기열 URL에서 `ReceiveMessage` API 작업을 호출하는 동안 임시 대기열 클라이언트는 백그라운드 스레드가 가상 대기열에 메시지를 전송할 때까지 로컬 호출을 차단합니다. (이 프로세스는 [버퍼링된 비동기식 클라이언트](sqs-client-side-buffering-request-batching.md)에서의 메시지 미리 가져오기와 비슷한데, 단일 API 작업이 최대 10개의 가상 대기열에 메시지를 전송하는 것이 가능합니다). 가상 대기열을 삭제하면 Amazon SQS 자체를 호출하지 않고 클라이언트측 리소스가 제거됩니다.

`AmazonSQSTemporaryQueuesClient` 클래스는 생성한 모든 대기열을 임시 대기열로 자동 전환합니다. 또한 요구 시 같은 대기열 속성을 가진 호스트 대기열을 자동 생성합니다. 이러한 대기열의 이름은 임시 대기열로 식별하는 공통된 구성 가능 접두사(기본적으로 `__RequesterClientQueues__`)를 공유합니다. 따라서 클라이언트는 대기열을 생성 및 삭제하는 기존 코드를 최적화하는 즉각적인 대체물 역할을 할 수 있습니다. 또한 클라이언트에는 대기열 간에 양방향 통신을 가능하게 하는 `AmazonSQSRequester` 및 `AmazonSQSResponder` 인터페이스가 포함되어 있습니다.

## 요청-응답 메시징 패턴(가상 대기열)
<a name="request-reply-messaging-pattern"></a>

임시 대기열의 가장 일반적인 사용 사례는 *요청-응답* 메시징 패턴인데, 여기에서는 요청이 각 응답 메시지를 수신하기 위해 *임시 대기열*을 생성합니다. 각 응답 메시지에 대해 Amazon SQS 대기열을 생성하는 것을 방지하기 위해 임시 대기열 클라이언트는 어떤 Amazon SQS API도 호출하지 않고 여러 개의 임시 대기열을 생성 및 삭제할 수 있도록 해줍니다. 자세한 내용은 요청-응답 시스템 구현을 참조하세요.

다음 다이어그램은 이 패턴을 사용하는 공통 구성을 보여줍니다.

![Amazon SQS와 사용되는 요청-응답 패턴에 대한 다이어그램.](http://docs.aws.amazon.com/ko_kr/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/sqs-request-response-pattern.png)


## 예제 시나리오: 로그인 요청 처리
<a name="example-scenario"></a>

다음 예제 시나리오는 `AmazonSQSRequester` 및 `AmazonSQSResponder` 인터페이스를 사용하여 사용자의 로그인 요청을 처리할 수 있는 방법을 보여줍니다.

### 클라이언트 측
<a name="process-login-request-client-side"></a>

```
public class LoginClient {

    // Specify the Amazon SQS queue to which to send requests.
    private final String requestQueueUrl;

    // Use the AmazonSQSRequester interface to create
    // a temporary queue for each response.
    private final AmazonSQSRequester sqsRequester = 
            AmazonSQSRequesterClientBuilder.defaultClient();

    LoginClient(String requestQueueUrl) {
        this.requestQueueUrl = requestQueueUrl;
    }

    // Send a login request.
    public String login(String body) throws TimeoutException {
        SendMessageRequest request = new SendMessageRequest()
                .withMessageBody(body)
                .withQueueUrl(requestQueueUrl);

        // If no response is received, in 20 seconds,
        // trigger the TimeoutException.
        Message reply = sqsRequester.sendMessageAndGetResponse(request, 
                20, TimeUnit.SECONDS);

        return reply.getBody();
    }
}
```

로그인 요청을 전송하는 과정은 다음과 같습니다.

1. 임시 대기열을 생성합니다.

1. 임시 대기열의 URL을 메시지에 속성으로써 연결합니다.

1. 이 메시지를 전송합니다.

1. 임시 대기열에서 응답을 수신합니다.

1. 임시 대기열을 삭제합니다.

1. 응답을 반환합니다.

### 서버 측
<a name="process-login-request-server-side"></a>

이 예제에서는 구성 시 대기열을 폴링하고 모든 메시지에 대해 `handleLoginRequest()` 메서드를 호출하기 위해 스레드가 생성된다고 가정합니다. 게다가 `doLogin()`는 위임된 메서드입니다.

```
public class LoginServer {

    // Specify the Amazon SQS queue to poll for login requests.
    private final String requestQueueUrl;

    // Use the AmazonSQSResponder interface to take care
    // of sending responses to the correct response destination.
    private final AmazonSQSResponder sqsResponder = 
            AmazonSQSResponderClientBuilder.defaultClient();

    LoginServer(String requestQueueUrl) {
        this.requestQueueUrl = requestQueueUrl;
    }

    // Process login requests from the client.
    public void handleLoginRequest(Message message) {

        // Process the login and return a serialized result.
        String response = doLogin(message.getBody());

        // Extract the URL of the temporary queue from the message attribute
        // and send the response to the temporary queue.
        sqsResponder.sendResponseMessage(MessageContent.fromMessage(message), 
                new MessageContent(response));  
    }
}
```

## 대기열 정리
<a name="cleaning-up-queues"></a>

Amazon SQS가 이 가상 대기열에서 사용되는 인 메모리 리소스를 회수하는지 확인하려면 애플리케이션에서 임시 대기열 클라이언트가 더 이상 필요하지 않을 때 `shutdown()` 메서드를 호출해야 합니다. 또한 `AmazonSQSRequester` 인터페이스의 `shutdown()` 메서드를 사용할 수도 있습니다.

임시 대기열 클라이언트는 사용하지 않는 호스트 대기열을 제거할 수 있는 방법도 제공합니다. 일정 기간(기본적으로 5분) 동안 API 호출을 수신하는 각 대기열에서 클라이언트는 `TagQueue` API 작업을 사용하여 사용 중인 상태로 남아 있는 대기열에 태그 지정을 합니다.

**참고**  
`ReceiveMessage` 작업을 포함하여 대기열에서 이루어진 모든 API 작업은 대기열을 비유휴 상태로 표시합니다.

백그라운드 스레드는 `ListQueues` 및 `ListTags` API 작업을 사용하여 접두사가 구성된 모든 대기열을 확인하고 최소 5분 동안 태그 지정이 되지 않은 대기열을 모두 삭제합니다. 이 과정에서 한 클라이언트가 명확하게 종료되지 않으면 다른 활성 클라이언트가 종료 이후에 정리합니다. 작업 중복을 줄이기 위해 같은 접두사를 가진 모든 클라이언트가 접두사 뒤에 명명된 내부의 공유 대기열을 통해 통신합니다.