본문 바로가기

Infrastructure/Certificate

[SAA] Integration And Messaging

Integration & Messaging

이번 장에서는 SAA를 준비하며 Integration(통합)과 Messaging(메시징)에 대해서 알아보도록 한다.


Overview

  • 여러 애플리케이션을 구축하기 시작하면 애플리케이션 간에 통신이 필요할 수 밖에 없다.
  • 애플리케이션 통신에는 아래의 이미지와 같이 크게 두 가지 패턴이 있다.

  • 갑자기 트래픽이 급증하는 경우 애플리케이션 간 동기화에 문제가 발생할 수 있다.
  • 일반적으로 10개의 비디오만 인코딩하지만, 갑자기 1000개의 비디오를 인코딩해야 하는 경우가 발생할 수 있다.
  • 이러한 경우 애플리케이션을 분리(Decouple)하는 것이 좋다.
    • SQS: 대기열 모델을 사용한다.
    • SNS: Publish/Subscribe 모델을 사용한다.
    • Kinesis: Real-time 스트리밍 모델을 사용한다.
  • 이러한 서비스는 애플리케이션과 독립적으로 확장할 수 있다.

SQS

Standard Queue

  • 10년 이상된 오래된 서비스다.
  • 애플리케이션을 분리하는 데 사용되는 완벽한 관리가 가능하다.
  • 아래와 같은 속성이 있다.
    • 무제한 처리량, 대기열에 있는 메시지 수의 제한이 없다.
    • 메시지의 기본 보존 기한은 4일이며, 최대 14일까지 보관이 가능하다.
    • 낮은 지연 시간을 제공한다.(publish 부터 receive까지 10ms 이내에 처리가 가능)
    • 메시지는 256KB로 제한된다.
  • 메시지는 최소 한번 전달되면 간헐적으로 중복된 메시지가 전달될 수 있다.
  • 전달이 불가능한 메시지를 가질 수 있다.

Producing Messages

  • SDK(Send Message API)를 이용하여 SQS에 데이터를 제공할 수 있다.
  • 메시지는 소비자(Consumer)가 데이터를 소비할 때까지 SQS에 지속(Persist)된다.
  • 메시지는 기본적으로 4일, 최대 14일까지 보존된다.
  • SQS Standard는 처리량이 제한되지 않는다.

Consuming Messages

  • 소비자(Consumer)는 EC2 Instance, Servers, AWS Lambda 등이 될 수 있다.
  • SQS에서 메시지를 Polling하며 한 번에 최대 10개의 메시지까지 가져올 수 있다.
  • 메시지를 RDS Database에 삽입하는 것과 같은 작업을 할 수 있다.
  • DeleteMessage API를 사용하여 메시지를 삭제할 수 있다.

Multiple EC2 Instances Consumers

  • 소비자(Consumer)는 메시지를 병렬로 수신하고 처리한다.
  • 메시지는 1회 이상 배송된다.
  • Best-Effort 메시지 순서를 지정한다.
  • 소비자(Consumer)는 메시지 처리 후에 삭제한다.
  • 소비자(Consumer)를 수평적으로 확장하여 처리량을 개선할 수 있다.

SQS with Auto Scaling Group (ASG)

  • SQS Queue의 길이를 CloudWatch가 관측하고 일정 수준 이상이 되는 경우 Auto Scaling Group을 통해 EC2 Instance를 Scale-Up 할 수 있다.

SQS to Decouple Between Application Tiers

  • Front-end 프로젝트와 Back-end 프로젝트 사이에 SQS를 두어 프로젝트를 분리(Decouple)할 수 있다.

Security

  • Encryption:
    • HTTPS API를 통해서 전송 중 암호화가 가능하다.
    • KMS Keys를 통해 암호화가 가능하다.
    • 클라이언트가 암호화를 진행하는 경우, 클라이언트 사이드 암호화/복호화가 가능하다.
  • Access Controls:
    • IAM 정책을 통해서 SQS API에 대한 접근을 제한할 수 있다.
  • SQS Access Policies:
    • SQS 대기열에 대한 계정 간 액세스에 유용하다.
    • 다른 서비스(SNS, S3)가 SQS Queue에 데이터를 제공할 수 있도록 허용하는 데 유용하다.

