按一天中的时间安排网络测功机的数量

Posted

技术标签:

【中文标题】按一天中的时间安排网络测功机的数量【英文标题】:schedule number of web dynos by time of day 【发布时间】:2012-08-10 13:32:12 【问题描述】:

有没有办法使用 Heroku 调度程序在一天中的特定时段启动和停止 web dynos?比如在营业时间 2 dyno 和晚上只有 1 dyno?

我真的很想避免将普通用户/密码凭据放入应用程序本身,因此我正在寻找一种安全的方式来执行此操作(除了每天为每个应用程序手动执行此操作)。直接使用“heroku ps:scale web=2”自然会很好,但据我所知这是不支持的。

提前感谢您的任何反馈...

【问题讨论】:

【参考方案1】:

您可以通过创建使用 Heroku API 的脚本按计划扩展 heroku dynos。然后,您在 Procfile 中创建一个条目,并通过 Heroku Scheduler 插件调用它。方法如下:

首先,您需要将“heroku”python 模块添加到您的requirements.txt

heroku==0.1.2

接下来,创建一个包含您的 API 密钥的配置变量,以便您的脚本可以使用该 API。

heroku 配置:添加 HEROKU_API_KEY=your_api_key_string

您可以找到您的 API 密钥on your heroku account page。

现在您将能够编写一个可扩展您的测功机的 Python 脚本。这是一个非常基本的脚本,它接受测功机的数量作为命令行参数。

import os
import sys

import heroku

"""Scale heroku web processes using the heroku python API."""

# you may want to add better argument processing, use argparse, etc.
dynos = int(sys.argv[1])
cloud = heroku.from_key(os.environ.get('HEROKU_API_KEY'))
app = cloud.apps['your_app_name']

try:
    # you may want to add a maximum dyno check here to prevent costly mistakes ;)
    webproc = app.processes['web']  
    webproc.scale(dynos)

except KeyError:
    # note: scaling to 0 dynos or attempting to scale up if 0 web dynos exist
    # both throw this error. Make sure you have at least one dyno.
    print >> sys.stderr, "Could not scale web processes - are there 0 web dynos running?"

然后您可以在 Heroku Scheduler 网页中定义您的整个任务,或者在您的 Procfile 中定义它并从网页中调用 Procfile 进程名称。我更喜欢后者,因为它可以轻松更新或更改流程,而无需登录 heroku 的网站。

所以,在你的 Procfile 中创建条目:

scale_up: python scale.py 2
scale_down: python scale.py 1

然后安排它们:

瞧!您的测功机现在将在一天中的指定时间放大或缩小。

--

请注意,一旦您在计划程序网页上创建了计划任务,您就无法编辑它运行的时间,但如果您创建一个新任务,您可以设置时间日期,然后删除您的旧任务。

注意 2: 如果您尝试缩小到 0 个 dyno,或者如果您尝试扩大当前存在 0 个 web dyno,heroku python API 似乎会抛出 KeyError。为了避免这两种情况,不要缩小到 0 dynos。

【讨论】:

这个答案非常详细。非常感谢您一直以来的投资。非常感谢......我自然接受你的回答作为the的答案。 :) 谢谢! :) 我很高兴它有所帮助。谁知道也许其他人也会觉得它有用;) 我的同事向 Heroku 询问了有关此问题的支持,他们说这可行,但不建议使用 Heroku Scheduler,因为它是“尽力而为”的服务,这意味着它不能保证运行或可能运行不止一次。【参考方案2】:

它没有内置在平台中,但应该很容易通过调度程序和使用您的 API 令牌来实现。

【讨论】:

【参考方案3】:

现在使用 heroku 插件插件 crontogo 很容易做到 https://elements.heroku.com/addons/crontogo

注意:这是一个付费插件,自 2021 年 10 月起仅在美国/欧洲地区可用

参考https://crontogo.com/blog/how-to-schedule-heroku-cli-commands/

设置 2 个作业

第一份工作“Dyno scale down”:

Cron 表达式:0 18 * * 1-5

命令:heroku dyno:scale web=1:Standard-1X

此作业将在工作日(周一至周五)下午 6 点运行,并将应用程序缩小到 1 个 Standard-1X dyno。

第二份工作“Dyno 放大”:

Cron 表达式:0 9 * * 1-5

命令:heroku dyno:scale web=2:Standard-1X

此作业将在工作日(周一至周五)上午 9 点运行,并将应用扩展到 2 个 Standard-1X dynos。

【讨论】:

以上是关于按一天中的时间安排网络测功机的数量的主要内容,如果未能解决你的问题,请参考以下文章

python pandas 按一天中的小时求和

在一天中的特定时间安排本地通知

在 pandas 中以更快的方式分组一天中的时间

如何获得一天中应用程序中用户的登录数量?

一天中每小时的 SQL 最大并发会话数

如何使用 Swift 获取一天中的时间?