develop/AWS
[SAA] Integration & Messaging: SQS, SNS, Kinesis, Active MQ
hsleeee
2024. 6. 27. 10:00
반응형
SMALL
1. Amazon SQS(대기열 모델 사용)
- Standard Queue
- AWS의 첫번째 서비스 중 하나, 가장 오래된 서비스
- 완전 관리형 서비스, 애플리케이션 분리 시 사용
- Attributes
- 무제한 처리량, 대기열에 저장 가능한 메시지 수의 제한이 없음
- 메시지 보존 기간의 기본 값은 4일, 최대 기간은 14일
- 지연 시간이 짧음(<10ms on publish and receive)
- 전송되는 메시지는 256kb로 제한
- 중복 메시지가 발생할 수 있음(at least once delivery, occasionally)
- Can have out of order message (best effort ordering)
- Producing Messages
- SDK를 사용하여 SQS에 메시지를 생성(SendMessage API)
- 메시지는 소비자가 해당 메시지를 읽고 삭제할 때까지 SQS 대기열에 유지
- 메시지 보존 기간: default 4 days, max 14 days
- SQS Standard: 무제한 처리량 제공
- Consuming Messages
- 소비자(EC2 인스턴스, 서버, 또는 AWS Lambda에서 실행)
- 메시지를 가져오기 위해 SQS를 폴링(한번에 최대 10개의 메시지 수신)
- 메시지를 처리(ex: 메시지를 RDS 데이터베이스에 삽입)
- DeleteMessage API를 사용하여 메시지 삭제
- Multiple EC2 Instance Consumers
- 소비자들은 메시지를 병렬로 수신하고 처리
- 최소 한번의 전송 보장
- 각 소비자는 poll 함수를 호출하여 다른 메시지 세트를 수신하게 됨, 만일 메시지가 소비자에 의해 충분히 빠르게 처리되지 않으면 다른 소비자가 수신하게 됨, 따라서 적어도 한 번은 전송이 됨
- 최선의 노력으로 메시지 순서 보장(Best-effort message ordering)
- 소비자들은 메시지를 처리한 후에 삭제해야 함
- 처리량을 향상시키기 위해 소비자를 추가하고 수평 확장을 할 수 있음
- SQS With Auto Scailing Group (ASG)
- 소비자가 ASG 내부에서 EC2 인스턴스를 실행하고, SQS 대기열에서 메시지를 폴링함
- ASG는 일종의 Metric에 따라 확장되어야 하는데, 이때 사용하는 Metric은 대기열의 길이임(ApproximateNumberOfMessage)
- 경보를 설정할 수 있는데, 댇기열의 길이가 특정 수준을 넘어가면 CloudWatch Alarm을 설정하면 됨, 이 경보는 AutoScaling Group의 용량을 n 만큼 증가시키는데, 그러면 더 많은 메시지가 SQS 대기열에 존재하게 도딤
- ex: 웹사이트에 주문이 폭주해서 오토 스케일링 그룹이 더 많은 EC2 인스턴스를 제공하면 메시지들은 더 높은 처리량으로 처리할 수 있게 됨
- SQS to decouple between application tiers
- 애플리케이션 계층간에 분리를 위해 사용됨
- Security
- Encryption
- 전송 중 데이터의 암호화는 HTTPS API 사용
- 정지 상태(at-rest) 데이터의 암호화는 KMS 키 사용
- 클라이언트가 직접 암/복호화를 수행하려는 경우 클라이언트 측 암호화 사용
- Access Controls
- IAM 정책을 사용하여 SQS API에 대한 액세스를 규제
- SQS Access Policies(S3 버킷 정책과 비슷)
- SQS 대기열에 대한 교차 계정 액세스를 수행하는 경우에 유용
- 다른 서비스(SNS,S3 등)가 SQS 대기열에 슬 수 잇도록 허용하는 데 유용
- Encryption
- Message Visibility Timeout
- 소비자가 메시지를 폴링하면 그 메시지는 다른 소비자에게는 보이지 않게 됨
- 기본적으로 '메시지 가시성 시간 제한 초과'는 30초
- 즉 메시지는 처리되기까지 30초의 시간을 갖게됨
- 메시지 가시성 시간 제한이 초과되면 메시지는 SQS에서 "가시"상태가 됨
- 즉 가시성 시간 제한 기간 내에서는 메시지는 다른 소비자에게 보이지 않고, 가시성 시간 제한이 초과되고 메시지가 삭제되지 않앗다면 메시지는 대기열에 다시 넣어짐
- 메시지가 가시성 시간 내에 처리되지 않으면 메시지는 두 번 처리될 수도 있음
- 소비자는 ChangeMessageVisibility라는 API를 호출하여 더 많은 시간을 얻을 수 있음
- 가시성 시간 제한이 너무 길 경우(시간 단위), 소비자가 충돌했을 때 이 메시지가 다시 나타날 때까지 (SQL 대기열에 보일 때 까지) 몇 시간이 걸릴 수 있음
- 가시성 시간 제한이 너무 짧을 경우(초 단위) 처리할 시간이 충분하지 않으면 다른 소비자가 메시지를 여러 번 읽고 해당 요청이 여러번 처리될 수 있음
- Long Polling
- 소비자가 대기열에서 메시지를 요청할 때 대기열에 메시지가 없다면 메시지가 도착할 때 까지 "대기"할 수 있음
- 이를 롱 폴링이라고 한다.
- 롱 폴링은 SQS로의 API 호출 수를 줄이고, 애플리케이션의 효율성을 향상 시키며, 응답 지연 시간을 감소 시킴
- 대기 시간은 1초부터 20초 사이로 설정 가능
- 롱 폴링은 숏 폴링에 비해 선호됨
- 롱 폴링은 대기열 수준이나 WaitTimeSeconds API를 사용하여 API 수준에서 활성화할 수 있음
- FIFO(First In First Out) Queue
- 처리량에 제한이 있음, 배치 처리 없이는 초당 300개의 메시지 처리, 배치 처리를 사용하면 초당 3,000개의 메시지 처리 가능
- 중복 메시지를 제거하여 정확히 한 번만 전송 가능
- 소비자에 의해 메시지는 순서대로 처리됨
- SQS with Auto Scaling group (ASG)
- 애플리케이션이 요청을 처리할 때 특정 트랜잭션에 오류가 발생한다면 해당 고객 트랜잭션이 유실될 수 있음
- 이때 쓰기 대상 DB에서 SQS를 버퍼로 사용 가능
- DB에 요청을 바로 쓰는 대신, 트랜잭션을 SQS 대기열에 먼저 쓰면 처리량 문제 발생 X
2. Amazon SNS
- Pub(게시)/Sub(구독)을 통해 메시지를 SNS 주제(Topic)로 전송할 수 있음
- 해당 주제에는 많은 굳독자가 있고, 각 구독자는 SNS 주제에서 해당 메시지를 수신하고 보관할 수 있음
- Amazon SNS에서 이벤트 생산자는 한 주제에만 메시지를 전송
- 이벤트 수신자는 해당 주제와 관련한 SNS 알림을 받으려는 사람, 원하는 만큼 생성 ㄱ가능
- 주제에 대한 각 구독자는 모든 메시지를 수신(메시지 필터링을 위한 기능도 있음)
- 주제당 최대 12,500,000개의 구독 가능
- 주제의 수는 100,000개로 제한
- SNS에서 구독자에게 게시할 수 있는 것은
- SNS에서 직접 이메일 전송
- SMS 및 모바일 알림 전송
- 지정된 HTTP or HTTPS 엔드포인트로 직접 데이터 전송
- SQS와 같은 특정 AWS 서비스와 통합하여 메시지를 대기열로 전송
- 메시지 수신 후 함수가 코드를 수행하도록 Lambda에 전송
- Firehose를 통해 데이터를 Amazon S3나 RedShift로 전송
- 다양한 AWS 서비스에서 데이터를 직접 수신도 가능, AWS에서 알림이 발생하면 SNS에서 데이터 수신
- CloudWathch Alams
- AWS Budgets
- Lambda
- Auto Scaling Group(Notifications)
- S3 Bucket(Events)
- DynamoDB
- CloudFormation(State Changes)
- AWS DMS(New Replic)
- RDS Events
- How to Publish
- Topic Publish(using the SDK)
- 주제 생성
- 하나 또는 여러개의 구독 생성
- SNS에 주제 게시
- Direct Publish(for mobile apps SDK)
- 플랫폼 애플리케이션 생성
- 플랫폼 엔드포인트 생성
- 플랫폼 엔드포인트에 겍시
- 수신 가능 대상은 Google GCM, Apple APNS, Amazon ADM 등
- Topic Publish(using the SDK)
- Security
- SQS와 동일
- Encryption
- 전송 중 데이터의 암호화는 HTTPS API 사용
- 저장 데이터 데이터의 암호화는 KMS 키 사용
- 클라이언트가 직접 암/복호화를 수행하려는 경우 클라이언트 측 암호화 사용
- Access Controls
- IAM 정책을 사용하여 SQS API에 대한 액세스를 규제
- SNS Access Policies(S3 버킷 정책과 비슷)
- SQS 대기열에 대한 교차 계정 액세스를 수행하는 경우에 유용
- 다른 서비스(SNS,S3 등)가 SQS 대기열에 슬 수 잇도록 허용하는 데 유용
- SNS + SQS: Fan Out
- SNS 주제에 메시지를 전송한 후 원하는 수의 SQS 대기열이 SNS 주제를 구독하게 하여 이 대기열은 구독자로서 SNS로 들어오는 모든 메시지를 수신하게 됨
- SNS에서 한 번 푸시하면 구독하는 모든 SQS 대기열에서 수신
- 완전히 분리된 모델이며 데이터 손실 X
- SQS로 작업을 재시도할 수 있을 뿐만 아니라 데이터 지속성, 지연 처리 수행 가능
- 시간이 지남에 따라 SNS 주제를 구독하도록 더 많은 SQS 대기열 추가 가능
- 이를 위해서는 SQS 액세스 정책이 SNS 쓰기 작업을 할 수 있도록 허용해야 함
- 리전간 전달 가능 - 다른 리전의 SQS 대기열과 함께 작동
- SNS FIFO + SQS FIFO: Fan Out
- 팬아웃, 순서 지정, 중복 제거 기능이 필요한 경우 SNS FIFO와 SQS FIFO를 조합하여 원하는 기능 구현
- Message Filtering
- SNS 주제의 구독으로 전송되는 메시지를 필터링하기 위해 JSON 정책을 사용
- 구독에 필터 정책이 없는 경우, 해당 구독은 모든 메시지를 수신
3. Amazon Kinesis
- Kinesis를 활용하면 실시간 스트리밍 데이터를 쉽게 수집하고 처리하여 분석 가능
- 애플리케이션 로그, 매트릭, 웹사이트 클릭 스트림, IoT 원ㄱ격 측정 데이터 등의 실시간 데이터 수집
- Kinesis Data Streams: 데이터 스트림을 캡처,처리 및 저장
- 보존 기간은 1일 ~ 365일 사이로 설정
- 데이터 재처리 및 확인 가능
- Kinesis로 ㄷ데이터가 삽입된 후에는 삭제 불가(불변성)
- 동일한 파티션을 공유하는 데이터는동일한 샤드로 전송(순서 보장), 키를 기반으로 데이터 정렬 가능
- 생산자: AWS SDK, Kinesis Producer Library(KPL), Kinesis Agent
- 소비자
- 직접 작성: Kinesis Client Library(KCL), AWS SDK
- 관리형: AWS Lambda, Kinesis Data Firehose, Kinesis Data Analytics
- Capacity Modes
- Provisioned Mode
- 사전에 프로비저닝할 샤드 수를 정하고 수동 또는 API를 사용하여 스케일 조정
- 각 샤드당 1mb/s로 레코드를 받아드림(or 초당 1,000개의 레코드)
- 출력량의 경우 각 샤드당 2mb/s(일반적인 소비 유형 또는 향상된 팬아웃 방식에 적용)
- 샤드를 프로비저닝할 때 마다 시간당 비용 부과
- On-demand mode
- 용량을 사전에 프로비저닝 하거나 관리할 필요 X
- 기본적으로는 4mb/s의 처리량 또는 초당 4,000개의 레코드 처리
- 지난 30일간 관측된 최대 처리량에 기반하여 자동으로 스케일 조정
- 시간당/스트림당 송수신 데이터양(gb단위)에 따라 비용 부과
- Provisioned Mode
- Security
- IAM 정책을 사용하여 액세스 및 권한 부여 제어
- HTTPS 엔드포인트를 통한 전송중 데이터 암호화
- KMS를 사용하여 데이터 정지 상태에서의 암호화
- 클라이언트 측에서 데이터의 암/복호화 구현 가능(더 어려움)
- VPC내에서 액세스 하기 위해 Kinesis에 대한 VPC 엔드포인트 사용 가능
- 모든 API 요청은 CloudTrail을 사용하여 모니터링 가능
- Kinesis Data Firehose: 데이터 스트림을 AWS 데이터 저장소로 로드
- 완전 관리형 서비스, 관리 작업 필용 X, 자동 스케일링 및 서버리스 기능 제공
- AWS: Reshift, Amazon S3, OpenSearch와 통합
- Third-party: Splunk, MongoDB, DataDog, NewRelic 등
- Custom: HTTP EndPoints
- Firehose를 통과하는 데이터에 대해서만 비용 지불
- 거의 실시간으로 데이터 처리
- 전체 배치가 아닌 경우 최소 60초의 지연 시간
- 한번에 적어도 1mb 이상의 데이터가 있을 때까지 기다렬야 함
- 다양한 덷이터 형식, 전환, 변환, 압축 지원
- AWS Lambda를 사용하여 사용자 정의 데이터 변환 가능
- 실패한 데이터 또는 모든 데이터를 백업용 S3 Bucket으로 전송 가능
- 완전 관리형 서비스, 관리 작업 필용 X, 자동 스케일링 및 서버리스 기능 제공
- Kinesis Data Analytics: SQL 또는 Apache Flink를 사용하여 데이터 스트림을 분석
- Kinesis Video Streams: 비디오 스트림을 캡처, 처리 및 저장
Kinesis Data Streams | Kinesis Data Firehose |
대규모로 데이터를 수집하는 스트리밍 서비스 | S3, Redshift, OpenSearch, third-party, http로 데이터 스트리밍 |
생산자와 소비자에 대해 커스텀 코드 사용 가능 | 완전 관리형 서비스 |
Real-timee (~ 200ms) | Near real-time(버퍼 시간 최소 60초) |
용량 직접 조절 가능(샤드 분할 및 병합) | 자동 스케일링 |
제공한 용량만큼 비용 지불 | Firehose를 통과하는 데이터에 대해서만 비용 지불 |
1 ~ 365일까지 데이터 저장 | 데이터 저장 기능 X |
여러 소비자가 같은 스트림에서 읽어올 수 있고 반복 기능도 지원 | 데이터를 반복하는 기능 지원 X |
4. SQS vs SNS vs Kinesis
- SQS
- 소비자가 SQS 대기열에서 메시지르 요청하여 가져오는 PULL 모델
- 데이터를 처리한 후 소비자가 대기열에서 삭제하여 다른 소비자가 읽을 수 없도록 함
- 소비자의 수에는 제한 X
- 관리형 서비스이기 때문에 처리량을 프로비저닝할 필요 X
- FIFO 대기열을 사용해야 순서 보장 가능
- 메시지에 지연 기능 존재
- SNS
- 게시/구독 모델로 다수의 구독자에게 데이터를 푸시하면 메시지의 복사본을 수신
- SNS 주제별로 12,500,000 구독자를 가질 수 있음
- 데이터가 SNS에 전송되면 지속되지 않음(제대로 전달되지 않을 경우 데이터 손실 가능)
- 100,000 개의 주제로 확장 가능
- 처리량을 프로비저닝할 필요 X
- SQS와 결합하여 팬아웃 아키텍쳐 패턴 사용 가능
- SNS FIFO 주제를 SQS FIFO 대기열과 결합 가능
- Kinesis
- Standard: 소비자가 Kinesis로부터 데이터를 가져옴(PULL), 샤드당 2mb/s
- Enhanced-fan out: Kinesis가 소비자에게 데이터 푸시 샤드 하나에 소비자당 2mb/s
- Kinesis데이터 스트림에서는 데이턱가 지속되긱 때문에 데이터를 다시 재생할 수 있음
- 실시간 빅데이터 분석, ETL등에 사용
- n 일 후에 데이터 만료
- 프로비저닝 모드 / 온디멘드 용량 모드
5. Amazon MQ
- SQS, SNS는 AWS의 고유한 프로토콜로 클라우드 네이티브 서비스이다. 각자 사용하는 API SET가 따로 있음
- 온프레미스에서 실행되는 전통적인 애플리케이션은 MQTT, AMQP, STOMP, Openwire, WSS 등의 오픈 프로토콜 사용 가능
- 애플리케이션을 클라우드에 마이그레이션 하는 경우에는 SQS, SNS 프로토콜 혹은 API를 사용하도록 애플리케이션을 재구성하는 대신 MQTT, AMQP와 같이 기존에 쓰던 애플리케이션을 이용하고 싶을 때 Amazon MQ 사용
- RabbitMQ, ActiveMQ를 위한 관리형 메시지 브로커 서비스
- SQS, SNS 만큼 확장성이 크지 않음
- 서버에서 실행되며, 장애 조치를 위해 Multi-AZ에서 실행 가능
- SQS와 유사한 대기열 기능 및 SNS와 유사한 주제 기능이 모두 제공
반응형
LIST