为什么我应该使用Amazon Kinesis而不是SNS-SQS?


164

我有一个用例,其中会有数据流到来,而我不能以相同的速度使用它,因此需要一个缓冲区。可以使用SNS-SQS队列解决。我知道Kinesis解决了相同的目的,所以有什么区别?为什么我应该(或不应该)喜欢Kinesis?

Answers:



80

请记住,此答案在2015年6月是正确的

在研究了一段时间之后,想到了同样的问题,我发现对于大多数用例而言,SQS(带有SNS)是首选,除非消息的顺序对您很重要(SQS不保证消息上的FIFO)。

Kinesis有2个主要优点:

  1. 您可以从多个应用程序中读取相同的消息
  2. 您可以根据需要重新阅读邮件。

通过将SNS用作SQS的扇出,可以实现这两个优点。这意味着消息的生产者仅向SNS发送一条消息,然后SNS将消息扇出到多个SQS,每个消费者应用程序一个。这样,您可以拥有任意数量的消费者,而无需考虑分片容量。

此外,我们添加了一个SQS,该SQS已订阅SNS,该SQS可以将消息保留14天。在正常情况下,没有人从此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
超级次要注释-可能不会使用该词splitSNS split the message to multiple SQSs因为它不会将消息分解成多个部分,而是将其复制到多个目标位置。
Mobigital '17

2
由于每个分片/秒的读取器数量受到限制,Kinesis不适合用于扇出(发布-订阅)用例。尽管与原始查询无关,但任何依赖Kinesis扩展至n读者的人都应考虑这一事实。forums.aws.amazon.com/message.jspa?messageID=760351
codeasone

2
Kinesis的订单保证是按分片而不是按流的。一旦您拥有多个分片,整个流将无法保证有序。对于SQS队列,当吞吐量相对较低时,几乎是FIFO。仅当您的吞吐量提高时,才遵循该顺序。这是关于经典SQS队列,而不是FIFO队列。
yoroto

54

Kinesis支持多种使用者功能,这意味着可以在不同使用者上同时或在24小时内的不同时间处理相同的数据记录,可以通过写入多个队列来实现SQS中的相似行为,并且使用者可以从多个队列中读取。但是,再次写入多个队列将增加系统中的亚秒{few milliseconds}延迟。

其次,Kinesis提供了路由功能,可以使用分区键选择性地将数据记录路由到不同的分片,分区键可以由特定的EC2实例处理,并且可以进行微批量计算{计数和聚合}。

使用任何AWS软件都很容易,但是使用SQS是最简单的。使用Kinesis时,需要提前提供足够的碎片,动态增加碎片的数量以管理峰值负载,并减少以节省同样需要管理的成本。这是Kinesis的痛苦,SQS不需要这些东西。SQS是无限扩展的。


11
关于您对SQS的解释。通过在多个SQS之前发送SNS,可以实现将相同消息发送到多个SQS的简便方法。
Roee Gavirel

8
应用程序-> sns主题---> sqs1,sks2,sks3 ...?
kartik 2015年

4
是的,我指的是这种方法。
Roee Gavirel 2015年

@RoeeGavirel sns api的请求/秒限制如何?
巴巴罗斯阿尔卑斯山

@BarbarosAlp-我只知道SMS(移动文本消息)限制,这在这里是不合主题的。这是官方文档:docs.aws.amazon.com/general/latest/gr/...
Roee Gavirel

43

这些技术的语义不同,因为它们旨在支持不同的场景:

  • SNS / SQS:流的项目彼此不相关
  • Kinesis:流的项目相互关联

让我们通过示例来了解差异。

  1. 假设我们有一个订单流,对于每个订单,我们需要保留一些库存并安排交货。完成此操作后,我们可以安全地从流中删除该项目并开始处理下一个订单。在开始下一个订单之前,我们已经完全完成了上一个订单。
  2. 同样,我们有相同的订单流,但是现在我们的目标是按目的地对订单进行分组。例如,一旦有10个订单到达同一地点,我们便希望将它们一起交付(交付优化)。现在的故事不同了:当我们从流中获取新项目时,我们无法完成对其的处理;而是我们“等待”更多的物品来达到我们的目标。此外,如果处理器进程崩溃,我们必须“恢复”状态(因此不会丢失任何顺序)。

一旦不能将一项处理与另一项处理分开,我们必须具有Kinesis语义才能安全地处理所有情况。


使用SQS FIFO队列,我们​​将在发送消息时对其进行排序。在这方面,这是否使SQS类似于Kinesis?
安迪·杜弗雷斯

