SNS 到 Lambda 与 SNS 到 SQS 到 Lambda
SNS to Lambda vs SNS to SQS to Lambda
如果有人可以帮助解释,我正在尝试了解我的工作流程中是否需要 SQS。在我的应用程序中,当采取行动时,它会将信息提交到 SNS 主题,该主题调用 Lambda 进行一些处理。这很好用。
当我在网上做研究时,似乎人们也在这个堆栈中使用 SQS,SNS 会将信息放在 SQS 上,然后 SQS 会调用 Lambda。
我想我想了解的是在这方面对 SQS 的需求。这增加了什么价值?换句话说,直接从 SNS 调用我的 Lambda 会损失什么?
SQS 不调用 Lambda。 SQS 不能调用任何东西。将 Lambda 与 SQS 一起使用的人 运行 Lambda 在事件计时器上,例如每分钟一次,并且每次该函数运行时它都会轮询 SQS 以查看是否有要处理的消息。
如果您不需要将事物排队并防止 运行 同时使用太多 Lambda 函数,那么您不需要像 SQS 这样的队列系统。
在 SNS 和 Lambda 之间使用 SQS 的主要优势是再处理。
假设 Lambda 由于某种原因(例如超时或内存占用不足)无法处理某些事件,您可以增加超时(最多 5 分钟)或内存(最多 1.5GB)并重新启动轮询,您可以重新处理较早的事件。
这在 SNS 到 Lambda 的情况下是不可能的,其中如果 Lambda 失败,事件就会丢失。即使您配置了 DLQ,您仍然需要为单独读取和处理消息做出规定
因此,如果您的活动很重要并且您不想错过它们,请选择 SNS - SQS - Lambda
拥有 SQS 的另一个优势是节省了 Lambda 调用的成本(感谢@codesinthedark 提出这个问题)。您可以获得更好的扩展性和更低的成本,因为它允许您批量处理消息。因此,可以为一批 10 条消息执行一个 lambda,而在直接 SNS 的情况下,每条消息都会触发 lambda 调用。
您现在可以使用 SQS 作为事件源
AWS Lambda Adds Amazon Simple Queue Service to Supported Event Sources
这里添加到@Arafat Nalkhande 的回答是 SQS 的 lambda 的一些好处
在SQS中我们可以放一个delay,这样消息会在一段时间后得到处理,这在数据需要时间才能可用的场景中可能很有用。
SQS可以作为应急存储,假设下游服务不可用,消息可以在sqs中保留15天。
我认为 2019 年发生了一些变化,SQS 可以通过@alexs 提到的事件源映射触发 lambda。
相关博客 post:https://aws.amazon.com/about-aws/whats-new/2018/04/aws-lambda-now-supports-amazon-sqs-as-event-source/
总而言之,您可以将 SQS 用于 lambda 并具有以下优势:
- 在失败的情况下重新处理事件并配置在您放弃之前重试消息的次数(接收计数)
- 更长的保留期
- 通常在 运行 作业较长且 lambda 从作业队列中逐个轮询的场景中选择。
您可以选择使用 SNS:
- 如果您需要将单个消息扇出到多个目的地,假设 X 消息应由 Y 和 Z 应用程序处理。我觉得这是最大的优势,如果你想要可靠性,可以把SNS和SQS结合起来。
- 您不关心丢失的消息。请记住,使用 SNS 时仍然有重试策略(线性、几何、指数等)
- 通常用于您可以 ingest/process 更快地发送消息的情况。有时这也是一个问题;想象一个场景,您的企业收到的每封电子邮件都有一个 SNS 通知,而您没有足够的 lambda 并发来处理所有这些通知。您可以通过按照自己的节奏使用 SQS 来解决这个问题。
在这两种情况下,都可能有重复的消息(在重试的情况下)并且不能保证顺序。如果您需要一个,请考虑 Kinesis 流。
如果有人可以帮助解释,我正在尝试了解我的工作流程中是否需要 SQS。在我的应用程序中,当采取行动时,它会将信息提交到 SNS 主题,该主题调用 Lambda 进行一些处理。这很好用。
当我在网上做研究时,似乎人们也在这个堆栈中使用 SQS,SNS 会将信息放在 SQS 上,然后 SQS 会调用 Lambda。
我想我想了解的是在这方面对 SQS 的需求。这增加了什么价值?换句话说,直接从 SNS 调用我的 Lambda 会损失什么?
SQS 不调用 Lambda。 SQS 不能调用任何东西。将 Lambda 与 SQS 一起使用的人 运行 Lambda 在事件计时器上,例如每分钟一次,并且每次该函数运行时它都会轮询 SQS 以查看是否有要处理的消息。
如果您不需要将事物排队并防止 运行 同时使用太多 Lambda 函数,那么您不需要像 SQS 这样的队列系统。
在 SNS 和 Lambda 之间使用 SQS 的主要优势是再处理。 假设 Lambda 由于某种原因(例如超时或内存占用不足)无法处理某些事件,您可以增加超时(最多 5 分钟)或内存(最多 1.5GB)并重新启动轮询,您可以重新处理较早的事件。
这在 SNS 到 Lambda 的情况下是不可能的,其中如果 Lambda 失败,事件就会丢失。即使您配置了 DLQ,您仍然需要为单独读取和处理消息做出规定
因此,如果您的活动很重要并且您不想错过它们,请选择 SNS - SQS - Lambda
拥有 SQS 的另一个优势是节省了 Lambda 调用的成本(感谢@codesinthedark 提出这个问题)。您可以获得更好的扩展性和更低的成本,因为它允许您批量处理消息。因此,可以为一批 10 条消息执行一个 lambda,而在直接 SNS 的情况下,每条消息都会触发 lambda 调用。
您现在可以使用 SQS 作为事件源
AWS Lambda Adds Amazon Simple Queue Service to Supported Event Sources
这里添加到@Arafat Nalkhande 的回答是 SQS 的 lambda 的一些好处
在SQS中我们可以放一个delay,这样消息会在一段时间后得到处理,这在数据需要时间才能可用的场景中可能很有用。
SQS可以作为应急存储,假设下游服务不可用,消息可以在sqs中保留15天。
我认为 2019 年发生了一些变化,SQS 可以通过@alexs 提到的事件源映射触发 lambda。 相关博客 post:https://aws.amazon.com/about-aws/whats-new/2018/04/aws-lambda-now-supports-amazon-sqs-as-event-source/
总而言之,您可以将 SQS 用于 lambda 并具有以下优势:
- 在失败的情况下重新处理事件并配置在您放弃之前重试消息的次数(接收计数)
- 更长的保留期
- 通常在 运行 作业较长且 lambda 从作业队列中逐个轮询的场景中选择。
您可以选择使用 SNS:
- 如果您需要将单个消息扇出到多个目的地,假设 X 消息应由 Y 和 Z 应用程序处理。我觉得这是最大的优势,如果你想要可靠性,可以把SNS和SQS结合起来。
- 您不关心丢失的消息。请记住,使用 SNS 时仍然有重试策略(线性、几何、指数等)
- 通常用于您可以 ingest/process 更快地发送消息的情况。有时这也是一个问题;想象一个场景,您的企业收到的每封电子邮件都有一个 SNS 通知,而您没有足够的 lambda 并发来处理所有这些通知。您可以通过按照自己的节奏使用 SQS 来解决这个问题。
在这两种情况下,都可能有重复的消息(在重试的情况下)并且不能保证顺序。如果您需要一个,请考虑 Kinesis 流。