본문 바로가기

Cloud/AWS

[AWS Developer Associate] SQS 정리

SQS

- Amazon Simple Queue Service 는 마이크로 서비스, 분산 시스템 및 서버리스 애플리케이션을 쉽게 분리하고 확장할 수 있도록 지원하는 완전관리형 메시지 대기열 서비스

 

[애플리케이션 커뮤니케이션 패턴]

1. 동기 커뮤니케이션

2. 비동기 혹은 이벤트 기반 유형

애플리케이션간의 동기화는 트래픽이 갑자기 급증하거나 예측할 수 없을 때 문제가 되는 경우가 많기 때문에

애플리케이션을 분리하고 분리 계층을 확장하는 것이 좋다.

 

SQS의 핵심은 대기열!

SQS 대기열에 메시지를 보내는 주체를 생산자라고 한다.

생산자는 한 개 이상일 수 있다.

대기열에서 메시지를 처리하고 수신해야 하는 대상을 소비자라고 한다.

소비자는 대기열에서 메시지를 폴링한다. 해당 메시지를 처리하고 메시지를 삭제한다.

 

대기열 서비스는 생상자와 소비자 사이를 분리하는 버퍼 역할을 한다.

 

[SQS를 사용하면]

- 처리량에 제한이 없고, 대기열에 있는 메시지 수에도 제한이 없다.

- 각 메시지는 수명이 짧다. (메시지는 기본값으로 4일 동안 대기열에 남아 있고, 대기열에 있을 수 있는 시간은 최대 14일이다. 메시지 보관 기간이 지나면 자동으로 삭제된다. )

- SQS 메시지는 작아야 한다. (전송된 메시지당 256KB 미만이어야 한다.)

- SQS는 대기열 서비스이므로 높은 처리량, 높은 볼륨 등이 있어서 중복 메시지가 있을 수 있다.

- ASG와 함께 사용하면 처리량을 개선할 수 있다. 대기열의 길이 지표를 토대로 CloudWatch Alarm을 설정하고, 알람을 통해 오토 스케일링 그룹의 용량을 증가시킨다. 

- 애플리케이션 계층 간에 분리를 위해 사용된다. 처리 시간이 오래 걸리는 애플리케이션의 경우

아래의 예에서 파일처리 요청과 실제 파일 처리가 서로 다른 애플리케이션에서 발생할 수 있도록 할 수 있다.

[SQS 보안]

- HTTPS API를 사용하여 메시지를 보내고 생성함으로써 전송 중 암호화

- KMS키를 사용하여 암호화

- 클라이언트 측 암호화(클라이언트가 자체적으로 암호화 및 복호화를 수행해야 함)

- IAM 정책을 통해  SQS API에 대한 액세스를 규제할 수 있다.

- SQS 액세스 정책 사용

 

[메시지 가시성 시간 초과(Message Visibility timeout)]

- 소비자가 메시지를 폴링하면 그 메시지는 다른 소비자들에게 보이지 않게 된다.

- 메시지를 받은 뒤 특정 시간 동안 다른 소비자가 같은 메시지를 다시 꺼낼 수 없게 하는 기능이다.

- 기본적으로 30초이며, 0초부터 12시간까지 설정 가능

- 가시성 시간 초과 기간 내에 메시지를 처리하지 않으면 메시지가 두 번 처리될 수 있다.

  -> ChangeMessageVisibility API를 통해 소비자가 메시지를 처리하는데 시간이 더 필요하다는 것을 알릴 수 있다.

 

[처리 실패 큐(Dead Letter Queue)]

- 소비자가 가시성 시간 초과 내에 메시지를 처리하지 못하는 경우 메시지는 자동으로 대기열로 돌아가게 된다.

- 이렇게 여러 번 메시지가 다시 처리되고 실패되기를 반복하는 것이 설정한 임계값을 초과하면 메시지를 DLQ로 보내게 된다.

 

[대기열 지연(Delay Queue)]

- 소비자들이 즉각적으로 보지 못하도록 메시지를 지연시키는 것

- 15분까지 지연 가능

 

[숏 폴링(Short Polling)]

- 메시지를 요청하면 결과를 바로 받는다. 메시지가 있으면 가져오고 없으면 끝.

 

[롱 폴링(Long Polling)]

- 소비자가 SQS로부터 메시지를 요청할 때 만약 대기열이 비어 있다면 메시지가 도착할 때까지 기다리도록 할 수 있다.

- 롱 폴링을 이용하면 SQS 대기열로 보내는 API 호출을 줄일 수 있다. -> 효율성 향상, CPU 연산도 적어짐

- SQS 대기열이 메시지를 수신함과 동시에 소비자 또한 수신하게 되므로 지연 시간도 줄일 수 있다. (1~20초 설정 가능)

 

[FIFO Queue]

- 선입선출 큐

- 메시지 순서에 대한 강제적인 보장

- 제한된 처리량을 가지게 된다.

- 중복을 제거해주므로, 정확히 한 번만 보낼 수 있게 해준다.

   -> 중복제거가 적용되는 간격은 5분. 5분 간격 이내에 동일한 메시지를 두 번 발송할 경우 두 번째 메시지는 거부된다.

- 메시지 그룹화 : SQS FIFO 대기열로 메시지를 보낼 때 의무적으로 입력해야하는 파라미터인 메시지 그룹ID를 동일한 값으로 정할 경우 해당 ID에 대해서는 한 명의 소비자만 갖게 된다.

 

[SQS 필수 API]

  • CreateQueue (MessageRetentionPeriod), DeleteQueue
  • PurgeQueue: delete all the messages in queue
  • SendMessage (DelaySeconds), ReceiveMessage, DeleteMessage
  • MaxNumberOfMessages: default 1, max 10 (for ReceiveMessage API)
  • ReceiveMessageWaitTimeSeconds: Long Polling
  • ChangeMessageVisibility: change the message timeout