我不知道何时使用SNS和SQS,为什么它们总是结合在一起?
我不知道何时使用SNS和SQS,为什么它们总是结合在一起?
Answers:
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,主机上的硬盘,数据库等)。
这是两者的比较:
实体类型
消息消耗
用例
坚持不懈
消费者类型
样例应用
从AWS文档中:
Amazon SNS允许应用程序通过“推送”机制向多个订户发送时间紧迫的消息,而无需定期检查或“轮询”更新。
Amazon SQS是一种消息队列服务,分布式应用程序使用该消息队列服务通过轮询模型交换消息,并且可以用于分离发送和接收组件,而无需每个组件同时可用。
http://docs.aws.amazon.com/sns/latest/dg/SendMessageToSQS.html
AWS SNS是发布者订阅者网络,订阅者可以在其中订阅主题,并在发布者发布该主题时接收消息。
AWS SQS是一种队列服务,它将消息存储在队列中。如果需要外部服务(lambda,EC2等)来轮询SQS并从SQS中获取消息,则SQS无法传递任何消息。
出于多种原因,可以将SNS和SQS一起使用。
这个线程的答案有点过时了,所以我决定在上面加两分钱:
您可以将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:
简而言之,SNS-使用推式机制向订阅者发送消息,而无需拉取。SQS-它是一种消息队列服务,分布式应用程序使用该消息队列服务通过轮询模型交换消息,并且可以用于分离发送和接收组件。
一种常见的模式是使用SNS将消息发布到Amazon SQS队列,以可靠地异步将消息发送到一个或多个系统组件。来自https://aws.amazon.com/sns/faqs/的参考
visibilityTimeout
设置了,那么一旦其他系统处理了该消息,其他任何系统都将无法使用该消息。