使用 AWS Lambda 的同步任务"Queues"



我有一个部署的&正在运行的Django应用程序,它使用celener工作程序来执行后台任务。我们正在考虑改用AWS Lambda来运行我们的后台任务的可能性,以帮助节省成本,但不确定我们将如何构建我们的项目。

当前结构

该应用程序目前由一个Elastic Beanstalk应用程序组成,该应用程序带有一个运行web服务器和Celery Beat的EC2实例(用于一些定期调度的任务(,以及一个单独的执行任务的EC2 Celery工作实例。在应用程序的当前配置中,我使用Celery和Amazon的SQS来触发工作实例执行的函数。

我们应用程序的关键是,我们可能会同时收到几个要排队的项目。多个队列项目可以同时执行,但每个用户只能同时执行一个项目。我们通过为每个用户使用命名队列并将Celery配置为一次只运行任何给定队列中的一个任务来实现这一点。

问题/所需结构

我们希望过渡到使用AWS lambda函数来执行我们的后台任务,因为我们在应用程序使用方面有很大的差距(我们通常将任务分成大组(,这可以节省成本。我们最大的问题是,是否有办法";分类";lambda调用,这样我们就可以同时执行多个函数,但每个类别只能执行一个函数。Lambda似乎有管理并发性的功能,但只针对每个函数,而没有与我们目前使用的多个队列等效的功能。

感觉您可能想要利用AWS SQS fifo队列。

您可以将MessageGroupId设置为用户的Id,这样您就可以并行处理用户的消息。

根据文件:

接收消息您不能请求接收具有特定消息组ID的消息。

您将无法按用户ID进行筛选。

当从具有多个消息组ID的FIFO队列接收消息时,Amazon SQS首先尝试返回尽可能多的具有相同消息组ID。这允许其他使用者处理具有不同消息组ID的消息。当您接收到具有消息组标识的消息时,除非您删除该消息或该消息变为可见,否则不会再返回具有相同消息组标识符的消息。

这解释了SQS Fifo正在通过messageGroupID处理消息。这意味着,除非您不处理和删除队列中具有相同messageGroupId的消息(这是在lambda成功时由AWS lambda触发器自动完成的(,否则它不会处理其他消息。

另一方面,它可以处理具有不同messageGroupId的其他消息。

属于同一消息组的消息总是按照相对于消息组的严格顺序逐一处理(但是,属于不同消息组的邮件可能会被无序处理(。

我建议您尝试在中使用Messages进行小型负载测试,以模拟您期望的行为,看看它是否满足您的需求!

您可以做一个简单的SQS FIFO,它可以触发允许最大并发性的lambda(标准帐户为1000(。然后,您可以使用脚本推送消息,其中包含不同的messageGroupId和随机排序。看看它是如何处理的。

这不会花那么多钱,因为它是无服务器的,将来会为您节省很多时间和问题。(可能还有钱(。

最新更新