【问题标题】:Managing SQS Queue Manually vs Lambda Trigger手动管理 SQS 队列与 Lambda 触发器
【发布时间】:2021-03-26 04:38:37
【问题描述】:

我不确定这在 ServerFault 或软件工程上是否会更好,如果合适,我愿意移动这篇文章。

我们最近开始移动我们的一些数据处理管道以使用队列来管理单个数据位,而之前我们使用定时 lambdas 来提取自上次更改以来的所有数据。

在进行此更改时,我们注意到队列并没有像我们首先预期的那样工作 - 我们认为 lambda 只会将项目从队列中拉出,因为 lambdas 可用。相反,aws 管理的 lambda 触发器似乎抓取了一大块消息(最多十个)并将其扔给 lambda 服务。如果 lambda 不可用,则消息会受到限制,然后在退避时间后重播,直到我们配置的重播“错误”限制(五)。之后,它被扔进我们的死信队列。

我们每天都会看到一些消息由于节流而最终进入死信队列。然后我们将它们放回主队​​列(我们每隔几个小时就有一个流程)。然而,我们并不能 100% 确定节流是事情被推迟的原因,因为没有任何迹象表明消息被转移的原因——我们只是假设了这么多,因为我们没有收到这些消息的任何错误日志。我们联系了 Amazon 支持人员询问此问题,他们确实能够确认消息实际上是由于节流而“出错”。

我们进一步询问了他们对此的建议 - 这一定是一个常见问题,对吧?他们首先建议提高我们的重播限制,这似乎是一个明显的不可行。任何失败都会发生重放,所以当我们的 lambdas 出现错误请求时,它们只会受到重击。还被问及是否有任何方法可以区分错误,因为我们不关心限制,如果需要,我们很乐意让这些重试十几次 - 但没有。他们的另一个建议是从我们的 lambdas 中自己管理队列。在我们的 lambdas 中构建我们自己的代码来提取消息,然后在处理后删除它们。不过,这似乎真的有悖常理——为什么每个 AWS 消费者都要构建自己的基础设施?

所以我想我的问题是,其他人正在这样做吗?你在使用内置的 lambda 触发器吗?您是否正在创建自己的代码来管理队列消耗?您是否看到这些限制,或者我们可以做些什么不同的事情?管理此问题的其他服务有什么不同吗?

【问题讨论】:

  • lambda 扩展到多少并发执行?
  • “不过,这似乎真的违反直觉 - 为什么每个 AWS 消费者都构建自己的基础设施?”这不是基础设施,它只是几行代码。在 EC2 服务器或其他任何地方使用来自 SQS 的消息所编写的代码相同。
  • @jellycsc 我们目前允许 7 个并发执行。但是,增加这不是答案。我不是在寻找防止我们受到限制的答案,而是使用他们的触发器与自己做的方法是否正确。
  • @MarkB 从某种意义上说,我们必须给我们的 lambdas 接收/删除权限,让它们知道 SQS 的存在,然后在它们中构建循环来完成消息管理工作,相反,我们目前正在摆脱 SQS 上的 lambda 触发器。我们可以这样做,这对我来说不是预期的方法,这就是为什么我试图找出其他人是否也是如此。
  • @shortstuffsushi 您是否尝试将批量大小设置为 1?

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


【解决方案1】:

最佳做法是处理代码中的错误并手动删除成功的消息。这使您可以处理有害消息,而无需再次重新处理好消息。节流阀不应该经常出现在 DLQ 中。 re:Invent 2020 的这段视频很好地解释了它的工作原理。 Scalable serverless event-driven architectures with SNS, SQS & Lambda。从大约 20 分钟开始进入 SQS 错误处理。

【讨论】:

  • 嗯,这很有趣,并且更接近于回答我的问题,或者至少可以帮助我更好地表达它。我们目前没有删除我们自己的成功消息;我们可以做出改变。但是,我们仍然会遇到有毒消息和限制混合在一起的问题。我们希望中毒消息直接发送到 DLQ,限制以继续永远重试。我们在 lambda 中获取自己的有害消息,将它们从主队列中删除并自己放入 DLQ 中是否合适?这样我们就可以完全开放重新驱动政策..
  • 您确定油门会进入 DLQ 吗?如果是,您可能会考虑增加消息超时。如果有限制,则在达到消息超时小于 lambda 超时的点之前,它不会算作重试。因此,您还可以尝试将 lambda 超时减少到更符合您的处理预期的数字。
  • 是的,我们确定我们的限制是 DLQ - 我在问题中提到了很多,我们实际上并不确定,所以我们通过亚马逊支持进行了验证。更改超时是我们可能会考虑的事情,这可能会减少我们的 DLQ 命中。不过,我们说的是每次运行的秒数,所以也许将超时设置为 10 秒或其他什么合适?
  • 如果您将消息超时设置为 20 秒,并将 lambda 超时设置为 5,那么如果存在限制,则消息可以在返回队列之前重试几次。那是您的重新驱动政策生效的时候(我相信您说的是 5)。这意味着它在被发送到 DLQ 之前可能会被限制 10-20 次。在一条消息上发生这种情况的几率非常低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 2021-01-22
  • 2019-03-26
  • 2020-07-28
相关资源
最近更新 更多