SNS-SQS가 아닌 Amazon Kinesis를 사용해야하는 이유는 무엇입니까?


164

데이터 스트림이 오는 유스 케이스가 있으며 동일한 속도로 사용할 수 없으며 버퍼가 필요합니다. 이것은 SNS-SQS 대기열을 사용하여 해결할 수 있습니다. Kinesis가 동일한 목적을 해결한다는 것을 알게되었으므로 차이점은 무엇입니까? Kinesis를 선호해야하는 이유는 무엇입니까?

답변:


59

표면적으로는 모호하게 유사하지만 사용 사례에 따라 적절한 도구가 결정됩니다. IMO, SQS를 통해 얻을 수 있다면 원하는 것을 수행하면 더 간단하고 저렴하지만 두 가지 도구에 대한 적절한 사용 사례의 예를 제공하는 AWS FAQ의 더 나은 설명이 있습니다. 당신이 결정하는 데 도움이 :

FAQ


7
참고 문서 docs.aws.amazon.com/AWSSimpleQueueService/latest/… SQS FIFO는 SNS와 작동하지 않습니다
파괴 모든 것

80

이 답변은 2015 년 6 월에 대한 답변입니다.

동일한 질문을 염두에두고 잠시 동안 문제를 연구 한 후 메시지 순서가 중요하지 않은 한 SQS (SNS 포함)가 대부분의 사용 사례에 선호되는 것으로 나타났습니다 (SQS는 메시지에 대한 FIFO를 보장하지 않습니다).

Kinesis에는 2 가지 주요 장점이 있습니다.

  1. 여러 응용 프로그램에서 동일한 메시지를 읽을 수 있습니다
  2. 필요한 경우 메시지를 다시 읽을 수 있습니다.

SNS를 SQS에 대한 팬 아웃으로 사용하여 두 가지 장점을 모두 달성 할 수 있습니다. 즉, 메시지 생성자는 SNS에 하나의 메시지 만 보낸 다음 SNS는 각 소비자 응용 프로그램마다 하나씩 여러 SQS에 메시지를 팬 아웃합니다. 이러한 방식으로 샤딩 용량에 대해 생각하지 않고도 원하는만큼의 소비자를 확보 할 수 있습니다.

또한 14 일 동안 메시지를 보유 할 SNS에 가입 된 SQS를 하나 더 추가했습니다. 정상적인 경우이 SQS에서 아무도 읽지 못하지만 데이터를 되 감고 자하는 버그의 경우이 SQS에서 모든 메시지를 쉽게 읽고 SNS로 다시 보낼 수 있습니다. Kinesis는 7 일 보존 기간 만 제공합니다.

결론적으로 SNS + SQS는 훨씬 쉽고 대부분의 기능을 제공합니다. IMO Kinesis를 선택하려면 강력한 사례가 필요합니다.


2
참고 : Kinesis에 최대 7 일 동안 보유 할 수 있습니다.
Didier A.

