비동기 처리 수행에서 폴링 요청의 빈 응답(null response)을 최소화

2025. 3. 22. 11:17aws.cloud

반응형

Amazon SQS 를 사용하여 비동기 처리를 수행하는데 폴링 요청의 빈 응답(null response)을 최소화하는 방법


1. 기본 개념: 폴링(Polling)과 빈 응답 문제

Amazon SQS에서 메시지를 가져오는 방법에는 Short Polling(짧은 폴링)Long Polling(긴 폴링) 이 있다.

  • Short Polling(기본 설정)
    • 큐에서 메시지를 가져올 때 즉시 응답을 반환한다.
    • 큐에 메시지가 없으면 빈 응답 을 반환한다.
    • 여러 번 요청해도 메시지가 없는 경우 불필요한 API 호출이 증가 한다.
  • Long Polling(권장 방식)
    • 메시지가 도착할 때까지 대기 한 후 응답을 반환한다.
    • 설정된 시간(최대 20초) 동안 대기하며, 그동안 메시지가 도착하면 즉시 응답한다.
    • 메시지가 없으면 대기 시간이 끝난 후 빈 응답을 반환한다.
    • 빈 응답을 줄이고 API 호출 횟수를 줄여 비용을 절감 할 수 있다.

2. 해결 방법: Long Polling 활성화

✅ Long Polling을 활성화하는 방법

(1) AWS CLI에서 설정

aws sqs set-queue-attributes --queue-url <QUEUE_URL> \
    --attributes ReceiveMessageWaitTimeSeconds=20
  • ReceiveMessageWaitTimeSeconds 값을 최대 20초로 설정 하면 Long Polling이 활성화된다.
  • 이렇게 하면 SQS는 메시지가 있을 때까지 최대 20초 동안 대기한 후 응답을 반환한다.

(2) AWS SDK에서 설정 (예: Python Boto3)

import boto3

sqs = boto3.client('sqs')

response = sqs.receive_message(
    QueueUrl='<QUEUE_URL>',
    MaxNumberOfMessages=10,
    WaitTimeSeconds=20  # Long Polling 활성화
)
  • WaitTimeSeconds=20 을 설정하면 Long Polling을 사용하여 빈 응답을 줄일 수 있다.
  • MaxNumberOfMessages=10 을 설정하면 최대 10개의 메시지를 한 번에 가져와 요청 수를 최적화 할 수 있다.

3. 추가적인 최적화 방법

✅ 배치 크기 조정 (Batch Size)

한 번에 처리할 메시지 개수를 늘리면 폴링 요청 수를 줄일 수 있다.

  • 기본적으로 MaxNumberOfMessages 값은 1 이지만, 최대 10개까지 요청 가능 하다.
  • MaxNumberOfMessages=10 으로 설정하면 한 번의 폴링 요청으로 최대 10개의 메시지를 가져와 API 호출 횟수를 줄일 수 있다.

✅ 메시지 가시성 시간(Visibility Timeout) 조정

  • 메시지를 가져온 후, 처리 중인 메시지가 다시 읽히지 않도록 Visibility Timeout을 조정 해야 한다.
  • Visibility Timeout을 너무 짧게 설정하면, 처리가 끝나지 않은 메시지가 다시 큐에 나타날 수 있다.
  • 적절한 값(예: 30초 이상)으로 설정하면 중복 처리를 방지 할 수 있다.
aws sqs set-queue-attributes --queue-url <QUEUE_URL> \
    --attributes VisibilityTimeout=30

 

반응형