【问题标题】:Invoke AWS Lambda SNS event only after SQS subscription on same topic has been processed仅在处理了同一主题的 SQS 订阅后才调用 AWS Lambda SNS 事件
【发布时间】:2016-11-03 05:10:19
【问题描述】:

我想实现一个 Amazon SNS 主题,它首先将消息传递到作为该主题订阅者的 SQS 队列,然后执行一个也是同一主题订阅者的 AWS Lambda 函数。然后 Lambda 函数可以从 SQS 队列中读取消息并并行处理其中的几个(数百个)。

我的问题是,是否有任何方法可以保证发送到 SNS 主题的消息首先被传递到 SQS 队列,然后才传递到 Lambda 函数?

这样做的目的是扩展到大量消息,而不必为每条消息单独执行 Lambda 函数。

【问题讨论】:

  • 没有得到你。 Lambda 函数是主题的订阅者,并且还轮询具有相同消息集的队列?另请记住,您不能转到 sqs 然后询问特定消息。那么你打算如何设计你的 lambda 函数来从队列中获取相同的消息呢?
  • 在我的用例中,Lambda 函数将接收哪些消息并不重要。它将处理 SQS 队列中缓冲的任何消息。例如。如果在调用第一个 Lambda 函数调用之前已经排队了 100 条消息,那么它将处理所有这些消息。由于队列已经为空,其他 99 个函数调用将立即退出。我担心的是,如果我只发送一条 SNS 消息,则 Lambda 调用会在消息到达 SQS 之前发生,并且队列对于函数来说看起来是空的。
  • 如果您只想在发送通知时运行 lambda 函数,那么为什么不将 lambda 函数订阅到 sns 本身。为什么要担心 sqs?
  • 在没有 SQS 的情况下,我有两个担忧: - 如果 Lambda 函数失败,一些消息将未处理,所以我希望它们留在 SQS - 如果解决方案无法扩展,则一个 Lambda 函数调用一次只能处理一条消息(并行调用限制为 100 个)。
  • 是的,您对Lambda 失败的假设是正确的。处理存储在SQS 中订阅SNS Topic 的消息要容易得多。

标签: amazon-web-services amazon-sqs amazon-sns aws-lambda


【解决方案1】:

为此,如果从云监视警报中使用触发 lambda 可能会更好、更高效。将云监视警报设置为 SQS 上的缓冲区限制,这可能会触发 lambda 以启动和处理完整队列。

【讨论】:

    【解决方案2】:

    您正在寻找的内容目前无法通过 SNS Topic 实现。如果您将您的Lambda 订阅到SNS Topic,则每次SNS Topic 收到一条消息时,特定的Lambda 都会并行执行。

    解决方案可能是拥有两个SNS Topics 并将消息发布到第一个并让您的SQS 订阅它。成功向第一个主题提交消息后,您可以向第二个SNS Topic 发送消息以执行您的Lambda 以处理存储到SQS 的第一个SNS Topic 的消息。

    另一种可能的解决方案可能是上述,您可以只向第二个主题发送一些定期消息以运行订阅的Lambda。这将允许您扩展您的 Lambda SQS Workers

    【讨论】:

    • 您认为通过第二个 SNS 主题路由消息是否可以保证并行 SQS 消息已被传递?或者这仍然是运气的问题。
    • 在将所有消息发布到第一个SNS Topic 之后,您应该向第二个SNS Topic 发送消息。发送到第一个SNS Topic 的消息会立即在SQS 中可用。一旦第二个主题收到您的消息,它会立即启动Lambda,它将处理此队列。
    • 啊,是的,谢谢,现在我明白了。首先,我认为您只是将消息从 SNS 路由到第二个 SNS 主题。我最初最终得到的解决方案,其实是先将所有消息直接推送到 SQS,然后通过发送到 SNS 的单个消息触发 Lambda 函数。
    • 是的,这是非常相似的解决方案。
    • @Kennu - 抱歉挖掘了这么老的线程。这个解决方案对您有什么效果?我正在考虑做同样的事情。实际上,我正在尝试决定是否有必要,或者我是否应该直接从 SNS 转到 Lambda,跳过 sqs
    【解决方案3】:

    将 SQS 队列和 Lambda 函数订阅到 SNS 主题是让 Lambda 函数以低延迟处理 SNS 消息的好方法。我刚刚测试了这个过程。每次尝试都会在插入 SQS 消息后调用 lambda 函数。我不希望这种情况总是如此,但它可以尽可能地解决延迟问题。无法保证,您需要 CloudWatch 计划事件来接收任何错过的消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-25
      • 2021-03-25
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多