1
@AndyDufresne:这很好地涵盖了顺序很重要的场景。在上述情况(1)中,您可能要“按顺序”处理订单。因此,如果您缺货,以后的订单将被拒绝或延迟。FIFO语义不能解决核心相对性(分组)问题。
康斯坦丁·特里杰

35

AWS文档摘录:

对于具有类似以下要求的用例,我们建议使用Amazon Kinesis Streams:

  • 将相关记录路由到同一记录处理器(如在流式MapReduce中一样)。例如,当给定键的所有记录都路由到同一记录处理器时,计数和汇总会更简单。

  • 记录的顺序。例如,您要在保持日志语句顺序的同时将日志数据从应用程序主机传输到处理/归档主机。

  • 多个应用程序可以同时使用同一流的能力。例如,您有一个应用程序可以更新实时仪表板,而另一个应用程序可以将数据归档到Amazon Redshift。您希望两个应用程序同时并独立地使用同一流中的数据。

  • 几个小时后可以按相同顺序使用记录。例如,您有一个计费应用程序和一个审核应用程序,运行时间比计费应用程序晚了几个小时。由于Amazon Kinesis Streams最多可以存储7天的数据,因此您可以在计费应用程序之后最多7天运行审核应用程序。

对于具有类似于以下要求的用例,我们建议使用Amazon SQS:

  • 消息语义(例如消息级别的确认/失败)和可见性超时。例如,您有一个工作项队列,并希望独立跟踪每个项的成功完成情况。Amazon SQS跟踪确认/失败,因此应用程序不必维护持久性检查点/光标。在配置的可见性超时后,Amazon SQS将删除确认的消息并重新发送失败的消息。

  • 单个消息延迟。例如,您有一个作业队列,需要延迟安排单个作业。借助Amazon SQS,您可以将单个消息配置为最多延迟15分钟。

  • 在读取时动态增加并发/吞吐量。例如,您有一个工作队列,想要添加更多阅读器,直到清除积压。借助Amazon Kinesis Streams,您可以扩展到足够数量的分片(但是请注意,您需要提前配置足够的分片)。

  • 利用Amazon SQS的透明扩展能力。例如,您缓冲请求,并且由于偶尔的负载高峰或业务的自然增长而导致负载变化。由于每个缓冲的请求都可以独立处理,因此Amazon SQS可以透明扩展以处理负载,而无需您提供任何配置说明。


34

对我来说,最大的优势是Kinesis是可重播的队列,而SQS却不是。因此,您可以让多个Kinesis相同消息的使用者(或在不同时间的相同使用者)在使用SQS的情况下,一旦确认了一条消息,该消息就会从该队列中消失。因此,SQS更适合于工作队列。


您如何确认消息?你是说删除吗?
NeverEndingQueue '18

是的,本质上。说您已经完成了此消息
马修·柯里

15

另一件事:Kinesis可以触发Lambda,而SQS不能。因此,使用SQS,您要么必须提供EC2实例来处理SQS消息(如果失败,就对其进行处理),或者您必须具有计划的Lambda(它不会按比例放大或缩小-每分钟只得到一个) 。

编辑:此答案不再正确。自2018年6月起,SQS可以直接触发Lambda

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


1
-1不同意。尽管Kinesis可以触发lambda,但与带SQS的lambda相比并没有优势。后者将无缝缩放(即,如果花费一分钟以上的时间,第二个lambda将被旋转)。价格是按计算时间计算的,因此两者之间也没有明显的差异。而且,如果您需要5个以上的并行lambda,则只需添加间隔数秒(使用cron)安排的多个触发器即可。这不是在SNS / SQS上使用Kinesis的原因。
史蒂文·德·萨拉斯

5
我不确定是否同意不同意见;]-您可以安排每分钟一lambda,这将限制您批量处理到达该时间间隔的邮件。Kinesis将使您可以立即阅读消息。还是我误解了?
Moszi

需要调用针对SQS的拉动lambda时,几个cloudwatch触发器与数百个cloudwatch触发器之间存在巨大差异。
编码猪

14
Lambda现在支持SQS作为触发器!
sixty4bit

11

定价模型不同,因此根据您的使用情况,一个或另一个可能会更便宜。使用最简单的情况(不包括SNS):

  • 每封邮件的SQS费用(每64 KB计为一个请求)。
  • Kinesis每个分片每小时收费(1个分片最多可以处理1000条消息或1 MB /秒),还取决于您放入的数据量(每25 KB)。

