安排任务在未来的某个时刻运行(架构)

时间:2018-06-02 21:42:56

标签: python-3.x amazon-web-services flask architecture

因此,我们运行了一个Python烧瓶应用程序,利用Celery和AWS SQS来满足我们的异步任务需求。

我们最近面临的一个棘手问题是创建一个在x天或3小时内运行的任务。我们有这样的需求。

现在我们在数据库中创建具有时间戳的事件,这些时间戳存储应该触发它们的时间。然后,我们利用celery beat每秒运行一个计划任务来检查是否有任何要处理的事件(基于触发时间戳)然后处理它们。但是,这是每秒都在查询数据库中我们认为可以以某种方式改善的事件。

我们研究了在芹菜(http://docs.celeryproject.org/en/latest/userguide/calling.html)中使用eta参数,它允许您安排任务在x时间内运行。然而,拥有大型etas似乎是不好的做法,并且AWS SQS的可见性超时大约为两个小时,所以超过这个时间会导致冲突。

我现在正在挠头。在一个有这个工作,并且相当不错的事情已经与SNS,SQS等分开,以确保扩展容差。但是,它只是不想写入每秒查询数据库以处理事件。当然,Google / AWS提供了一种更简单的方法或服务来安排某些事件(发布/订阅)在将来的某个时间发生(x小时,分钟等)。

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

您是否看过AWS Step Functions,特别是Wait State?您可以将几个lambda函数放在一起,第一个返回时间戳或等待Wait State的秒数,最后一个在Wait返回后将消息添加到SQS。

答案 1 :(得分:0)

您可以使用apply_async启动作业,然后使用倒计时,例如:

xxx.apply_async(...,countdown = TTT)

不能保证作业在那个时间正好开始,具体取决于队列的繁忙程度,但在您的用例中似乎不是问题。

答案 2 :(得分:0)

您是否查看了Amazon Simple Notification Service?听起来它可以满足您的需求...... see the picture

从该页面开始:

  

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

答案 3 :(得分:0)

亚马逊的计划解决方案是使用CloudWatch触发事件。这些事件可以在SQS / SNS端点中发送消息,触发ECS任务,运行Lambda等。许多人使用执行Lambda的技巧,然后执行其他操作来触发系统中的某些内容。例如,您可以触发一个Lambda,将作业推送到Redis上供Celery工作人员接收。

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

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