Message Visibility Timeout

  • 소비자(Consumer)가 메시지를 Polling한 후 다른 소비자(Consumer)에게는 보이지 않게 된다.
  • 기본적으로 "메시지 가시성 시간 초과(Message Visibility Timeout)"는 30초다.
  • 메시지 처리 시간이 30초임을 의미한다.
  • 메시지 가시성 시간 초과가 끝나면 메시지가 SQS에서 "보이는(Visible)" 상태가 된다.

  • 만약 "Visibility Timeout" 시간 내에 메시지가 처리되지 않으면 두 번 처리된다.
  • 소비자(Consumer)가 ChangeMessageVisibility API를 호출하여 더 많은 시간을 확보할 수 있다.
  • "Visibility Timeout"이 시간이 높고 소비자가 충돌하면 재처리에 시간이 소요된다.
  • "Visibility Timeout"이 너무 낮으면 중복이 발생할 수 있다.

Long Polling

  • 소비자(Consumer)가 대기역에서 메시지를 요청할 때, 대기열에 메시지가 없을 경우 선택적으로 메시지가 도착할 때까지 "기다릴(Wait)" 수 있으며, 이것을 "Long Polling"이라고 한다.
  • Long Polling은 SQS에 호출되는 API의 수를 줄이면서 애플리케이션의 효율성을 높이고 지연 시간을 줄인다.
  • 대기 시간은 1초에서 20초 사이일 수 있으며, 20초가 권장된다.
  • 짧은 폴링 시간보다는 긴 폴링 시간이 권장된다.
  • 대기열 수준에서 긴 폴링을 활성화할 수 있다.
  • API Level에서 "WaitTimeSeconds"를 통해서 Long Polling을 설정할 수 있다.

FIFO Queue

  • FIFO: First In First Out(Queue의 Message Ordering)

  • 제한된 처리량: 배치 없이 300 msg/s을 제공한다.
  • 중복 제거를 통해 정확히 한 번만 메시지를 전송한다.
  • 소비자(Consumer)가 메시지를 순서대로 처리한다.

SQS with Database

  • 부하가 큰 경우에 몇몇 트랜잭션이 유실될 수 있다.

  • SQS가 무한대로 확장할 수 있기 때문에 애플리케이션 중간에서 버퍼(Buffer) 역할을 할 수 있다.


Amazon SNS

  • 하나의 메시지를 많은 수신자(Subscriber)에게 보내고 싶은 경우에는 Amazon SNS를 사용할 수 있다.

  • "이벤트 제공자(Producer)"는 하나의 SNS 주제에만 메시지를 보낸다.
  • SNS 토픽 알림을 수신하고 싶은 만큼의 "이벤트 수신자(Subscription)"에게 토픽을 전달할 수 있다.
  • 각 토픽의 구독자(Subscriber)는 모든 메시지를 받는다.
  • 토픽 하나당 최대 12,500,000개까지 구독이 가능하다.
  • 최대 토픽은 10만개로 제한된다.

  • Amazon SNS는 AWS의 수많은 서비스와 직접적으로 통합될 수 있다.

게시(Publish) 방식

  • Topic Publish(SDK 사용)
    • 토픽 생성
    • 구독(Subscription) 생성, 여러개의 구독 생성 가능
    • 토픽에 Publish
  • Direct Publish(Mobile App SDK 사용)
    • 플랫폼 애플리케이션 생성
    • 플랫폼 엔드포인트(Endpoint) 생성
    • 플랫폼 엔드포인트에 Publish
    • Google GCM, Apple APNS, Amazon ADM과 통합되어 작동

