1. 개요
SQS의 Polling 방식에 대한 내용이다. Amazon SQS에서 메시지를 가져올 때는 ReceiveMessage 요청을 보내며, 이때 대기 시간 설정에 따라 Short Polling과 Long Polling으로 동작이 나뉜다.
- Short Polling
- Long Polling
2. Polling
서버의 업데이트 사항을 가장 손쉽게 받는 방법은 클라이언트가 서버를 계속 확인하는 것이다. 웹 애플리케이션에서는 XHR 등을 사용해 주기적으로 백그라운드 요청을 보낼 수 있고, SQS에서는 소비자가 큐에 ReceiveMessage 요청을 반복해서 보내 메시지를 확인한다.
Polling 방식은 구현이 단순하지만, 메시지가 없을 때도 요청이 발생할 수 있다. 따라서 요청이 즉시 반환되는지, 일정 시간 동안 메시지를 기다리는지에 따라 효율이 달라진다.
3. Short Polling
SQS는 기본적으로 Short Polling 방식을 사용할 수 있다. Short Polling에서는 ReceiveMessage 요청을 보내면 SQS가 일부 서버만 샘플링해서 메시지를 찾고, 메시지가 없으면 바로 빈 응답을 반환할 수 있다.
Short Polling은 ReceiveMessage 호출의 WaitTimeSeconds 파라미터 설정에 따른다.
ReceiveMessage호출에서WaitTimeSeconds = 0으로 설정한 경우ReceiveMessage호출에서WaitTimeSeconds를 설정하지 않았고, 큐 설정인ReceiveMessageWaitTimeSeconds가 0인 경우
이 방식은 응답이 빠르다는 장점이 있지만, 큐에 메시지가 거의 없을 때 빈 응답이 많아질 수 있다. 빈 응답도 요청이므로 불필요한 호출이 늘어날 수 있다는 점을 고려해야 한다.
4. Long Polling
Long Polling은 메시지가 없을 때 즉시 빈 응답을 반환하지 않고, 설정한 시간 동안 메시지가 도착하기를 기다리는 방식이다. SQS에서는 WaitTimeSeconds 값을 0보다 크게 설정하면 Long Polling으로 동작한다.
Long Polling은 Amazon 콘솔을 통해 큐 설정에서 활성화할 수 있고, 애플리케이션에서 ReceiveMessage 호출 시 WaitTimeSeconds를 지정해서 사용할 수도 있다. 큐의 기본 대기 시간은 ReceiveMessageWaitTimeSeconds 속성으로 설정한다.
이 방식은 빈 응답을 줄이고, 메시지가 도착했을 때 더 효율적으로 소비할 수 있다는 장점이 있다. 일반적으로 메시지가 항상 많은 큐가 아니라면 Short Polling보다 Long Polling이 요청 수를 줄이는 데 유리하다.
ReceiveMessage WaitTimeSeconds = 10
위와 같이 설정하면 메시지가 없을 경우 최대 10초 동안 대기한다. 그 사이 메시지가 도착하면 응답이 반환되고, 끝까지 메시지가 없으면 빈 응답이 반환된다.
5. 간단한 확인 방법
동작 차이는 큐에 메시지가 없는 상태에서 확인해보면 쉽다. Short Polling은 요청을 보내면 대부분 즉시 빈 응답이 돌아오고, Long Polling은 설정한 대기 시간에 가깝게 기다린 뒤 빈 응답이 돌아온다.
- 큐에 메시지가 없는 상태에서
WaitTimeSeconds = 0으로 호출한다. - 같은 큐에서
WaitTimeSeconds를 0보다 큰 값으로 설정해 호출한다. - 응답이 돌아오는 시간을 비교한다.
실제 애플리케이션에서는 메시지 처리 시간, Visibility Timeout, 재시도 정책도 함께 고려해야 하지만, Polling 방식 자체의 차이는 WaitTimeSeconds 설정으로 이해할 수 있다.