Amazon SNS和Amazon SQS有什么区别?

问题描述 投票:294回答:6

我不明白何时使用SNS与SQS,为什么它们总是耦合在一起?

amazon-web-services amazon-sqs amazon-sns
6个回答
470
投票

SNS是分布式发布 - 订阅系统。当发布者将消息发送给SNS时,消息将被推送给订阅者。

SQS是分布式排队系统。消息不会被推送到接收者。接收方必须从SQS轮询或提取消息。多个接收器不能同时接收消息。任何一个接收器都可以接收消息,处理并删除它。其他接收器稍后不会收到相同的消息。与SNS不同,轮询固有地在SQS中引入了一些消息传递延迟,其中消息被立即推送给订户。 SNS支持多个端点,如电子邮件,短信,http端点和SQS。如果您想要未知的订户数量和类型来接收消息,则需要SNS。

您不必总是将SNS和SQS结合在一起。除了SQS,您可以让SNS向电子邮件,短信或http端点发送消息。将SNS与SQS耦合具有优势。您可能不希望外部服务与主机建立连接(防火墙可能会阻止从外部到主机的所有传入连接)。你的终点可能会因为大量的消息而死亡。电子邮件和短信可能不是您快速处理邮件的选择。通过将SNS与SQS耦合,您可以按照自己的节奏接收消息。它允许客户端脱机,容忍网络和主机故障。您也可以保证交货。如果将SNS配置为将消息发送到http端点或电子邮件或SMS,则若干发送消息失败可能会导致消息被丢弃。

SQS主要用于解耦应用程序或集成应用程序。消息可以在SQS中存储很短的时间(最多14天)。 SNS向几个订户分发了几个消息副本。例如,假设您要将应用程序生成的数据复制到多个存储系统。您可以使用SNS并将此数据发送给多个订阅者,每个订阅者将收到的消息复制到不同的存储系统(s3,主机上的硬盘,数据库等)。


132
投票

以下是两者的比较:

实体类型

  • SQS:队列(类似于JMS)
  • SNS:主题(发布/订阅系统)

消息消费

  • SQS:拉动机制 - 消费者从SQS轮询和拉取消息
  • SNS:推送机制 - SNS将消息推送给消费者

用例

  • SQS:解耦2个应用程序并允许并行异步处理
  • SNS:扇出 - 以多种方式处理相同的消息

坚持

  • SQS:如果没有可用的消费者,则消息会持续一段(可配置的)持续时间
  • SNS:没有坚持。在消息到达时存在的任何消费者获得消息并且消息被删除。如果没有可用的消费者,则消息将丢失。

消费者类型

  • SQS:所有消费者都应该是相同的,因此以完全相同的方式处理消息
  • SNS:消费者可能以不同的方式处理消息

样品申请

  • SQS:作业框架:作业被提交给SQS,而另一端的消费者可以异步处理作业。如果作业频率增加,则可以简单地增加消费者的数量以实现更好的吞吐量。
  • SNS:图像处理。如果有人将图像上传到S3,则为该图像添加水印,创建缩略图并发送感谢信。在这种情况下,S3可以向SNS主题发布通知,其中3个消费者正在收听它。第一个水印图像,第二个创建缩略图,第三个发送谢谢你的电子邮件。他们都收到相同的消息(图像URL)并进行并行处理。

31
投票

来自aws doc:

Amazon SNS允许应用程序通过“推送”机制向多个订户发送时间关键消息,从而无需定期检查或“轮询”更新。

Amazon SQS是分布式应用程序用于通过轮询模型交换消息的消息队列服务,可用于解除发送和接收组件 - 无需每个组件同时可用。

http://docs.aws.amazon.com/sns/latest/dg/SendMessageToSQS.html


22
投票

AWS SNS是一个发布者订阅者网络,订阅者可以订阅主题,并在发布者发布到该主题时接收消息。

AWS SQS是一种队列服务,用于将消息存储在队列中。 SQS无法传递任何消息,其中需要外部服务(lambda,EC2等)来轮询SQS并从SQS获取消息。

SNS和SQS可以出于多种原因一起使用。

  1. 可能存在不同类型的订户,其中一些订户需要立即传递消息,其中一些订户将要求消息持续存在,以供稍后通过轮询使用。看到这个link
  2. “扇出模式”。这用于消息的异步处理。当消息发布到SNS时,它可以将其并行分发到多个SQS队列。在发布图像时,并行地在应用程序中加载缩略图时,这可能很棒。看到这个link
  3. 持久存储。当要处理消息的服务不可靠时。在这种情况下,如果SNS将通知推送到服务,并且该服务不可用,则通知将丢失。因此,我们可以使用SQS作为持久存储,然后再处理它。

12
投票

这个帖子的答案有点过时了,所以我决定加上我的两分钱:

您可以将SNS视为一个传统主题,您可以拥有多个订阅者。例如,您可以为一个给定的SNS主题拥有异构订阅者,包括Lambda和SQS。您还可以使用SNS发送短信甚至是开箱即用的电子邮件。在SNS中要考虑的一件事是一次只收到一条消息(通知),因此您无法利用批处理。

另一方面,SQS只是一个队列,你可以在其中存储消息并订阅一个消费者(是的,你可以让N个消费者加入一个SQS队列,但考虑到所有消费者的意愿,它会很快变得混乱而且难以管理需要至少读取一次消息,因此在这个用例中SNS结合SQS会更好,SNS会将通知推送到N个SQS队列,每个队列只有一个用户来处理这些消息。截至2018年6月28日,AWS Supports Lambda Triggers for SQS,意味着您不再需要轮询消息。此外,您可以在源SQS队列上配置DLQ,以便在发生故障时发送消息。如果成功,将自动删除邮件(这是另一项重大改进),因此您不必担心在您忘记手动删除邮件时再次阅读已处理的邮件。我建议看看Lambda Retry Behaviour以更好地了解它是如何工作的。使用SQS的一大好处是它可以实现批处理。每个批次最多可包含10条消息,因此如果在SQS队列中一次有100条消息到达,那么10个Lambda函数将会启动(考虑到Lambda的默认自动缩放行为)并且它们将处理这100条消息(保留在记住,这是一条快乐的道路,在实践中,一些Lambda函数可以在批量读取少于10条消息,但你得到了这个想法)。但是,如果您向SNS发布了这100条相同的消息,那么100个Lambda函数将会启动,不必要地增加成本并耗尽您的Lambda并发。但是,如果您仍在运行传统服务器(如EC2实例),则仍需要轮询消息并手动管理它们。

您还有FIFO SQS队列,它保证了消息的传递顺序。这不是Lambda支持的触发器,因此在选择此类型的Queue时,请记住仍然需要轮询以及必须手动删除消息。

尽管他们的使用案例存在一些重叠,但SQS和SNS都有自己的聚光灯。

使用SNS如果:

  • 多个订户是必需的
  • 开箱即用发送短信/电子邮件非常方便

在以下情况下使用SQS:

  • 只需要一个用户
  • 批处理很重要

3
投票

简单来说,SNS - 使用推送机制向订户发送消息,不需要拉取。 SQS - 它是分布式应用程序用于通过轮询模型交换消息的消息队列服务,可用于解耦发送和接收组件。

常见的模式是使用SNS将消息发布到Amazon SQS队列,以便可靠地将消息发送到一个或多个系统组件。参考https://aws.amazon.com/sns/faqs/

© www.soinside.com 2019 - 2024. All rights reserved.