보안(Security)

  • 암호화(Encryption)
    • HTTPS API를 사용한 전송 중 암호화
    • KMS 키를 사용한 REST 암호화
    • 클라이언트에서 암호화/복호화를 원하는 경우 클라이언트 사이드에서 암호화/복호화
  • 접근 제어(Access Controls)
    • SNS API에 대한 접근을 규제(Regulate)하는 IAM 정책
  • SNS 접근 정책(Access Policies, S3 버킷 정책과 유사)
    • SNS 주제에 대한 계정 간 접근에 유용하게 사용
    • S3와 같은 다른 서비스가 SNS 주제에 글을 쓸 수 있도록 허용하는데 유용하게 사용

SNS + SQS: Fan Out

  • SNS에서 한 번 Push하고 구독자인 모든 SQS 대기열에서 수신
  • 완전하게 분리(Decoupled)되어 데이터 손실 없음
  • SQS를 통해 제공되는 기능: 데이터 지속성, 지연된 처리 및 작업 재시도
  • 시간이 지남에 따라 더 많은 SQS Subscribers 추가 가능
  • SQS 대기열 액세스 정책에서 SNS 쓰기를 허용하는지 확인
  • Cross-Region Delivery: 다른 Region의 SQS Queues와 함께 작동

여러 대기열에 대한 S3 이벤트

  • 이벤트 유형(예: Object 생성) 및 접두사의 동일한 조합인 경우(예: /images) S3 Event 규칙을 하나만 가질 수 있다.
  • 동일한 S3 이벤트를 많은 SQS 큐에 전송하려면 팬아웃(fan-out)을 사용할 수 있다.

SNS를 통해 Amazon S3로 Kinesis Data Firehose

  • SNS는 Kinesis로 데이터를 보낼 수 있으므로 아래와 같은 아키텍처를 설계할 수 있다.

FIFO Topic

  • FIFO는 First In First Out의 약자로 Topic의 메시지를 정렬한다.

  • SQS FIFO와 유사한 기능을 제공한다
    • 메시지 그룹 ID별 순서를 지정(동일한 그룹의 모든 메시지 순서 지정)
    • ID 또는 콘텐츠 기반의 중복 제거
  • SQS FIFO 대기열만 Subscriber로 사용할 수 있다.
  • SQS FIFO와 동일한 처리량으로 제한된 처리량을 가진다.

SNS FIFO + SQS FIFO: Fan Out

  • Fan-out, 정렬, 중복 제거가 필요하다면 아래와 같은 아키텍처를 설계할 수 있다.

SNS Message Filtering

  • SNS Topic의 Subscriber로 보낸 메시지를 필터링하는 데 사용되는 JSON 정책을 사용할 수 있다.
  • 만약 Filter 정책이 없는 경우 모든 메시지를 수신한다.


Kinesis Overview

  • 실시간으로 손쉽게 스트리밍 데이터를 수집, 처리 및 분석이 가능하다.
  • 실시간 데이터를 수집한다. 애플리케이션 로그, 메트릭, 웹 사이트 클릭 스트림, IoT 원격 측정 데이터
  • Kinesis Data Streams: 데이터 스트림 캡처, 처리 및 저장
  • Kinesis Data Firehose: 데이터 스트림을 AWS 데이터 저장소로 적재한다.
  • Kinesis Data Analytics: SQL 또는 Apache Flink로 데이터 스트림을 분석한다.
  • Kinesis Video Streams: 비디오 스트림 캡처, 처리 및 저장한다.

Kinesis Data Streams

  • 1 ~ 365일 사이의 데이터 보존 기간
  • 데이터 재처리(재생) 기능
  • Kinesis에서 한 번 데이터를 삽입하면 삭제가 불가능(데이터 불변성)
  • 동일한 파티션을 공유하는 데이터가 동일한 Shard로 이동
  • Producers: AWS SDK, Kinesis Producer Library(KPL), Kinesis Agent
  • Consumers:
    • 데이터 생성: Kinesis Client Library(KCL), AWS SDK
    • 관리: AWS Lambda, Kinesis Data Firehose, Kinesis Data Analytics

