[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