何时应该使用SNS而不是SQS,为什么它们总是配套使用?
何时应该使用SNS而不是SQS,为什么它们总是配套使用?
SNS是一个分布式的发布-订阅系统。当发布者向SNS发送消息时,消息会被推送给订阅者。
SQS是分布式的排队系统。消息不会被推送给接收者。接收者必须从SQS中轮询或拉取消息。 消息不能同时被多个接收者接收。任何一个接收者都可以接收、处理并删除消息。其他接收者不会在后续时间内接收相同的消息。 与SNS立即将消息推送给订阅者不同,轮询在SQS中本质上引入了一些延迟。 SNS支持多种终端点,例如电子邮件、短信、HTTP终端和SQS。如果您希望未知数量和类型的订阅者接收消息,则需要使用SNS。
您不必总是将SNS和SQS捆绑在一起。除了SQS以外,SNS可以将消息发送到电子邮件、短信或HTTP终端点。将SNS与SQS配对有其优点。您可能不希望外部服务连接到您的主机(防火墙可能会阻止所有来自外部的连接)。
由于大量消息的存在,您的终端点可能会崩溃。电子邮件和短信可能不是快速处理消息的选择。通过将SNS与SQS捆绑在一起,您可以按自己的节奏接收消息。它允许客户端脱机、容错于网络和主机故障。您还可以实现保证交付。如果您配置SNS将消息发送到HTTP终端点、电子邮件或短信,则多次发送消息失败可能会导致消息丢失。
SQS主要用于解耦应用程序或集成应用程序。消息可以在SQS中存储短暂时间(最长14天)。SNS将多个副本的消息分发给多个订阅者。例如,假设您想将应用程序生成的数据复制到多个存储系统中。您可以使用SNS,并将此数据发送给多个订阅者,每个订阅者将其接收到的消息复制到不同的存储系统(S3、主机上的硬盘、数据库等)。
以下是两者之间的比较:
实体类型
消息消费
用例
持久性
消费者类型
示例应用程序
AWS SNS是一个发布-订阅网络,在其中订阅者可以订阅话题,并在发布者发布到该话题时接收消息。
AWS SQS是一个队列服务,它将消息存储在队列中。SQS不能传递任何消息,需要外部服务(lambda、EC2等)来轮询SQS并从SQS获取消息。
SNS和SQS可以一起使用,有多种原因。
根据AWS文档:
Amazon SNS允许应用程序通过“推送”机制向多个订阅者发送时间关键消息,从而消除了定期检查或“轮询”更新的必要性。
Amazon SQS是一种消息队列服务,由分布式应用程序通过轮询模型交换消息,并可用于解耦发送和接收组件-而无需每个组件同时可用。
简单来说,
SNS - 使用推送机制向订阅者发送消息,无需拉取。
SQS - 这是一个消息队列服务,由分布式应用程序使用轮询模型交换消息,可用于解耦发送和接收组件。
常见的模式是使用SNS将消息发布到Amazon SQS队列,以可靠地异步发送消息给一个或多个系统组件。
参考来源:Amazon SNS FAQs。
visibilityTimeout
,则在其他系统处理该消息时,其他系统将无法消耗该消息。 - Thales Minussi