运行工作应用程序时,Heroku Scheduler会延迟几秒钟?

时间:2015-01-23 18:53:53

标签: python heroku scheduled-tasks

我目前使用附加调度程序在Heroku上托管了一个Python工作者应用程序。我将应用程序设置为在UTC时间凌晨5:00触发,但在应用程序实际触发之前需要10-20秒。这对我来说是个大问题,因为我需要我的应用程序尽可能接近开始时间执行。

从附加的日志语句中可以看出,Python应用程序直到预定时间过去近18秒才开始运行。

2015-01-23T05:00:18.395694+00:00 app[scheduler.9077]: 2015-01-23 05:00:18 [ MainThread ] [ INFO ] : -------- NEW LOG BLOCK ---------------'

我已经研究了Heroku的一些延迟问题,并找到了一些关于空转dynos的东西,并使用New Relic来ping这些dynos以防止它们空转但是那些最关注Web应用程序。或者这里发生了同样的事情?我怎么能用New Relic来ping一个worker(一个没有可达网址的应用程序)?

这真的令人沮丧,因为cron没有发生这种情况。

2 个答案:

答案 0 :(得分:1)

使用Heroku调度程序无法达到毫秒精度 - 这根本不是它的工作原理。调度程序是一个松散的'替换cron,但不应该指望这个精确度。

如果你需要那么多时间控制你需要运行一个工作流程 - 这样你就可以有一个专门的,长时间运行的流程,可以启动在您需要的确切时间请求(不依赖于Heroku的API计时)。

答案 1 :(得分:0)

这是我从Heroku支持团队收到的回复:

  

嗨,我们的调度程序是尽力服务,这意味着它可以   延迟了几秒钟,或者错过了一些跑步。如果你的应用依赖   非常准确的预定流程,我们建议使用一个   定制时钟过程。如果您有任何进一步的信息,请告诉我们   题。谢谢,Damien

所以...我的解决方案。我只是按照本指南:https://devcenter.heroku.com/articles/clock-processes-python

然后我通过执行以下操作为我的Dyno添加了一个时钟进程:

heroku ps:scale clock=1

我将以下内容添加到我的procfile中:

clock: python clock.py

我安装了pip要求(并把它放在我的requirements.txt中):

apscheduler==3.0.1

clock.py

import sys

sys.path.append('main')

from main import main
from apscheduler.schedulers.blocking import BlockingScheduler

sched = BlockingScheduler()

# Executes every night at 5:00am UTC time | 12:00am (midnight) Winston-Salem, NC time
@sched.scheduled_job('cron', hour=5)
def scheduled_job():
    main()

sched.start()

然后我将所有这些都归还给了Heroku,它的效果非常好。没有延迟了!