어플리케이션 여러 개를 배포할 때, 서로 간의 커뮤니케이션을 하는 방식을 고려하는 것이 중요하다.
여기에는 동기 및 비동기 통신 방식이 있는데, 각각의 방식은 특정 상황에 따라 적합하게 선택될 수 있다.
1. 동기(Synchronous) 통신 방식
- 동기 통신 방식은 애플리케이션 간 직접 연결을 통해 이루어진다.
- 구매 서비스가 배송 서비스와 직접 소통하는 경우가 이에 해당한다.
- 이 방식에서는 요청-응답 흐름이 있어, 요청이 완료되기 전까지 호출한 애플리케이션은 대기해야 한다. 따라서 실시간 데이터 교환이 필요한 경우에 적합하지만, 서비스가 긴밀하게 연결되므로 결합도가 높아져 유지보수가 어려울 수 있다.
2. 비동기(Asynchronous) / 이벤트 기반 통신 방식
- 비동기 통신은 중간 미들웨어를 통해 이루어진다.
- 여기서 애플리케이션들은 서로 직접적으로 연결되지 않으며, 메시지 대기열을 통해 메시지를 주고받는다.
- 예를 들어, 구매 서비스가 메시지를 'queue'에 전달하면, 배송 서비스는 해당 대기열에서 메시지를 가져와 처리할 수 있다. 이러한 방식은 독립적인 확장이 가능하며, 지연을 허용할 수 있는 애플리케이션 간에 이상적이다.
- 비동기 통신의 한 예로 Amazon SQS를 들 수 있다.
- SQS는 메시지 대기열을 통해 애플리케이션 간의 분리를 지원하고, 스케일링 및 결합도 감소에 유용하다.
- 대기열에는 메시지를 생산자가 보내고, 소비자가 polling을 통해 해당 메시지를 가져가게 된다.
- SQS에서는 여러 소비자가 메시지를 처리하며, 처리가 끝나면 DeleteMessage API로 메시지를 대기열에서 삭제해 중복 처리를 방지한다.
AWS 서비스 활용
- SQS (Simple Queue Service
- 대기열을 통해 애플리케이션을 분리하고 비동기 커뮤니케이션을 가능하게 한다.
- SNS (Simple Notification Service)
- pub/sub 모델을 통해 메시지를 여러 구독자에게 전송하는 방식이다.
- Kinesis
- 실시간 스트리밍과 대용량 데이터를 처리하는 데 사용된다.
확장성
- 이 세 가지 서비스(SQS, SNS, Kinesis)를 사용하면 애플리케이션을 독립적으로 확장할 수 있으며, 큰 트래픽 변화에도 잘 대응할 수 있다.
Amazon SQS
- SQS의 핵심은 대기열. AWS에서 제공하는 간단한 대기열 서비스로, 메시지를 대기열에 저장하고, 그 메시지를 처리할 애플리케이션을 분리하는 버퍼 역할을 한다.
- '생산자'는 메시지를 SQS 대기열에 전송하며, 소비자는 대기열에서 메시지를 폴링(polling)하여 처리한다.
- 메시지를 대기열에 넣은 후, '소비자'는 주기적으로 대기열에서 메시지를 확인하고 처리한다. 메시지를 처리한 후에는 대기열에서 해당 메시지를 삭제한다.
- SQS는 동시에 여러 생산자와 소비자를 지원하며, 생산자와 소비자를 분리함으로써 애플리케이션의 독립성을 유지하고 확장성을 향상시킨다.
SQS의 주요 특징
- 무제한 처리량: 초당 무한한 양의 메시지를 대기열에 보내거나 수신할 수 있다.
- 메시지 보존 기간: 기본적으로 메시지는 4일 동안 대기열에 남아있고, 최대 14일까지 설정할 수 있다. 이 기간 내에 메시지를 처리하지 않으면 삭제된다.
- 짧은 지연 시간: 메시지를 전송하거나 받을 때 10밀리초 이내에 응답을 받는다.
- 메시지 크기 제한: 한 메시지당 최대 256KB까지만 허용된다.
- 중복 전송: SQS는 적어도 한 번은 메시지를 전달하는 방식을 사용하기 때문에 중복 메시지가 발생할 수 있다.
SQS - Standard Queue
- AWS 에서 제공하는 가장 오래된 서비스이다..
- 완전관리형 서비스이며, 애플리케이션을 분리하는데 사용된다.
- 무제한 처리량을 얻을 수 있다.
- 원하는 만큼의 메시지를 큐로 보낼 수 있다.
- 처리량에 제한이 없고 대기열에 있는 메시지 수에도 제한이 없다.
- 각 메시지는 수명이 짧다.
- 기본값으로 4일에서 14일까지 남아있다.
- 그동안 처리되지 않으면 소실된다.
- 지연 시간이 짧아서 SQS는 메시지를 보내거나 SQS에서 메시지를 게시 및 수신 시 10ms초 이내로 빠르게 응답을 받는다.
- SQS로 보내는 메시지는 개당 최대 256kb까지 가능하다.
- 메세지는 중복이 있을 수 있다
- 순서에 맞지 않는 메시지가 존재할 수도 있다.
SQS - 메시지 전송자 ( Producing Messages )
- 최대 256kb의 메시지가 SQS로 전송된다.
- 전송자는 SDK 키트를 사용하여 SQS로 메시지를 보낸다. ( SQS에 메시지를 보내는 API : sendMessage API)
- 수신자가 메시지를 읽고 삭제할 때까지 SQS 대기열에 유지된다. (4일 ~ 14일)
- 주문 프로세스를 예시로 들 수 있는데 주문이 발생했을 때, order id, customer id, 주소 등등의 정보를 SQS로 보낸다 => 이후 수신자가 정보를 받고 처리한다.
SQS - 메시지 수신자 ( Consuming Messages )
- Ec2, 온프레미스, Lambda 등에서 실행될 수 있다.
- 만약 SQS에 대기 중인 메시지가 있다면, 대기중인 메시지가 있다는 응답을 받는다.
- 소비자는 한 번에 최대 10개의 메시지를 받을 수 있다.
- 만일 소비자에 의해 충분히 빠르게 처리되지 않는다면, 다른 소비자가 수신하게 된다.
- >> 적어도 한 번은 전송이 된다
- 소비자가 메시지를 처리하면 반드시 DeleteMessage API로 대기열에서 삭제해야 한다.
그렇지 않다면 다른 소비자에게 메시지가 전송될 수도 있다. - SQS 대기열에 너무 많은 메시지가 있어 처리량을 늘려야 한다면,
소비자를 추가하고 수평 확장을 수행해서 처리량을 개선해야 한다.
SQS with ASG
ASG는 SQS를 사용하는 완벽한 사례로 적용된다.
- 소비자가 ASG 내부에서 EC2 인스턴스를 실행하고 SQS에서 메시지를 풀링한다.
- 대기열의 길이는 CloudWatch Metric - Queue Length에서
ApproximateNumberOfMessages를 통해 알 수 있다.- 알림을 설정할 수 있다,
- 대기열의 길이가 특정 수준을 넘어가면, 알림을 보내 ASG 용량을 증가시킬 수 있다.
SQS to decouple between application tiers (계층간 분리를 위한 SQS)
- SQS는 어플리케이션 계층 간에 분리를 위해서 사용된다.
- 비디오를 처리 예시
- 프론트에서 요청을 받고 비디오를 처리한 후 S3 버킷에 삽입한다.
- 처리 시간이 오래 걸릴 수 있고, 프론트에서 이를 처리하려면 웹사이트 속도가 느려질 수 있다.
- 애플리케이션을 분리해서 실제 파일 처리를 다른 애플리케이션에 수행하도록 한다.
- 비디오 처리 요청이 들어올 때 SQS 대기열로 메시지를 전송하고, 백엔드에서 큐에 들어있는 메시지를 수신해 S3에 삽입하면 웹사이트 속도 지연 문제가 없을 것이다.
SQS - Security
- HTTPS 프로토콜을 사용하여 메시지를 보내고 생성하면서 In-flight 암호화를 실시한다. (전송 중 암호화)
- KMS 키를 사용하여 대기 상황에서 미사용 암호화를 할 수 있다.
- 클라이언트 측 암호화를 할 수도 있다. (SQS에서 지원 X)
- 클라이언트가 암호화 및 암호 해독을 수행 가능해야 할 수 있다.
- Access Controls를 위해 IAM 정책을 사용해 SQS API를 제한할 수 있다.
- SQS 액세스 정책(similar to S3 bucket policies)
- SQS 대기열에 대한 교차 계정 액세스를 수행하려는 경우
- SNS 같은 다른 서비스가 SQS 대기열에 S3 이벤트 같은 것을 쓸 수 있도록 허용하려는 경우에 유용하다.
SQS - queue Access Policy
- SQS queue 액세스 정책은 S3 버킷 정책과 굉장히 유사하다.
- 1. Cross Account Access:
- 어떤 계정에 SQS가 있고 다른 계정의 EC2가 그 대기열에 액세스해야 한다고 가정해보자.
- 다른 계정의 큐에서 메시지를 가져오기 위해서는 대기열 액세스 정책을 생성하고, 첫 번째 계정의 SQS 대기열에 첨부를 해야한다.
- 정책은 아래와 같ㅌ다.
- 2. publish S3 Event Notifications To SQS queue
- S3의 이벤트 알림을 큐에 넣는 것
- SQS 대기열에 자동으로 메세지를 보낸다.
- 마찬가지로 SQS 대기열은 S3 버킷이 메시지를 보낼 수 있는 권한을 설정해야 한다.
SQS - Message Visibility Timeout
- 기능: 소비자가 메시지를 가져가면 해당 메시지는 일정 시간 동안 다른 소비자에게 보이지 않는다.
- 기본 설정: 기본 가시성 타임아웃은 30초이며, 이 시간이 지나면 메시지가 다시 큐에 나타난다.
- API: ChangeMessageVisibility API를 통해 소비자가 더 많은 시간이 필요할 경우 타임아웃 시간을 연장 가능하다.
- 주의사항: 타임아웃이 너무 길면 오류 발생 시 재처리에 시간이 걸리고, 너무 짧으면 중복 처리 가능성 증가한다.
SQS - 실패 메시지 대기열 (Dead Letter Queue, DLQ)
- 정해진 횟수 내에 메시지가 처리되지 않으면 DLQ로 이동하여 무한 재시도를 방지한다.
- 최대 수신 임계값을 설정하여 횟수 초과 시 DLQ로 메시지 이동한다.
- 문제가 반복되는 메시지를 격리하여 디버깅에 활용 가능하다.
- FIFO 큐는 DLQ도 FIFO, 표준 큐는 DLQ도 표준 큐여야 한다.
- 메시지의 문제를 파악할 수 있도록 14일 정도의 보관 기간 설정 권장한다.
SQS DLQ - Redrive to Source
- DLQ에 있는 실패 메시지를 원본 큐로 재전송하여 문제를 해결 후 재처리 가능하다.
- 오류를 수정한 후, DLQ 메시지를 원래 큐로 이동시켜 다시 소비자에게 할당한다.
SQS - Delay Queue (지연 대기열)
- 메시지가 대기열에 들어간 후 소비자가 바로 볼 수 없도록 지연시키는 기능이다.
- 기본 지연 시간: 0초 (즉시 표시), 최대 15분까지 설정 가능하다.
- 설정 방법
- 전체 대기열에 적용하려면 큐 단위에서 지연 시간 설정.
- 개별 메시지마다 지연 시간을 다르게 설정하려면 DelaySeconds 파라미터를 사용하여 지정 가능.
SQS - Long Polling (롱 폴링)
- 대기열이 비어있을 때 소비자가 메시지 요청 시 일정 시간 동안 기다리게 하는 기능이다.
- API 호출 수를 줄여 비용 절감 및 CPU 연산 절약하는 것이 목적이다.
- 1~20초 사이로 설정 가능, 보통 20초를 권장한다.
- 설정 방법
- 대기열 레벨에서 활성화 가능하다.
- 또는, API 호출 시 WaitTimeSeconds 파라미터를 통해 개별 요청에서 설정 가능하다.
SQS Extended Client (확장 클라이언트)
- SQS의 최대 메시지 크기 제한(256KB)을 넘어 대용량 메시지를 처리할 수 있도록 Amazon S3와 연계하여 사용한다.
- 작동 원리
- 대용량 메시지를 S3에 저장하고, SQS에는 S3 버킷의 위치 정보(메타데이터)를 저장한다.
- 소비자가 SQS Extended Client 라이브러리를 사용하여 SQS로부터 메타데이터를 수신 후 S3에서 대용량 데이터를 가져와 처리한다.
- 비디오 파일 등 대용량 데이터를 처리할 때 유용하다
필수 API
- CreateQueue(MessageRetentionPeriod): 대기열을 생성하며, 메시지 보관 기간을 설정.
- DeleteQueue: 대기열 및 해당 대기열의 모든 메시지를 삭제.
- PurgeQueue: 대기열 내 모든 메시지를 삭제.
- SendMessage(DelaySeconds): 메시지를 대기열로 전송하며, 개별 메시지 지연 시간을 설정 가능.
- ReceiveMessage: 메시지를 폴링하여 수신.
- DeleteMessage: 개별 메시지를 삭제.
- MaxNumberOfMessages: 한 번에 수신할 최대 메시지 수 (기본값 1, 최대 10).
- ReceiveMessageWaitTimeSeconds: 롱 폴링 대기 시간을 설정.
- ChangeMessageVisibility: 가시성 타임아웃을 연장.
Tip: SendMessage, DeleteMessage, ChangeMessageVisibility API를 묶어 사용하여 API 호출 수를 줄여 비용 절감 효과를 얻을 수 있다.
SQS - FIFO Queue
- FIFO는 선입선출(FIFO: First-In-First-Out) 방식을 보장하는 큐로, 먼저 들어간 메시지가 먼저 처리된다. 이는 순서가 보장되는 구조로, 표준 대기열보다 더욱 엄격하게 메시지 순서를 유지한다.
- 처리량 제한: FIFO 큐는 순서를 보장하기 위해 처리량이 제한된다.
- 배치 처리 없이는 초당 300개의 메시지를 처리하고,
- 배치 처리 시에는 초당 최대 3000개의 메시지를 처리할 수 있다.
- 중복 제거 기능: FIFO 큐는 메시지를 정확히 한 번만 보내도록 중복 제거 기능을 제공하여, 동일한 메시지가 여러 번 처리되지 않도록 한다. 순서를 보장하고 중복을 피해야 할 때는 FIFO 큐를 사용한다.
SQS FIFO - Deduplication (중복 제거)
- 중복 제거는 메시지가 5분 내에 동일하게 재전송될 경우 적용된다. 동일한 메시지가 5분 이내에 다시 전송되면 두 번째 메시지는 거부된다.
- 중복 제거 방법:
- 내용 기반 중복 제거: SQS는 메시지 본문을 SHA-256 알고리즘으로 해시하여 동일한 메시지 내용의 중복을 방지한다. 동일한 메시지 본문이 전송되면 해시 값이 같아지므로 중복 메시지가 제거된다.
- Deduplication ID 사용: 메시지를 전송할 때 고유한 중복 제거 ID를 직접 지정할 수 있다. 동일한 Deduplication ID를 가진 메시지가 두 번 전송될 경우, 두 번째 메시지는 자동으로 거부된다.
SQS FIFO - Message Grouping (메시지 그룹화)
- MessageGroupID:
- SQS FIFO 큐로 메시지를 전송할 때 MessageGroupID를 동일하게 설정하면, 해당 그룹의 메시지는 오직 한 명의 소비자에게만 순서대로 전달된다. 이는 메시지 순서를 보장해야 할 때 유용하다.
- 그룹별 정렬
- 여러 메시지 그룹 ID를 사용하면 그룹별로 병렬 처리가 가능하다. 각 그룹 ID에 속한 메시지는 해당 그룹 내에서 순서대로 정렬되며, 서로 다른 그룹 ID는 별개의 소비자에게 처리된다.
- 동일한 MessageGroupID를 가진 메시지는 내부에서 순서가 정렬된 채로 해당 그룹 내에서 순차적으로 처리된다.
Amazon SNS
- Amazon SNS는 Pub/Sub (게시/구독) 패턴을 사용하여 메시지 하나를 여러 수신자에게 동시에 전달하는 서비스를 제공한다.
- 이를 통해 SNS 주제(Topic)에 메시지를 게시하면, 해당 주제를 구독한 모든 수신자가 메시지를 받을 수 있다.
- 예를 들어 구매 시 SNS를 통해 알림 메시지를 전송하면, 구독한 다양한 서비스(이메일 알림, 배송 서비스 등)와 SQS 대기열에 동일한 메시지를 전달할 수 있다.
- 주제별 최대 1,250만 구독자가 가능하며, 계정당 최대 10만 개의 주제를 생성할 수 있다.
SNS에서 다양한 AWS 서비스들에서 메시지를 수신하기도 한다.
SNS 게시 방법
- SDK를 통한 게시: AWS SDK를 사용해 주제에 메시지를 게시한다.
- 주제와 구독자를 생성하고, 주제에 메시지를 게시한다.
- 구독자는 해당 주제의 모든 메시지를 수신한다.
- Direct Publish (모바일 앱 전용) : 모바일 앱 SDK를 통해 플랫폼 애플리케이션을 생성하고, 엔드포인트에 직접 메시지를 전송한다.
- 지원 플랫폼: Google GCM, Apple APNS 등.
- 다양한 서비스와의 통합
- 이메일, SMS, HTTPS 엔드포인트, SQS 대기열, AWS Lambda 함수, Kinesis Data Firehose를 통해 S3 또는 Redshift로 메시지를 전송 가능하다.
SNS - 보안
- 암호화
- 전송 중: HTTPS API를 사용하여 전송 데이터 암호화.
- 저장 중: KMS(Key Management Service)를 통해 데이터 암호화.
- 클라이언트 측 암호화: 클라이언트가 직접 암호화와 복호화를 수행할 수 있다.
- 액세스 제어
- IAM 정책으로 SNS API 접근을 제어한다.
- SNS 액세스 정책: S3 버킷 정책과 유사하게 설정 가능. 이를 통해 SNS 주제에 대한 교차 계정 접근 및 다른 서비스에서의 메시지 게시 권한 부여가 가능하다.
SNS + SQS: Fan Out 패턴
- SNS의 메시지를 여러 SQS 대기열에 동시에 전송하는 방식이다.
- 장점
- 애플리케이션에 부담을 주지 않고 메시지를 모든 구독자에게 분배할 수 있으며, 데이터 지속성, 지연 처리, 작업 재시도 등 SQS의 특성을 함께 사용할 수 있다.
- 활용
- SNS 주제에 메시지를 게시하고, 여러 SQS 대기열을 구독자로 추가하여 수신자가 늘어나도 SNS가 모든 전송을 처리하므로 애플리케이션 부하를 줄일 수 있다.
- 권한 설정
- SQS 대기열이 SNS로부터 메시지를 수신할 수 있도록 액세스 정책을 명확히 설정해야 한다.
SNS to Amazon S3 through Kinesis Data Firehose
- SNS는 Kinesis Data Firehose(KDF)와 통합되어 있어, SNS에서 KDF로 메시지를 전송하고 KDF가 데이터를 S3 또는 Redshift 등 다양한 저장소에 저장할 수 있다.
- SNS 메시지를 여러 목적지에 안전하게 전송하는 데 사용되며, 데이터 저장 범위를 확장할 수 있다.
SNS - FIFO Topic
- SNS는 메시지를 선입선출 방식으로 전달하는 FIFO 주제를 지원한다.
- SQS FIFO 대기열과의 결합
- 구독자가 SQS FIFO 대기열일 경우, 메시지 그룹 ID와 중복 제거 기능을 활용하여 메시지를 순서대로 안전하게 전송할 수 있다.
- Fan Out + FIFO 전략
- 정렬된 메시지를 다수의 SQS FIFO 구독자에게 보내며, 중복 방지 및 순서를 보장한다.
SNS - Message Filtering (메시지 필터링)
- SNS 주제 구독자에게 전송할 메시지를 필터링하는 JSON 정책을 설정할 수 있다.
- 필터링 조건이 없을 경우 모든 메시지를 수신하며, 필터링을 설정하여 특정 조건을 만족하는 메시지만 수신할 수 있다.
- 구독자마다 다른 필터링 조건을 설정할 수 있어, 구독자의 목적에 맞는 메시지만 전달 가능하다.
- 예를 들어, 상태(state) 필드로 필터링하여 특정 상태의 메시지만 전달하는 방식으로 설정할 수 있다.
반응형
'AWS' 카테고리의 다른 글
AWS Section 21-1. AWS 서버리스: Lambda (0) | 2024.11.04 |
---|---|
AWS Section 19-2. AWS 통합 및 메시징 : SQS, SNS 및 Kinesis (1) | 2024.11.04 |
AWS Section 18. CloudFormation (2) | 2024.11.04 |
AWS Section 16. ECS, ECR 및 Fargate - AWS의 도커 (0) | 2024.10.26 |
AWS Section 15. CloudFront (0) | 2024.10.26 |