Kinesis 和 SQS 有什么区别?

What is the difference between Kinesis and SQS?

我知道网上有很多关于这个问题的资料,但是我还没有找到任何可以对像我这样的菜鸟很清楚地解释这个问题的资料...如果有人能帮助我理解主要区别,我将不胜感激这两个服务和用例与现实生活中的例子之间。谢谢!

这篇文章总结得很好,imo:

https://sookocheff.com/post/aws/comparing-kinesis-and-sqs/

但基本上,如果您不知道自己需要哪一个,请从 SQS 开始,直到它无法满足您的要求。 SQS 的设置和使用非常简单,几乎不需要专业知识就能很好地使用它。

Kinesis 需要更多的时间和专业知识来设置和使用,所以除非你需要它,否则不要打扰 - 尽管它 可以 用于许多相同的作为 SQS 的东西。

一个很大的区别是,如果您有多个消费者从队列中读取数据,那么使用 SQS 时,每个消费者将只能看到他们消费的消息——因为其他消费者将被阻止查看它们;使用 Kinesis,许多消费者可以同时访问流,并且每个消费者都可以看到整个流 - 因此 SQS 非常适合处理大量任务并将部分分配给许多消费者并行处理(除其他外) ),与 Kinesis 一样,多个消费者可以读取和查看整个流,并对流中的所有数据执行某些操作。

链接的文章比我解释得更好。

Amazon SQS 是一个队列。基本流程是:

  • 消息发送到队列。他们在那里最多呆 14 天。
  • 工作程序可以从队列中请求一条消息(或最多 10 条消息)。
  • 当从队列中检索到消息时:
    • 它留在队列中但被标记为不可见
    • 当 worker 处理完消息后,它告诉 SQS 从队列中删除消息
    • 如果工作人员在队列的隐身超时期限内删除消息,则消息重新出现另一个工作人员要处理的队列
    • 如果需要,工作人员可以定期告诉 SQS 保持消息不可见,因为它仍在处理中

因此,一旦消息被处理,它就会被删除。

Amazon Kinesis 中,消息被发送到 stream。流被分成 shards(将它们视为迷你流)。收到消息后,Kinesis 会按顺序 存储消息。然后,工作人员可以从流的开头或流中的特定位置请求消息。例如,如果它已经处理了 5 条消息,它可以请求第 6 条消息。消息在流中保留一段时间(例如 24 小时)。

我喜欢把它想象成胶片 — 胶片中的每一帧都按顺序排列。您可以从头开始播放电影,也可以快进到中间并从那里开始播放。此外,您可以倒回到较早的部分并观看。 Kinesis 流也是如此,多个 消费者 可以同时从流的不同部分读取。

那么,选择哪个呢?

  • 如果消息被使用一次然后被丢弃,队列可能是更好的选择。
  • 如果保留消息顺序很重要and/or消息将被多次使用,那么可能更好.

我尽量根据自己的实际经验给出一个简单的回答:

  1. SQS视为临时存储服务。用例:

    • 管理具有不同队列优先级的数据
    • 存储数据一段有限的时间
    • Lambda DLQ
    • 通过长轮询
    • 降低成本
    • 创建一个FIFO
  2. Kinesis 视为大型实时数据流的收集器。用例:

    • 非常非常大来自不同来源的数据流
    • 仅启用 Firehose 的数据备份(您可以免费获得数据湖)
    • 在集成 Kinesis 的收集阶段立即获取统计数据 Analytics
    • 检查点 以在 DynamoDB 中跟踪记录 processed/failed

注意:考虑到这两种服务都可以很容易地与 Lambda 函数集成,因此有很多用例可以同时使用 SQS 和 Kinesis 来解决。无论如何,我试图列出一些用例,在这些用例中我发现两者中的一个比另一个表现得特别好。希望对您有所帮助:)