Kinesis Data Streams - Capacity Modes

  • 프로비저닝 모드(Provisioned Mode):
    • 프로비저닝된 샤드의 수를 선택하거나 수동으로 확장하거나 API를 사용할 수 있다.
    • 각 샤드는 1MB/s의 입력(또는 초당 1,000개의 레코드).
    • 각 샤드당 2MB/s의 출력(클래식 또는 향상된 fan-out 소비자(Consumer)).
    • 시간당 프로비저닝 된 샤드당 지불
  • 온디멘드 모드(On-demand Mode):
    • 용량을 프로비저닝하거나 관리할 필요가 없다.
    • 프로비저닝된 기본 용량(초당 4MB 또는 초당 4,000개 레코드)
    • 지난 30일 동안 관측된 처리량 피크(Peak)를 기반으로 자동 확장된다.
    • 시간당 & 스트림당 지불하며 GB당 데이터 In/Out을 기반으로 지불한다.

Kinesis Data Streams Security

  • IAM 정책을 사용하여 Access/Authorization 제어
  • HTTPS 엔드포인트를 사용하여 전송 중 암호화
  • KMS를 통한 REST 암호화
  • 클라이언트 측에서 데이터의 암호화/복호화를 구현
  • Kinesis에서 VPC 내에서 액세스할 수 있는 VPC Endpoint를 구축
  • CloudTrail을 사용하여 API 호출 모니터링


Kinesis Data Firehose

  • 완전 관리형 서비스로 관리가 필요없고 자동으로 확장하며 Serverless
    • AWS: Redshift, S3, OpenSearch
    • 타사 파트너: Splunk, MongoDB, DataDog, NewRelic
    • 사용자 지정: 원하는 HTTP 엔드포인트로 전송
  • Firehose를 통과하는 데이터에 대한 비용을 지불
  • Near Real Time
    • 전체 배치가 아닌 최소 60초 지연 시간 또는 한 번에 최소 1MB의 데이터를 전송
  • 다양한 데이터 형식, 변환, 압축을 지원
  • AWS Lambda를 사용하여 맞춤형 데이터 변환을 지원
  • 백업 S3 버킷에 실패한 데이터 또는 모든 데이터를 전송 가능

Kinesis Data Stream vs Firehose

  • Kinesis Data Streams
    • 대규모 데이터 수집을 위한 스트리밍 서비스
    • 사용자 지정 코드 작성(Producer/Consumer)
    • 실시간(~200ms)
    • 확장 관리(Shard Splitting/Merging)
    • 1 ~ 365일 기간 동안의 데이터 저장
    • 재처리(Replay) 기능 지원
  • Kinesis Data Firehose
    • S3/Redshift/OpenSearch/3rd Party/사용자 지정 HTTP
    • 완전 관리형 서비스
    • 거의 실시간(Near Real-Time, 버퍼 시간 최소 60초)
    • 자동 스케일링
    • 데이터 저장을 미지원
    • 재처리(Replay) 기능 미지원

Ordering data into Kinesis

  • 도로에서 100대의 트럭(truck_1, truck_2 ...)이 GPS 위치를 정기적으로 AWS 전송하고 있다고 가정
  • 각 트럭에 대한 데이터를 순서대로 사용하여 트럭의 움직임을 정확하게 추적이 필요
  • truck_id의 Partition Key 값을 사용하여 데이터를 전송
  • 동일한 키는 항상 동일한 Shard로 이동

Ordering data into SQS

  • SQS Standard의 경우 정렬(Ordering) 기능이 없음
  • SQS FIFO의 경우 그룹 ID를 사용하지 않으면 메시지가 발송(Send)된 순서대로 소비(Consume)되며 소비자(Consumer)는 한 명뿐이다.

  • 소비자 수를 확장하려고 하지만 메시지가 서로 관련되어 있을 때 메시지를 "그룹화"하기를 원하는 경우 Group ID를 사용할 수 있다.(Kinesis의 Partition Key와 유사)

