AWS Lambda 按顺序处理来自电报机器人的请求并且不扩展

AWS Lambda processes requests from telegram bot sequentially and doesn't scale

我正在使用 C# 构建 Telegram 机器人,并使用 AWS Lambda 进行部署。 Telegram bot 和 Lambda 通过 webhook 连接并且工作正常。我需要安排在几分钟内删除机器人的消息而不阻止机器人。它必须不断接受和处理新请求。

至于现在我看到了使用 Task.Delay 的解决方案。但是,AWS 创建的用于执行 lambda 的实例无法扩展,用户必须等到延迟结束才能处理队列中的以下请求。

来自the official documentation

The first time you invoke your function, AWS Lambda creates an instance of the function and runs its handler method to process the event. When the function returns a response, it stays active and waits to process additional events. If you invoke the function again while the first event is being processed, Lambda initializes another instance, and the function processes the two events concurrently. As more events come in, Lambda routes them to available instances and creates new instances as needed. When the number of requests decreases, Lambda stops unused instances to free up scaling capacity for other functions.

The default regional concurrency quota starts at 1,000 instances.

据我了解,整个 Lambda 就是将并发执行委托给 AWS。如果处理程序需要一些时间来完成请求,则 AWS 会自动创建第二个实例来处理后续请求。不是吗?

我如何实现 concurrency/configure lambda/rewrite 代码来处理多个机器人事件?

我已经看过 AWS Step Functions 和 EventBridges 来解决这个问题,但在深入研究它们之前,澄清一下没有我错过的简单直接的解决方案是有意义的。

P.S。请记住,这是我第一次构建电报机器人和使用 AWS Lambda 函数。问题可能完全出在 AWS 和 Telegram Bot API.

之外

您需要意识到,当您在 Lambda 函数中触发该延迟时,该函数的实例将暂停并且不会处理另一个请求。在 returns 响应之前,Lambda 函数实例不会收到另一个请求。 Lambda 函数实例被有效地阻塞,只是观察它的系统时钟等待 2 分钟的延迟完成。

当您在第一个请求等待延迟时触发另一个请求时,您所做的只是启动另一个实例,然后该实例也会坐下来等待自己的 2 分钟延迟完成。

按照您编写此 Lambda 函数的方式,每个请求都会触发 2 分钟的延迟,并在 returns 响应之前等待该延迟。而且你会为每 2 分钟的延迟付费,因为你仍在占用 AWS 计算资源,尽管他们所做的只是监控系统时钟 2 分钟。

我建议让您的 Lambda 函数快速将消息推送到 SQS delay queue and exit as soon as it has done that. Then have another Lambda function configured with the SQS queue as an event source,它接收 SQS 消息并执行您的删除。