Amazon SNS和Amazon SQS有什么区别?


437

我不知道何时使用SNS和SQS,为什么它们总是结合在一起?


以下流程描述了我从您的评论中所了解的内容。是否正确?发布商- > SNS - > SQL(保持在队列中的消息) - >订户(目前离线)
friendyogi


@friendyogi您的意思是SQS而不是SQL?
Elena

Answers:


623

SNS是一个分布式的发布-订阅系统。消息在发布者发送到SNS时以及发送给订阅者时被推送

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

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

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


3
因此,基本上,要实现类似推送通知消息的操作,建议使用SNS和SQS,以便将带有sns的推送排队,直到用户仅从队列中检索它们为止?是否可以为每个用户创建队列?
尼克·吉南托

2
是的 您可以根据需要拥有任意数量的SNS订阅者。您可以将通知发送到多个队列。
Srikanth

嗨,很抱歉,我看到这个问题很旧,但是我想知道SQS是否知道并存储脱机消息?因为APNS不存储脱机消息,所以仅存储最新消息。是否知道IOS设备何时脱机并立即存储脱机消息?并在设备恢复在线状态后发送出去?
约翰

2
@NickGinanto每个用户的队列可能不是您想要的。您可能希望每个服务都有一个队列,然后再处理用户特定的消息。该图可能会有所帮助:aws.amazon.com/blogs/aws/…–
特伦顿

2
应该注意的是,截至2018年中,SQS可以触发lambda,因此在这种情况下更类似于pubsub。
cyberwombat

236

这是两者的比较:

实体类型

  • SQS:队列(类似于JMS)
  • SNS:主题(Pub / Sub系统)

消息消耗

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

用例

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

坚持不懈

  • SQS:如果没有可用的使用者,则消息将保留一段时间(可配置)
  • SNS:没有持久性。消息到达时出现的任何使用者都会收到消息并删除消息。如果没有可用的使用者,则消息丢失。

消费者类型

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

样例应用

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

1
如果没有使用者可用,则存在重试机制,即使默认值为10次重试。
阿皮·索兰基

尼斯详细的帖子。对于不同的消费者,我们有不同的消息-我们应该做什么-使用SNS并定义不同的主题,或者使用SQS并定义不同的队列?主题/队列可能有一个或多个消费者。
安迪·杜弗雷斯

如果您的要求是您的电话簿/队列应该有多个消费者,那么我认为您是在说同一条消息应该广播给多个消费者...如果我的假设是正确的,那么使用SNS是唯一可用于您
阿拉法特·纳尔汉德

我认为“ SQS:应该假定所有使用者都是相同的,因此以完全相同的方式处理消息”是正确的。我使用过SQS,其中两个不同的AWS服务从SQS队列中提取并以自己的方式处理消息(这些不同服务中的应用程序逻辑不同)。我想念什么吗?
河畔

@nad我需要了解您的用例,但对我来说,两个SQS使用者以不同的方式处理消息是没有意义的。这是SNS的用例
Arafat Nalkhande

31

从AWS文档中:

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

Amazon SQS是一种消息队列服务,分布式应用程序使用该消息队列服务通过轮询模型交换消息,并且可以用于分离发送和接收组件,而无需每个组件同时可用。

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


29

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

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

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

  1. 可能存在不同类型的订户,其中一些需要立即传递消息,而有些则需要消息保留,以便以后通过轮询使用。请参阅此链接

  2. 扇出模式”。这是用于消息的异步处理。将消息发布到SNS时,它可以并行地将其分发到多个SQS队列。当发布图像时,在应用程序中并行加载缩略图时,这非常有用。请参阅此链接

  3. 永久存储。当要处理消息的服务不可靠时。在这种情况下,如果SNS将通知推送到服务,但该服务不可用,则该通知将丢失。因此,我们可以将SQS用作持久性存储,然后再对其进行处理。


29

这个线程的答案有点过时了,所以我决定在上面加两分钱:

您可以将SNS视为传统主题,可以拥有多个订阅者。您可以为一个给定的SNS主题(例如Lambda和SQS)具有不同的订阅者。您还可以使用SNS开箱即用地发送SMS消息甚至电子邮件。在SNS中要考虑的一件事是一次只收到一条消息(通知),因此您不能从批处理中受益。

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

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

即使它们的用例有一些重叠,SQS和SNS都有自己的亮点。

在以下情况下使用SNS

  • 需要多个订户
  • 开箱即用地发送短信/电子邮件很方便

在以下情况下使用SQS

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

4

简而言之,SNS-使用推式机制向订阅者发送消息,而无需拉取。SQS-它是一种消息队列服务,分布式应用程序使用该消息队列服务通过轮询模型交换消息,并且可以用于分离发送和接收组件。

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


SQS无法将消息发送到许多系统,因为它不会使消息散开。是的,许多轮询器可以从中提取消息,但是如果一个消费者删除了该消息,则其他订户将无法再次使用同一消息。如果要实现扇出模式,则SNS优于SQS。同样,如果visibilityTimeout设置了,那么一旦其他系统处理了该消息,其他任何系统都将无法使用该消息。
Thales Minussi

一种常见的模式是使用SNS将消息发布到Amazon SQS队列,以可靠地异步将消息发送到一个或多个系统组件。从参考aws.amazon.com/sns/faqs
Krunal巴罗特

如果这是您的意思(SNS->多个SQS队列),请编辑您的答案,我会很乐意删除我的不赞成票。就像您说的那样,SQS可以散开。
Thales Minussi

1
是的,那就是混乱所在。我已经对其进行了编辑..谢谢:)
Krunal Barot
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.