Answers:
请记住,此答案在2015年6月是正确的
在研究了一段时间之后,想到了同样的问题,我发现对于大多数用例而言,SQS(带有SNS)是首选,除非消息的顺序对您很重要(SQS不保证消息上的FIFO)。
Kinesis有2个主要优点:
通过将SNS用作SQS的扇出,可以实现这两个优点。这意味着消息的生产者仅向SNS发送一条消息,然后SNS将消息扇出到多个SQS,每个消费者应用程序一个。这样,您可以拥有任意数量的消费者,而无需考虑分片容量。
此外,我们添加了一个SQS,该SQS已订阅SNS,该SQS可以将消息保留14天。在正常情况下,没有人从此SQS中读取数据,但是如果发生了使我们想要倒带数据的错误,我们可以轻松地从此SQS中读取所有消息,然后将它们重新发送到SNS。虽然Kinesis仅保留7天。
总之,SNS + SQS更加容易并且提供了大多数功能。IMO,您需要一个非常有力的案例来选择Kinesis。
split
,SNS split the message to multiple SQSs
因为它不会将消息分解成多个部分,而是将其复制到多个目标位置。
Kinesis支持多种使用者功能,这意味着可以在不同使用者上同时或在24小时内的不同时间处理相同的数据记录,可以通过写入多个队列来实现SQS中的相似行为,并且使用者可以从多个队列中读取。但是,再次写入多个队列将增加系统中的亚秒{few milliseconds}延迟。
其次,Kinesis提供了路由功能,可以使用分区键选择性地将数据记录路由到不同的分片,分区键可以由特定的EC2实例处理,并且可以进行微批量计算{计数和聚合}。
使用任何AWS软件都很容易,但是使用SQS是最简单的。使用Kinesis时,需要提前提供足够的碎片,动态增加碎片的数量以管理峰值负载,并减少以节省同样需要管理的成本。这是Kinesis的痛苦,SQS不需要这些东西。SQS是无限扩展的。
这些技术的语义不同,因为它们旨在支持不同的场景:
让我们通过示例来了解差异。
一旦不能将一项处理与另一项处理分开,我们必须具有Kinesis语义才能安全地处理所有情况。
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可以透明扩展以处理负载,而无需您提供任何配置说明。
对我来说,最大的优势是Kinesis是可重播的队列,而SQS却不是。因此,您可以让多个Kinesis相同消息的使用者(或在不同时间的相同使用者)在使用SQS的情况下,一旦确认了一条消息,该消息就会从该队列中消失。因此,SQS更适合于工作队列。
另一件事:Kinesis可以触发Lambda,而SQS不能。因此,使用SQS,您要么必须提供EC2实例来处理SQS消息(如果失败,就对其进行处理),或者您必须具有计划的Lambda(它不会按比例放大或缩小-每分钟只得到一个) 。
编辑:此答案不再正确。自2018年6月起,SQS可以直接触发Lambda
定价模型不同,因此根据您的使用情况,一个或另一个可能会更便宜。使用最简单的情况(不包括SNS):
插入当前价格并且不考虑免费套餐,如果每天以最大邮件大小发送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美元。
我还要再加上其他人没有提到的一件事-SQS的价格要贵几个数量级。
运动学用例
SQS用例