【问题标题】:Return from lambda trigger without deleting the message from queue从 lambda 触发器返回而不从队列中删除消息
【发布时间】:2020-07-13 20:56:49
【问题描述】:

在我的 lambda 函数中,我将 receiptHandle 作为正文数据发送到服务器。然后,此服务器必须完成工作并告诉 SQS 删除此消息。
问题是aws docs 说:

...
如果您的函数成功处理批处理,Lambda 将从队列中删除消息。如果您的函数受到限制、返回错误或没有响应,则该消息将再次可见。

这意味着如果我将 SQS 消息删除委托给另一个服务并结束 Lambda 执行,则 SQS 消息将被此 Lambda 出口删除,我不希望发生这种情况。消息的可见性超时也应保持不变。
有没有办法做到这一点?

【问题讨论】:

  • 我也会对这种可能性感兴趣。消息将在 EC2 中处理,但我需要一个队列触发器来实际实例化服务器。

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


【解决方案1】:

有没有办法做到这一点?

没有。内置的 SQS -> Lambda 集成以这种方式工作(即,一旦 Lambda 函数成功返回,它就会从 SQS 中删除一条消息,如您链接和引用的文档中所述),它不是可配置。

[...] 我不想发生这种情况。

为什么要将 SQS 消息删除委托给另一个服务?您真正想达到什么目的?

【讨论】:

  • 我想将它委托给另一个服务,因为它是另一个服务将完成 SQS 消息任务的主要工作。 lambda 触发器充当此服务和其他一些服务的协调器。但是删除 SQS 消息的唯一标准应该是这个其他服务完成了它必须做的事情(在我的例子中,等待玩家进入游戏)。
  • 在这种情况下,您究竟为什么要使用 Lambda 而不是直接从其他服务消费消息? Lambda 不是一个好的“协调者”,而是一个好的“工人”。对于“编排器”(可以等待事件,支持带有分支、循环、自定义重试等的逻辑),您可能需要检查 AWS Step Functions。或者,如果您需要的非常简单(即“等待玩家”),您可以让您的“其他进程”从 SQS 本身检索消息,然后它可以完全控制它们的生命周期。
  • 我不能直接从该服务消费 SQS 消息,因为该服务可能不是唯一的消费者。实际上,该服务是一个小型服务,用于为特定的游戏比赛协调游戏室。每场比赛都在一个容器中运行这个专用的小型服务器。因此,lambda 函数是必要的,因为它在主体中接收容器端点,并将请求发布到正确的容器。
  • 这听起来像是一个更广泛的设计问题。对于您描述的问题类型,典型的模式是每个“消费者类型”或“作业类型”有一个 SQS 队列,然后每个特定消费者从其特定队列中消费。如果消息的生产者知道最终目的地,它可以直接在那里写;如果不是,它可以写入“条目”SQS 队列(就像您拥有的那样),然后 Lambda 函数会将其路由到适当的队列——这意味着它将从“条目”接收,写入正确的“特定” ,然后立即从“条目”中删除。
  • 这样,(1) lambda 是微不足道的(即,它只路由消息),并且 (2) 每个服务都有能力使用它认为合适的消息。最后,如果整体逻辑变得比仅仅将消息从一个入口点路由到特定队列更复杂(即,假设消息 A 发送到工作人员 A,然后产生应该发送到工作人员 B 的消息 B,但有时 A 产生 C应该发送给worker C,最终C可能会发送给B或发送回A等),那么只有多个队列+相应的worker+路由lambda可能会变得太复杂,而Step Functions可能会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 2019-05-17
  • 2020-07-10
  • 2012-12-31
  • 2014-06-07
  • 2015-12-20
  • 2018-09-28
相关资源
最近更新 更多