Amazon SQS 임시 대기열 - Amazon Simple Queue Service

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

Amazon SQS 임시 대기열

임시 대기열을 사용하면 request-response와 같은 공통 메시지 패턴을 사용할 때 개발 시간 및 배포 비용을 줄일 수 있습니다. 임시 대기열 클라이언트를 사용하여 대량고속처리가 가능하고 비용 효율적인 애플리케이션 관리 임시 대기열을 생성할 수 있습니다.

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

임시 대기열은 다음과 같은 이점이 있습니다.

  • 임시 대기열은 특정 스레드 또는 프로세스에 대해 경량 통신 채널 역할을 합니다.

  • 또한 추가 비용 없이도 생성 및 삭제가 가능합니다.

  • 이는 정적(정상) Amazon SQS 대기열과 API 호환이 가능합니다. 따라서 메시지를 전송 및 수신하는 기존 코드가 가상 대기열과 메시지를 주고 받을 수 있습니다.

주제

가상 대기열

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

참고
  • 가상 대기열을 생성하면 소비자가 들어오는 메시지를 수신할 수 있는 임시 데이터 구조만 생성됩니다. 가상 대기열은 Amazon SQS에 대해 API 호출을 수행하지 않기 때문에 어떤 비용도 발생하지 않습니다.

  • 한 호스트 대기열 내의 모든 가상 대기열에는 TPS 할당량이 적용됩니다. 자세한 내용은 메시지 관련 할당량 섹션을 참조하세요.

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

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

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

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

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

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

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

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

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

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

요청-응답 메시징 패턴(가상 대기열)

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

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


                Amazon SQS와 사용되는 요청-응답 패턴에 대한 다이어그램.

예제 시나리오: 로그인 요청 처리

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

클라이언트 측

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. 임시 대기열을 생성합니다.

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

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

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

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

  6. 응답을 반환합니다.

서버 측

이 예제에서는 구성 시 대기열을 폴링하고 모든 메시지에 대해 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)); } }

대기열 정리

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

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

참고

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

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