Kinesis vs SQS Ordering

  • 트럭 100대와 5개의 Kinesis Shard, 1개의 FIFO SQS가 있다고 가정한다.
  • Kinesis Data Streams:
    • 평균적으로 한 샤드당 20대의 트럭을 보유하게 된다.
    • 트럭은 각 샤드 내에서 데이터가 정렬된다.
    • 병렬 소비자(Consumer)의 최대 용량은 5다.
    • 최대 5MB/s의 데이터를 수신할 수 있다.
  • SQS FIFO
    • SQS FIFO Queue가 하나만 있다.
    • 100개의 Group ID를 가지게 된다.
    • 최대 100명의 소비자를 보유할 수 있다.(100개의 Group ID 때문에)
    • 초당 최대 300개의 메시지를 처리할 수 있다.(배치를 사용하는 경우 3,000개)

SQS vs SNS vs Kinesis

  • SQS:
    • 소비자(Consumer)가 데이터를 가져간다.(Pull)
    • 데이터는 소비된 이후에 삭제된다.
    • 원하는 만큼 소비자(Consumer)를 보유할 수 있다.
    • 처리량 프로비저닝이 필요 없다.
    • FIFO 대기역에 대해서만 정렬 보증이 가능하다.
    • 개별 메시지 지연 기능이 있다.
  • SNS:
    • 여러 구독자(Subscriber)에게 데이터를 전송한다.(Push)
    • 최대 12,500,000개의 구독자를 가질 수 있다.
    • 데이터가 전송되지 않은 경우 데이터가 지속되지 않는다.
    • Pub/Sub 구조를 가진다.
    • 최대 100,000개의 Topic을 생성할 수 있다.
    • 처리량 프로비저닝이 필요 없다.
    • fan-out 아키텍처 패턴을 위해 SQS와 통합된다.
    • SQS FIFO에 대한 FIFO를 지원한다.
  • Kinesis:
    • Standard: 데이터를 가져간다.(Pull, 샤드당 2MB)
    • 향상된 fan-out: 데이터를 전송한다.(Push, 소비자당 & 샤드당 2MB)
    • 데이터 재처리(Replay)이 가능하다.
    • 실시간 빅데이터, 분석, ETL을 위해 사용된다.
    • Shard 레벨에서 정렬이 가능하다.
    • 1 ~ 365 기간 내에서 데이터 저장 주기를 설정할 수 있다.
    • "프로비저닝 모드" 또는 "온디맨드 용량 모드"로 설정할 수 있다.

Amazon MQ

  • SQS, SNS는 "클라우드 네이티브" 서비스로 AWS의 독점 프로토콜이 사용된다.
  • 온프레미스에서 실행되는 기존 애플리케이션은 MQTT, AMQP, STOMP, Openwire, WSS와 같은 개방형 프로토콜을 사용할 수 있다.
  • 클라우드로 마이그레이션할 때, 애플리케이션을 재설계하여 SQS와 SNS를 사용하는 대신 Amazon MQ를 사용할 수 있다.
  • Amazon MQ는 RabbitMQ와 ActiveMQ의 관리형 메시지 브로커 서비스다.
  • Amazon MQ는 SQS/SNS 만큼 "확장"되지 않는다.
  • Amazon MQ는 서버에서 실행되며, Multi-AZ에서 Failover와 함께 실행할 수 있다.
  • Amazon MQ에는 Queue 기능(SQS)와 토픽 기능(SNS)가 모두 있다.

고가용성(High Availability)


참고한 자료

'Infrastructure > Certificate' 카테고리의 다른 글

[SAA] AWS Lambda  (0) 2023.10.02
[SAA] Container  (0) 2023.10.02
[SAA] Hybrid Storage Cloud  (0) 2023.09.24
[SAA] Amazon FSx  (0) 2023.09.24
[SAA] Advanced Storage on AWS  (0) 2023.09.24