Heroku的一个工作器Dyno(在Python环境中运行)在30分钟后会进入睡眠状态。该工作器执行Celery周期任务计划以向用户发送电子邮件。
这里是显示实际行为的日志:
2019-05-29T12:49:02.273852+00:00 heroku[web.1]: Idling
2019-05-29T12:49:02.278946+00:00 heroku[web.1]: State changed from up to down
2019-05-29T12:49:02.288616+00:00 heroku[worker.1]: Idling
2019-05-29T12:49:02.306209+00:00 heroku[worker.1]: State changed from up to down
2019-05-29T12:49:03.087205+00:00 heroku[worker.1]: Stopping all processes with SIGTERM
2019-05-29T12:49:03.101608+00:00 app[worker.1]:
2019-05-29T12:49:03.101688+00:00 app[worker.1]: worker: Warm shutdown (MainProcess)
2019-05-29T12:49:03.185191+00:00 app[worker.1]: [2019-05-29 12:49:03,184: INFO/MainProcess] beat: Shutting down...
2019-05-29T12:49:03.297659+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2019-05-29T12:49:03.324661+00:00 app[web.1]: [2019-05-29 12:49:03 +0000] [4] [INFO] Handling signal: term
2019-05-29T12:49:03.326185+00:00 app[web.1]: [2019-05-29 12:49:03 +0000] [11] [INFO] Worker exiting (pid: 11)
2019-05-29T12:49:03.326993+00:00 app[web.1]: [2019-05-29 12:49:03 +0000] [10] [INFO] Worker exiting (pid: 10)
2019-05-29T12:49:03.626898+00:00 app[web.1]: [2019-05-29 12:49:03 +0000] [4] [INFO] Shutting down: Master
2019-05-29T12:49:03.758456+00:00 heroku[web.1]: Process exited with status 0
2019-05-29T12:49:04.817520+00:00 heroku[worker.1]: Process exited with status 0
根据研究,我理解 web
dyno 会休眠,但 worker
dyno 不会休眠。https://devcenter.heroku.com/articles/free-dyno-hours
Web:
如果一个应用有一个免费的 web dyno,在30分钟内没有收到 web 流量,它将会休眠。
警告:Worker dynos 不会休眠,因为它们不会响应 Web 请求。请注意此点,因为它们可能会运行24/7并消耗您的小时数。
我希望 web 在空闲时(平均 250 小时) + worker 运行 Celery beat 的全天候使用(750 小时)可以满足我的需求,以在套餐范围内。
目前我已经启用了:https://uptimerobot.com/ 来定期每五分钟 ping web dyno 以使其保持唤醒状态,但小时数不足以维持一个整月。使用这种方法,两个 dynos 看起来都是唤醒状态。
你有什么想法为什么会发生这样的情况吗?有什么解决方案?