30
최근 AWS는 메시지의 시간 순서를 처리 할 수있는 SQS FIFO [ docs.aws.amazon.com/AWSSimpleQueueService/latest/… 를 발표했습니다 .
VijeshJain

4
매우 사소한 의견-아마도 메시지를 여러 조각으로 나누지 않고 여러 대상으로 복사하기 때문에 단어 split를 사용 SNS split the message to multiple SQSs하지 않을 것입니다.
Mobigital

2
Kinesis는 샤드 / 초당 판독기 수에 대한 제한으로 인해 팬 아웃 (pub-sub) 사용 사례에 적합하지 않습니다. 원래 문의와 관련이 없지만 n- 리더에 대한 Kinesis 스케일링에 의존하는 사람은이 사실을 고려해야합니다. forums.aws.amazon.com/message.jspa?messageID=760351
codeasone

2
Kinesis의 주문 보증은 스트림이 아닌 샤드 당입니다. 샤드가 둘 이상 있으면 전체 스트림에 대해 주문이 보장되지 않습니다. SQS 대기열의 경우 처리량이 상대적으로 낮 으면 거의 FIFO입니다. 처리량이 높아질 때만 순서를 따르지 않습니다. 이는 FIFO 대기열이 아닌 클래식 SQS 대기열과 관련이 있습니다.
yoroto

54

Kinesis는 여러 소비자 기능을 지원합니다. 즉, 서로 다른 소비자에서 동일한 데이터 레코드를 동시에 처리하거나 24 시간 이내에 다른 시간에 처리 할 수 ​​있습니다. SQS에서 유사한 동작은 여러 대기열에 기록하여 달성 할 수 있으며 소비자는 여러 대기열에서 읽을 수 있습니다. 그러나 여러 대기열에 다시 쓰면 시스템에서 1 초 미만 ({밀리 초)의 대기 시간이 추가됩니다.

둘째, Kinesis는 특정 EC2 인스턴스로 처리 할 수 ​​있고 마이크로 배치 계산 {Counting & Aggregation}을 가능하게하는 파티션 키를 사용하여 여러 샤드로 선택적으로 데이터 레코드를 라우팅하는 라우팅 기능을 제공합니다.

모든 AWS 소프트웨어 작업은 쉽지만 SQS를 사용하는 것이 가장 쉽습니다. Kinesis를 사용하면 스파이크로드를 관리하기 위해 샤드 수를 동적으로 증가시키고 관리에 필요한 비용을 절감하기 위해 샤드 수를 사전에 충분히 프로비저닝해야합니다. 그것은 Kinesis의 고통입니다. SQS에는 그러한 것들이 필요하지 않습니다. SQS는 무한대로 확장 가능합니다.


11
SQS에 대한 설명과 관련하여. SNS를 사용하여 여러 SQS에 동일한 메시지를 보내는 쉬운 방법을 얻을 수 있습니다.
Roee Gavirel 2016 년

8
app-> sns topic ---> sqs1, sqs2, sqs3 ...?
kartik

4
예, 나는이 접근법을 정확하게 언급하고있었습니다.
Roee Gavirel

@RoeeGavirel SNS API에 대한 요청 / 초 제한은 어떻습니까?
Barbaros Alp

@BarbarosAlp-여기서는 주제가 아닌 SMS (모바일 문자 메시지) 제한 만 알고 있습니다. 이 공식 문서입니다 : docs.aws.amazon.com/general/latest/gr/...
Roee Gavirel

43

이러한 기술의 의미는 다른 시나리오를 지원하도록 설계 되었기 때문에 다릅니다.

  • SNS / SQS : 스트림의 항목 이 서로 관련 이 없습니다.
  • 운동성은 : 스트림의 항목이 되어 서로 관련

예를 들어 차이점을 이해합시다.

  1. 각 주문마다 재고를 확보하고 배송 일정을 정해야하는 주문 흐름이 있다고 가정합니다. 완료되면 스트림에서 항목을 안전하게 제거하고 다음 주문 처리를 시작할 수 있습니다. 우리는 완벽하게되어 수행 우리가 다음 일을 시작하기 전에 이전 주문과 함께.
  2. 다시 한 번, 동일한 주문 흐름이 있지만 이제 목표는 대상별로 주문을 그룹화하는 것입니다. 예를 들어, 같은 장소에 10 개의 주문이 있으면 주문을 함께 제공하려고합니다 (배송 최적화). 이제 이야기가 다릅니다. 스트림에서 새 항목을 가져 오면 처리를 완료 할 수 없습니다. 오히려 우리는 목표를 달성하기 위해 더 많은 아이템이 오기를 "기다립니다". 또한 프로세서 프로세스가 중단되면 상태를 "복원"해야합니다 (따라서 순서가 손실되지 않습니다).

한 항목의 처리를 다른 항목의 처리와 분리 할 수없는 경우 모든 경우를 안전하게 처리하려면 Kinesis 의미 체계가 있어야합니다.


SQS FIFO 대기열을 사용하면 메시지가 전송 될 때 순서대로 메시지가 표시됩니다. 이 점에서 SQS가 Kinesis와 유사합니까?
Andy Dufresne

1
@AndyDufresne : 이것은 순서가 중요한 시나리오를 잘 다룹니다. 위의 (1)의 경우 주문을 "주문대로"처리 할 수 ​​있습니다. 따라서 재고가 없으면 나중에 주문이 거부되거나 지연됩니다. FIFO 시맨틱은 핵심 상대성 (그룹화) 문제를 해결하지 않습니다.
Konstantin Triger

35

AWS 설명서 에서 발췌 :

다음과 유사한 요구 사항이있는 사용 사례에는 Amazon Kinesis Streams를 권장합니다.

  • 스트리밍 MapReduce에서와 같이 관련 레코드를 동일한 레코드 프로세서로 라우팅합니다. 예를 들어, 주어진 키에 대한 모든 레코드가 동일한 레코드 프로세서로 라우팅되면 계산 및 집계가 더 간단 해집니다.

  • 기록의 순서. 예를 들어, 로그 문의 순서를 유지하면서 응용 프로그램 호스트에서 처리 / 아카이브 호스트로 로그 데이터를 전송하려고합니다.

  • 여러 애플리케이션이 동일한 스트림을 동시에 소비하는 기능 예를 들어 실시간 대시 보드를 업데이트하는 애플리케이션과 Amazon Redshift에 데이터를 아카이브하는 애플리케이션이 있습니다. 두 애플리케이션 모두 동일한 스트림의 데이터를 동시에 독립적으로 사용하기를 원합니다.

  • 몇 시간 후에 동일한 순서로 레코드를 사용할 수 있습니다. 예를 들어, 청구 응용 프로그램과 청구 응용 프로그램보다 몇 시간 뒤에 실행되는 감사 응용 프로그램이 있습니다. Amazon Kinesis Streams는 최대 7 일 동안 데이터를 저장하므로 청구 애플리케이션 뒤에서 최대 7 일까지 감사 애플리케이션을 실행할 수 있습니다.

다음과 유사한 요구 사항이있는 사용 사례에는 Amazon SQS를 권장합니다.

  • 메시징 의미 (예 : 메시지 수준 ack / 실패) 및 가시성 시간 초과 예를 들어, 작업 항목 큐가 있고 각 항목의 성공적인 완료를 추적하려고합니다. Amazon SQS는 ack / fail을 추적하므로 애플리케이션은 지속적인 체크 포인트 / 커서를 유지 관리 할 필요가 없습니다. Amazon SQS는 구성된 가시성 시간 초과 후 acked 메시지를 삭제하고 실패한 메시지를 재전송합니다.

  • 개별 메시지 지연. 예를 들어, 작업 대기열이 있으며 지연된 개별 작업을 예약해야합니다. Amazon SQS를 사용하면 개별 메시지가 최대 15 분 지연되도록 구성 할 수 있습니다.

  • 읽기시 동시성 / 처리량을 동적으로 증가시킵니다. 예를 들어, 작업 큐가 있고 백 로그가 지워질 때까지 더 많은 독자를 추가하려고합니다. Amazon Kinesis Streams를 사용하면 충분한 수의 샤드로 확장 할 수 있습니다 (단, 충분한 샤드를 미리 프로비저닝해야합니다).

  • Amazon SQS의 투명성 확장 기능을 활용합니다. 예를 들어, 때때로로드가 급증하거나 비즈니스가 자연스럽게 성장함에 따라 요청을 버퍼링하고로드 변경을 수행 할 수 있습니다. 버퍼링 된 각 요청을 독립적으로 처리 할 수 ​​있으므로 Amazon SQS는 프로비저닝 지침없이로드를 처리하도록 투명하게 확장 할 수 있습니다.


34

나에게 가장 큰 장점은 Kinesis가 재생 가능한 대기열이고 SQS는 그렇지 않다는 사실입니다. 따라서 SQS를 사용하여 메시지가 확인되면 해당 큐에서 사라진 동일한 Kinesis 메시지 (또는 다른 시간에 동일한 소비자)의 여러 소비자를 가질 수 있습니다. SQS는 작업자 대기열 때문에 더 좋습니다.


메시지를 어떻게 확인합니까? 삭제를 의미 했습니까?
NeverEndingQueue

예, 본질적으로 이 메시지로 완료되었다고 말하면
Matthew Curry

15

또 다른 것은 Kinesis가 Lambda를 트리거 할 수 있지만 SQS는이를 트리거 할 수 없습니다. 따라서 SQS를 사용하면 SQS 메시지를 처리하기 위해 EC2 인스턴스를 제공하고 (실패한 경우 처리) 예약 된 Lambda (확장 또는 축소되지 않음-분당 1 개만)를 가져야합니다. .

편집 :이 답변은 더 이상 정확하지 않습니다. SQS는 2018 년 6 월 기준으로 Lambda를 직접 트리거 할 수 있습니다

https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html


1
-1 동의하지 않습니다. Kinesis가 람다를 트리거 할 수 있지만 이것은 SQS 람다보다 이점이 없습니다. 후자는 매끄럽게 확장됩니다 (즉, 1 분 이상 걸리면 람다가 회전합니다). 가격은 계산 시간당이므로 상당한 차이가 없습니다. 그리고 동시 람다가 5 개 이상 필요한 경우 몇 초 간격으로 여러 트리거를 추가하면됩니다 (cron 사용). 이것이 SNS / SQS를 통해 Kinesis를 사용하는 이유는 아닙니다.
Steven de Salas

5
동의하지 않는지 확실하지 않습니다;]-1 분의 람다 / 분을 예약하면 해당 간격에 도착한 메시지를 일괄 처리하도록 제한 할 수 있습니다. Kinesis를 사용하면 메시지를 즉시 읽을 수 있습니다. 아니면 내가 잘못 이해 한 것입니까?
Moszi

SQS에 대해 당기는 람다를 호출해야 할 때 몇 가지 클라우드 워치 트리거와 수백 가지 사이에는 큰 차이가 있습니다.
코딩 돼지

14
Lambda는 이제 SQS를 트리거로 지원합니다!
sixty4bit

11

가격 모델은 다르므로 사용 사례에 따라 가격이 저렴할 수 있습니다. 가장 간단한 경우 사용 (SNS 제외) :

  • 메시지 당 SQS 요금 (각 64KB는 하나의 요청으로 계산)
  • 시간당 샤드 당 Kinesis 요금 (1 개의 샤드는 최대 1000 개의 메시지 또는 1MB / 초를 처리 할 수 ​​있음) 및 입력 한 데이터 양 (25KB마다)에 대해 청구됩니다.

현재 가격에 연결하고 프리 티어를 고려하지 않고 최대 메시지 크기로 하루에 1GB의 메시지를 보내면 Kinesis의 비용은 SQS보다 훨씬 더 비쌉니다 (Kinesis의 경우 월 $ 10.82 / SQS의 경우 월 $ 0.20 / 월). . 그러나 하루에 1TB를 전송하면 Kinesis가 다소 저렴합니다 (SQS의 경우 월 $ 158 / 월 대 $ 201).

세부 정보 : SQS는 백만 요청 당 0.40 달러 (각 64KB)를 청구하므로 GB 당 0.00655 USD입니다. 하루에 1GB로 월 $ 0.20 미만입니다. 하루에 1TB에서 한 달에 201 달러가 조금 넘습니다.

Kinesis는 백만 건의 요청 당 $ 0.014 (각각 25KB)를 청구하므로 GB 당 $ 0.00059입니다. 하루에 1GB로 매월 $ 0.02 미만입니다. 하루 1TB에서 월 약 18 달러입니다. 그러나 Kinesis는 샤드 시간당 0.015 USD를 청구합니다. 초당 1MB 당 최소 1 개의 샤드가 필요합니다. 하루에 1GB이면 1 개의 샤드가 충분하므로 하루에 총 $ 10.82의 비용으로 하루에 $ 0.36가 추가됩니다. 하루에 1TB에서 최소 13 개의 샤드가 필요하며, 이로 인해 하루에 4.68 달러가 추가되어 한 달에 총 $ 158의 비용이 발생합니다.


여기서 지수의 크기 증가가 중요한 이유를 완전히 따르지 않습니다. 좀 더 파낼 수 있습니까? 내가 갖고 싶은 통찰력이있는 것 같습니다. 편집 사실, Euguene 페인 골드의 대답을보고, 이에 대한 꽤 단단한 논쟁이있을 보이는 (?).
토마스

죄송합니다. 계산에 실수가있었습니다 (지금 수정 되었으면합니다).
John Velonis

맞습니다.하지만 평균 SQS 메시지 크기가 작은 경우 (1kb 이하) 어떻게해야합니까?
mcmillab

1
@mcmillab SQS는 메시지가 1KB 또는 64KB인지에 관계없이 동일한 요금을 청구합니다 ( Amazon의 SQS 요금 페이지 참조) . 따라서 메시지가 1KB에 불과한 경우 SQS는 동일한 총 데이터 양을 전송하는 경우 위에서 제공 한 수치보다 64 배나 비쌉니다. 그러나 단일 요청에는 최대 10 개의 메시지가 포함될 수 있으므로 메시지를 일괄 처리 할 수있는 경우 일괄 처리량에 따라 6 배에 불과합니다.
John Velonis

1
@JohnVelonis 위의 SQS 가격 계산에는 중요한 부분이 없습니다. SQS 요청이 청구되는 방법을 이해하려면 특별한주의가 필요합니다. 1 요청 = 1 API 동작. 단일 "메시지"를 처리하려면 최소한 3 개의 API 작업 (1 보내기 + 1 읽기 + 1 삭제)을 수행해야합니다. 가시성 변경과 같은 다른 SQS 기능에는 더 많은 API 작업이 필요합니다. 이 예상치 못한 승수는 상당히 불쾌하며 일반적으로 SQS는 큰 데이터 세트의 경우 Kinesis Streams보다 2-10 배 더 비쌉니다 (한 달에 1 억 개의 메시지 처리).
Vlad Poskatcheev

9

Kinesis는 스트리밍 데이터에 대한 일반적인 맵 축소 시나리오에서 맵 부분의 문제를 해결합니다. SQS는 그것을 확신하지 못합니다. 키에서 집계해야하는 스트리밍 데이터가있는 경우, 키네 시스는 해당 키의 모든 데이터가 특정 샤드로 이동하고 샤드를 단일 호스트에서 소비하여 SQS에 비해 키 집계를보다 쉽게 ​​수행 할 수 있도록합니다.


5

아무도 언급하지 않은 것을 하나 더 추가하겠습니다. SQS는 몇 배나 더 비쌉니다.


3
확실합니까? 내 계산에서 Kinesis는 훨씬 비싸지 만 Amazon Simple Price Calculator를 사용하여 재능이 없었습니다.
Didier A.

현재 가격 책정 예제 aws : 267M 메시지가있는 Kinesis는 약 $ 60 인 반면 SQS를 통해 해당 메시지를 넣는 경우 $ 107가됩니다. 분명히 나는 ​​단지 빠른 비교를 해왔고, 이것은 다른 유스 케이스와 크게 다르지만,이 대답은 분명히 어느 정도의 가치가 있어야합니다.
Moszi

1
하루에 2 명의 소비자와 1 억 개의 메시지를 보내려고 팬을 만들고 있다고 가정합니다. SNS 비용은 하루 $ 50입니다. SQS 비용은 하루 $ 40 / 소비자 또는 $ 80 / 일입니다. Kinesis는 PUT의 경우 하루 $ 1.4, 샤드의 경우 $ 0.36입니다. 100 개의 샤드 (100MB / s, 200MB / s)로도 하루에 $ 3.60 / 일에 $ 1.40입니다. 따라서 Kinesis는 하루 $ 4, SNS / SQS는 하루 $ 130입니다.
Carlos Rendon

@Moszi이 계산에 어떻게 도착 했습니까? 한 달에 15,000,000 개의 메시지와 10GB의 데이터 전송 및 데이터 전송이 포함 된 표준 SQS 대기열의 비용은 5.60USD / mo에 불과하며, Kinesis의 256KB 페이로드 (SQS max) 및 최대 15,000,000 PUT 단위 / mo (130 샤드)는 1,638.43입니다. USD / 월
simoncpu

3
이 스레드에서 비용이 왜 차이가 나는지 알고 싶습니다.
토마스

2

키네 시스 사용 사례

  • 로그 및 이벤트 데이터 수집
  • 실시간 분석
  • 모바일 데이터 캡처
  • “사물 인터넷”데이터 피드

SQS 사용 사례

  • 응용 프로그램 통합
  • 마이크로 서비스 디커플링
  • 여러 작업자 노드에 작업 할당
  • 집중적 인 백그라운드 작업에서 실제 사용자 요청 분리
  • 향후 처리를위한 배치 메시지
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.