插入当前价格并且不考虑免费套餐,如果每天以最大邮件大小发送1 GB邮件,Kinesis的费用将比SQS高得多(Kinesis每月10.82美元,SQS每月0.20美元) 。但是,如果您每天发送1 TB,则Kinesis会更便宜($ 158 /月,SQS为$ 201 /月)。

详细信息:SQS收取每百万个请求0.40 USD(每个64 KB),因此每GB 0.00655 USD。每天1 GB,每月将近$ 0.20;如果每天使用1 TB,则每月的费用略高于$ 201。

Kinesis每百万个请求收取0.014美元(每个25 KB),因此每GB收取$ 0.00059。如果每天使用1 GB,则每月不到$ 0.02;每天1 TB,则每月约18美元。但是,Kinesis还会对每个碎片小时收取$ 0.015的费用。每1 MB每秒至少需要1个分片。如果每天使用1 GB,则1个分片就足够了,因此每天还要增加0.36美元,每月总成本为10.82美元。如果每天使用1 TB,则至少需要13个分片,这又需要每天增加4.68美元,每月的总成本为158美元。


我并不完全理解为什么这里的指数级增长很重要。你能再挖一点吗?听起来您有一些我想拥有的见识。编辑实际上,看看Euguene Feingold的答案,对此似乎有相当扎实的辩论(?)。
托马斯

抱歉,我在计算中犯了一些错误(希望现在已解决)。
John Velonis

是的,但是如果您的平均SQS消息大小很小(例如1kb或更小),该怎么办?
mcmillab

1
无论您的消息是1 KB还是64 KB,@ mcmillab SQS都将收取相同费用-请参阅Amazon的SQS定价页面。因此,如果您的邮件只有1 KB,那么如果您发送的数据总量相同,SQS的费用将是我上面给出的数字的64倍。但是,一个请求最多可以包含10条消息,因此,如果您能够将消息一起批处理,则其数量可能仅为其的6倍(具体取决于批处理的完成程度)。
John Velonis

1
@JohnVelonis上面的SQS定价计算缺少关键要素。需要格外小心,以了解SQS请求如何收费。1个请求= 1个API操作。为了处理单个“消息”,必须执行至少3个API动作:1个发送+ 1个读取+ 1个删除。其他SQS功能(例如更改可见性)将导致更多API操作。对于大型数据集(例如每月处理1亿条消息),此意外的乘数非常讨厌,通常导致SQS的价格比Kinesis Streams高2-10倍。
Vlad Poskatcheev

9

Kinesis解决了流数据的典型地图缩减场景中的地图部分问题。尽管SQS不能确保这一点。如果您有需要在密钥上聚合的流数据,kinesis确保该密钥的所有数据都到达特定的分片,并且该分片可以在单个主机上使用,这使得与SQS相比,在密钥上的聚合更加容易


5

我还要再加上其他人没有提到的一件事-SQS的价格要贵几个数量级。


3
你确定吗?根据我的计算,Kinesis的价格要贵得多,但是我从来没有使用过Amazon Simple Price Calculator的才华。
Didier A.

看一下aws上的当前定价示例:带有2.67亿条消息的Kinesis约为60美元,而通过SQS放置该消息量将产生107美元。显然,我只是做了一个非常快速的比较,这在不同的用例中有很大的不同,但是这个答案肯定应该值得一提。
Moszi

1
假设您正在做一个扇形说每天有2个消费者和1亿条消息。SNS费用为每天$ 50。SQS成本为每天40美元/消费者或总计80美元/天。Kinesis对于PUT是$ 1.4 /天,$ 0.36 /碎片。即使有100个分片(100 MB / s进,200 MB / s出),每天也只需$ 3.60 + $ 1.40 /天。因此,Kinesis的价格为每天4美元,而SNS / SQS的价格为每天130美元。
卡洛斯·雷登

@Moszi您是如何得出此计算的?一个标准的SQS队列每月有15,000,000条消息,数据输入和输出10GB,每月仅需5.60USD / mo,而256KB有效负载(SQS max)和1500万个PUT单位/ mo(130个分片)在Kinesis中的成本为1,638.43。美元/月。
simoncpu

3
我想知道为什么此线程中的成本如此悬殊。
托马斯

2

运动学用例

  • 日志和事件数据收集
  • 实时分析
  • 移动数据采集
  • “物联网”数据馈送

SQS用例

  • 应用整合
  • 解耦微服务
  • 将任务分配给多个工作节点
  • 使实时用户请求与密集的后台工作脱钩
  • 批处理消息以备将来处理
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.