Python 3.x 安排任务在将来某个时间运行(体系结构)

Python 3.x 安排任务在将来某个时间运行(体系结构),python-3.x,amazon-web-services,flask,architecture,Python 3.x,Amazon Web Services,Flask,Architecture,因此,我们有一个Python flask应用程序正在运行,它利用芹菜和AWS SQS满足异步任务的需要 我们最近面临的一个棘手问题是创建一个在x天内运行的任务,例如在3小时内运行。我们对这样的东西有很多需求 现在,我们在数据库中创建带有时间戳的事件,这些时间戳存储应该触发它们的时间。然后,我们利用芹菜节拍每秒运行一个计划任务,检查是否有任何事件要处理(基于触发器时间戳),然后处理它们。然而,这是每秒钟查询数据库,查找我们认为可以改进的事件 我们研究了如何使用芹菜()中的eta参数,该参数允许您安

因此,我们有一个Python flask应用程序正在运行,它利用芹菜和AWS SQS满足异步任务的需要

我们最近面临的一个棘手问题是创建一个在x天内运行的任务,例如在3小时内运行。我们对这样的东西有很多需求

现在,我们在数据库中创建带有时间戳的事件,这些时间戳存储应该触发它们的时间。然后,我们利用芹菜节拍每秒运行一个计划任务,检查是否有任何事件要处理(基于触发器时间戳),然后处理它们。然而,这是每秒钟查询数据库,查找我们认为可以改进的事件

我们研究了如何使用芹菜()中的eta参数,该参数允许您安排任务在x时间内运行。然而,拥有大型ETA似乎是一种不好的做法,而且AWS SQS的可见性超时约为两个小时,因此任何超过此时间的操作都会导致冲突

我现在正抓狂呢。在一个有这样的作品,相当体面的东西已经被分离出来的SNS,SQS等,以确保缩放公差。但是,每秒查询数据库以处理事件并不是一件好事。当然,谷歌/AWS提供了一种更简单的方式或服务,可以在未来某个时间(x小时、分钟等)安排一些活动(酒吧/酒吧)


有什么想法吗?

您可以使用apply\u async启动作业,然后使用倒计时,如:

xxx.apply_async(…,倒计时=TTT)


根据队列的繁忙程度,无法保证作业在该时间准确启动,但在您的用例中,这似乎不是问题。

您查看过Amazon Simple Notification Service吗?听起来它能满足你的需要。。。

从该页:

Amazon SNS是一种完全管理的发布/订阅消息服务,可以轻松地解耦和扩展微服务、分布式系统和无服务器应用程序。使用SNS,您可以使用主题将消息发布者与订阅者分离,将消息一次扇出到多个收件人,并消除应用程序中的轮询。SNS支持多种订阅类型,允许您将消息直接推送到Amazon简单队列服务(SQS)队列、AWS Lambda函数和HTTP端点。AWS服务,如Amazon EC2、Amazon S3和Amazon CloudWatch,可以将消息发布到您的SNS主题,以触发事件驱动的计算和工作流。SNS与SQS合作,为构建容错且易于扩展的云应用程序提供强大的消息传递解决方案


Amazon的调度解决方案是使用CloudWatch触发事件。这些事件可以是在SQS/SNS端点中放置消息、触发ECS任务、运行Lambda等。许多人使用执行Lambda的技巧,然后执行其他操作来触发系统中的某些内容。例如,您可以触发Lambda,将作业推送到Redis上,供芹菜工人拾取

创建Cloudwatch规则时,可以指定“速率”(即每5分钟一次),也可以指定CRON语法中的任意时间


因此,我对您的用例的建议是删除在您的工作需要开始时(或一分钟前,取决于您对时间的敏感程度)运行的cloudwatch规则。然后,该规则将与您的应用程序交互以启动您的工作。您只需在CloudWatch触发时支付资源费用

您是否特别了解了AWS Step函数?您可能可以组合两个lambda函数,第一个函数返回时间戳或等待的秒数,最后一个函数在等待返回后将消息添加到SQS。

我们已经使用SNS,但它不具备在将来某个时候将事件发布到主题的功能。关键的要求是,我们需要在将来的某个时间点运行一个任务,无论是几小时还是几天。我明白了,您是否能够将SNS与常规的linux调度工具(如
at
)结合使用?显然,这意味着一台机器负责安排未来的事情,但它允许您删除每秒一次的轮询。嗯,
countdown
似乎只是
eta
的快捷方式。问题是我们有一个比SQS可见性超时更长的长倒计时,任务将在循环中再次执行()这会以动态方式工作吗?例如,动态设置cloudwatch规则,然后启动lambda,然后删除该规则。例如,在我们的用例中,我们让用户注册,在他们注册24小时后,我们向他们发送电子邮件。假设有五个用户注册,每个用户发送电子邮件的时间会有所不同,因此我们需要在cloudwatch中灵活创建规则,以方便一次性触发。当然会,你只需要创建和销毁很多规则。这听起来有点过分了——我知道对于电子邮件,我们在数据库中使用了一个“发送时间”变量,然后有一个作业,每分钟轮询一次这种类型的用例要发送的项目。如果你不想这样做,CW肯定会扩展到你的用例中。嘿@Patrick,我也在考虑使用cloudwatch和sqs在ECS中运行的芹菜工人中启动任务。您能建议我们必须发送给SQS的邮件的正文结构是什么吗?@r4v1-对不起,我在查看其他邮件时,刚刚在收件箱中看到了您的便条。SQS作为事件源不能直接启动ECS任务。您需要处理SQS消息(可能通过lambda),然后启动ECS任务。如果您正在考虑根据SQS中的任务计数扩展芹菜工人,那么您可能希望了解ECS服务的扩展规则,您的工人将成为SQS中的成员