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

我有一个使用案例,将有数据stream到达,我不能以相同的速度消耗它,并需要一个缓冲区。 这可以使用SNS-SQS队列来解决。 我开始知道Kinesis解决了同样的目的,那有什么区别呢? 为什么我应该喜欢(或不应该喜欢)Kinesis?

从表面上看,它们有些相似,但是你的用例将决定哪个工具是合适的。 国际海事组织(IMO),如果你可以顺利通过SQS,那么你应该 – 如果它能做到你想要的,它将会变得更简单和更便宜,但是这里给出了AWS常见问题的更好的解释,它给出了适用于这两种工具的例子帮你决定:

常见问题解答

在了解了这个问题之后,考虑到同样的问题,我发现SQS(与SNS)在大多数情况下都是首选,除非消息的顺序对您很重要(SQS不保证消息的FIFO)。

Kinesis有两个主要的优点(1)你可以从几个应用程序中读取同样的信息,(2)你可以在需要时重新读取信息。

通过使用SNS作为SQS的粉丝,这两个优势都可以实现。 这意味着消息的制作者只向SNS发送一条消息,然后SNS将消息扇出到多个SQS,每个消费者应用程序一个。 通过这种方式,您可以尽可能多的消费者,而不用考虑分片容量。

而且,我们又添加了一个订阅了SNS的SQS,这个SQS将持有14天的消息。 在正常情况下,没有人从这个SQS中读取数据,但是如果有一个错误让我们想要倒回数据,我们可以很容易地读取这个SQS的所有消息,并重新发送到SNS。 而Kinesis只提供7天的保留期。

总而言之,SNS + SQS非常简单并且提供了大部分function。 国际海事组织你需要一个非常强大的情况下selectKinesis。

Kinesis支持多个消费者function,这意味着同一个数据logging可以在不同的消费者的同一时间或不同的时间在24小时内被处理,SQS中的类似行为可以通过写入多个队列来实现,消费者可以从多个队列中读取。 但是,再次写入多个队列会在系统中增加子秒(几毫秒)延迟。

其次,Kinesis提供路由function,使用分区键将数据loggingselect性地路由到不同的分片,分区键可以由特定EC2实例处理,并且可以启用微量批计算{计数和聚合}。

在任何AWS软件上工作都很简单,但SQS是最简单的。 使用Kinesis,需要提前提供足够的碎片,dynamic增加碎片的数量来pipe理峰值负载,并减less以节省pipe理所需的成本。 这是Kinesis的痛苦,SQS不需要这样的事情。 SQS是无限可扩展的。

对我来说最大的好处是Kinesis是一个可重放队列,而SQS则不是。 所以你可以有多个使用Kinesis消息的消费者(或者在不同的时间使用相同的消费者),在SQS的情况下,一旦消息被消除,它就从这个队列中消失。 因此,SQS对工作人员队列更好。

另一件事:Kinesis可以触发一个Lambda,而SQS不能。 因此,对于SQS,您必须提供一个EC2实例来处理SQS消息(如果失败,请处理),或者您必须具有计划的Lambda(不扩展或缩小 – 每分钟只有一个) 。

摘自AWS文档 :

我们推荐Amazon Kinesis Streams用于需求类似于以下内容的用例:

  • 将相关logging路由到同一个logging处理器(如在streamMapReduce中)。 例如,当给定密钥的所有logging路由到相同的logging处理器时,计数和聚合更简单。

  • logging的sorting。 例如,您希望将日志数据从应用程序主机传输到处理/存档主机,同时保持日志语句的顺序。

  • 能够让多个应用程序同时使用同一个stream。 例如,您有一个应用程序更新实时仪表板,另一个应用程序将数据存档到Amazon Redshift。 您希望这两个应用程序同时并独立地使用来自同一个stream的数据。

  • 能够在几小时后以相同的顺序使用logging。 例如,您有一个计费应用程序和一个在计费应用程序后面运行了几个小时的审计应用程序。 由于Amazon Kinesis Streams存储数据的时间长达7天,因此您可以在计费应用程序后7天运行审计应用程序。

我们推荐Amazon SQS用于需求类似于以下内容的用例:

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

  • 个人消息延迟。 例如,您有一个工作队列,需要延迟安排个别工作。 使用Amazon SQS,您可以configuration单个邮件,延迟时间最长为15分钟。

  • 在读取时dynamic增加并发/吞吐量。 例如,你有一个工作队列,并希望添加更多的读者,直到积压被清除。 使用Amazon Kinesis Streams,您可以扩展到足够数量的碎片(但是请注意,您需要提前提供足够的碎片)。

  • 利用Amazon SQS的透明扩展能力。 例如,由于偶尔的负载峰值或业务的自然增长,您可以缓冲请求和负载变化。 由于每个缓冲的请求都可以独立处理,因此Amazon SQS可以透明地进行扩展以处理负载,无需您提供任何configuration指示。

Kinesis在stream式数据的典型映射 – 缩减场景中解决了映射部分的问题。 虽然SQS不确定这一点。 如果您的stream数据需要在某个密钥上进行聚合,则kinesis可以确保该密钥的所有数据都转到特定的分片,并且分片可以在单个主机上使用,从而使密钥聚合更容易,而SQS

我会再补充一件没有人提到的东西–SQS的价格要高出几个数量级。

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

  • 每条消息SQS收费(每个64 KB计为一个请求)。
  • 每个小时的Kinesis费用(1个碎片可以处理多达1000条消息或1 MB /秒)以及您input的数据量(每25 KB)。

插入目前的价格,并没有考虑到免费层,如果你每天发送1 GB的消息,最大的消息大小,Kinesis将花费比SQS多得多(Kinesis每月10.82美元,SQS每月0.20美元) 。 但是如果你每天发1TB,Kinesis便宜一些(SQS为$ 158 /月,而$ 201 /月)。

详情:SQS收取每百万次请求0.40美元(每个64KB),因此每GB为0.00655美元。 每天1 GB,每月仅为0.20美元; 每天1 TB,每个月超过$ 201。

Kinesis每百万次请求收费0.014美元(每个25KB),因此每GB为0.00059美元。 每天1 GB,每月不到0.02美元; 每天1TB,大约是每月18美元。 然而,Kinesis每小时收费0.015美元。 每个1 MB每秒至less需要1个碎片。 每天1GB,1个碎片就足够了,所以每天还要增加0.36美元,总成本为每月10.82美元。 每天1TB,您至less需要13个碎片,每天增加4.68美元,总成本为每月158美元。

这些技术的语义是不同的,因为它们被devise来支持不同的场景:

  • SQS:stream的项目相关
  • Kinesis:stream的项目相互关联的

让我们通过例子来了解这个差异。

  1. 假设我们有一个订单stream,每个订单我们需要保留一些库存并安排交货。 一旦完成,我们可以安全地从stream中移除项目,并开始处理下一个订单。 在开始下一个命令之前,我们完全按照先前的顺序完成
  2. 再次,我们有相同的订单stream,但现在我们的目标是按目的地分组订单。 一旦我们有10个订单到同一个地方,我们希望将它们交付(交货优化)。 现在的情况是不一样的:当我们从stream中得到一个新的项目时,我们不能完成处理; 相反,我们“等待”更多的项目来实现我们的目标。 而且,如果处理器进程崩溃,我们必须“恢复”状态(所以没有命令会丢失)。

一旦一个项目的处理不能与另一个项目的处理分离,我们必须有Kinesis语义来安全地处理所有的情况。

Interesting Posts