SQS
소비자는 대기열에서 메시지를 폴링(poll) 하는데 이는 대기열에게 소비자 앞으로 온 메시지가 있는지 물어보는 것을 뜻한다.만약 대기열에 메시지가 있으면 소비자는 이 메시지를 폴링 해서 정보를 얻는다. 그러면 이 메시지를 처리한 후 대기열에서 삭제 한다.
SQS Queue는 소비자와 생산자를 분리하는 일종의 buffer 역할을 한다.
특징
- 처리량이 무제한이다.
- 즉, 초 당 원하는 만큼 메시지를 보낼 수 있고 대기열에도 원하는 만큼 메시지를 포함시킬 수 있다.
- 각 메시지는 수명이 짧다.
- 기본적으로 메시지는 4일 동안 대기열에 남아 있고, 대기열에 있을 수 있는 최대 시간은 14일이다.
- 지연시간이 짧다.
- 게시 및 수신 시 10ms 이내로 매우 빠르게 응답을 받는다.
- 하나의 메시지의 크기는 작아야 한다.
- 전송된 메시지 당 256KB 미만이어야 한다.
- 메시지의 중복이 있을 수 있다.
- 따라서, 적어도 한 번의 전송이 이루어진다고 생각하면 된다.
- 기한이 지난(out of order) 메시지가 있을 수 있다.
메시지 생산자
- SDK(API의 경우 SendMessageAPI를 이용)를 이용해 생산되며 SQS에 보내진다.
- 메시지는 소비자가 이를 처리 후 삭제할 때까지 SQS에 보관 된다.
- 메시지는 기본 4일 ~ 최대 14일 동안 보관 된다.
- 예시
- 주문 id, 소비자 id 등의 정보를 생산자가 만들어 SQS에 보낸다.
메시지 소비자
- 소비자는 일부 코드로 작성해야 하는 애플리케이션으로 EC2, 온프레미스 서버, 람다 등이 될 수 있다.
- 소비자가 SQS 메시지를 폴링 하면 한 번에 최대 10개까지 메시지를 받게 된다.
- 메시지를 처리하면 DeleteMessage API를 이용해 메시지를 삭제한다.
여러개의 EC2 인스턴스 소비자
- 특정 소비자에 의해 메시지가 빠르게 소비 되지 않으면 해당 메시지는 다른 소비자에 의해 소비 된다.
- 이 때문에 "적어도 한 번은 메시지가 전송 된다"고 표현한다.
- 또한, 이 때문에 best-effort(최선의 노력)로 메시지 순서를 지정한다.
- 만약 메시지가 증가해 처리량을 늘려야 한다면 소비자를 추가하고 수평 확장을 수행해 처리량을 개선할 수 있다.
SQS와 ASG 함께 사용하기
ASG 위에 EC2 인스턴스들이 실행되고 있을 때, 해당 인스턴스들은 SQS에서 메시지를 폴링 한다. 이 때 측정 지표로 Queue Length를 사용할 수 있으며 이를 ApproximateNumberOfMessages 라고 부른다. 이는 모든 SQS 큐에서 쓸 수 있는 CloudWatch 지표이다.
만약 큐에 일정 수준 이상의 메시지가 쌓이면 알람이 울리도록 설정할 수 있고 이 알람에 의해 ASG는 수평 확장을 한다. 그러면 소비자인 인스턴스는 메시지들을 더 높은 처리량으로 처리할 수 있게 된다.
아래와 같이 프론트엔드에서 데이터를 받아 SQS에 보냄으로써 데이터를 비동기적으로 처리할 수도 있다. SQS에 보내진 메시지는 백엔드(소비자)에서 꺼내 처리한다.
SQS 보안
암호화
- 전송중 암호화: HTTPS API 이용
- 미사용(at-rest) 메시지 암호화: KMS keys 이용
- 만약 클라이언트에서 암호화/복호화를 직접 수행하고 싶다면 클라이언트 사이드 암호화도 가능하다.
Access Controls
- SQS API에 대한 접근을 제어하기 위해 IAM policies를 이용할 수 있다.
SQS Access Policies
S3 bucket policies와 유사한 정책이다.
- SQS에 대한 교차 계정 접근을 허용/불허 할 때 사용할 수 있다.
- 다른 서비스(SNS, S3 등)가 SQS queue에 write 하는 것을 허용할 때 사용할 수 있다.