Decoupling

  • application을 decouple하면 각 서비스가 서로 비동기(event-based)로 통신할 때 사용할 수 있다.
  • 동기적으로 처리할 때보다 spikes of traffic에 강하다.
  • Services
    • sqs: message queue
    • sns: pub/sub
    • kinesis: real-time streaming

 

SQS

Simple Queue Service

  • 기본적으로 4일, 최대 14일까지 메세지를 저장한다.
  • 각 메세지는 256KB 이하여야 한다.

SQS Standard

  • 무한한 throughput을 갖고, 무한한 개수의 메세지를 처리할 수 있다.
  • can have duplicate message (at least once delivery)
    • 정해진 시간 내에 처리되지 않은 메세지는 다시 큐에 올려지므로 중복될 수 있다.
  • can have out of order(best effort ordering)
    • 순서대로 처리하려고 설계되어 있지만, 그렇지 않을 수도 있다.

SQS FIFO

  • 생성할 때, 인스턴스 이름의 마지막에 .fifo 붙여야한다.
  • 유한한 throughput, 초당 300개 혹은 초당 3000개(batching) 을 갖는다.
  • exactly once delivery
    • 처리되지 않은 메세지는 큐에 맨 뒤로 다시 진입
  • 메세지의 order(순서)를 보장받는다.
  • content-based duplication
    • content id를 통해 중복을 제거하는 설정이 standard와 다르게 추가된다.

Visibility timeout

  • 메세지를 consumer가 가져가면 지정한 시간동안 다른 consumer가 메세지를 가져갈 수 없는 시간.
  • 정해진 시간이 지나도 consumer로부터 delete API가 호출되지 않으면 해당 메세지는 다시 visible.
  • ChangeMessageVisibility API를 통해 timeout을 늘릴 수 있다.

Long polling

  • Consumer가 queue에 처리할 메세지를 요청했는데 어떤 메세지도 없을 때 waiting 하는 방식.
  • latency를 낮추고 API 호출을 적게 하기 위해서 사용된다.

with ASG

  • Cloudwatch Metric, Alarm을 사용해서 queue length에 따라 auto scale trigger할 수 있다.
  • front-end ASG와 back-end ASG 사이에 buffer로써 AWS SQS를 사용할 수 있다. 트랜잭션 작업을 한번에 처리하는 것보다 decoupling을 통해 front와 back을 분리하고 중간에 buffer를 둠으로써 프로세스가 깨지지 않도록 한다.

 

SNS

Simple Notification Service

  • pub/sub: 대상은 Lambda, Kinesis Data Firehorse, SQS 등
  • topic publish: 토픽을 대상으로 발행
  • directly(mobile): 구글, 애플 API로 이벤트(알림) 발행
  • SQS와 마찬가지로 Standard와 FIFO 타입이 있다.
  • filtering: 메세지를 발행할 때, 각 대상에 따라 JSON filter policy를 적용할 수 있다.

Fan out pattern

  • 같은 메세지를 수신할 SQS, Lambda가 SNS에 구독하는 구조
  • 사용 사례로 s3 object관련 event는 한 번만 처리될 수 있는데, 이를 수신할 대상이 하나가 아니라면 그 대상들과 s3 사이에 sns를 두고 구독하게 함으로써 해결할 수 있다.

 

Kinesis

Collect, process, analyze streaming data in real-time

  • ingest real-time data, application logs, metrics ..

Kinesis Data Streams

Capture, process, store data streams

  • 여러 개의 샤드로 구성되어 있다.
  • 하루에서 365일까지 보존할 수 있다.
  • can replay or reprocess data
  • cannot delete data once it is inserted
  • Provisioned mode, on-demand mode
  • Hash를 이용해서 같은 PK는 같은 샤드로 보내진다. 그리고 샤드에 축적되는 데이터는 순서가 보장된다.

Kinesis Data Streams Producer, Consumer

  • 앞단에 Producer, 뒷단에 Consumer
    • Producer로는 App, SDK, KPL Consumer에는 Firehose, Analytics, Lambda, App
  • 데이터 스트림의 독립적인 데이터를 Record라고 한다.
    • Partition Key와 Data Blob을 가진다. PK는 샤드를 결정한다.
  • Producer는 한 샤드당 1 MB/sec 혹은 1000 msg/sec 전송 속도를 갖는다.
  • Consumer는 한 샤드당 2 MB/sec 혹은 (enhanced의 경우) 2 MB/ sec per shard per consumer를 갖는다.

Kinesis Data Firehose

Load data streams into AWS data stores

  • Application, SDK, Kinesis Data streams, CloudWatch 등이 Producer가 될 수 있다.
  • Producer로부터 받은 데이터를 Lambda를 통해 data transformation 할 수 있다.
  • 그 이후에 Batch write를 하게 되는데 코드가 필요없다. Data Firehose가 알아서 해준다.
    • 대상은 S3, Redshift(S3의 데이터를 복사해서), OpenSearch가 있다.
  • near realtime: batch가 채워지지 않으면 60초의 딜레이를 갖는다. 혹은 1MB까지 채워져야한다.
  • Automatic scaling 하고 data를 저장하지 않기 때문에 replay 할 수 없다.