借助 App Engine Cron 服务,您可以配置在指定时间或按固定时间间隔执行的定期计划任务。这些任务通常称为“Cron 作业”。Cron 作业由 App Engine Cron 服务自动触发。例如,您可以使用 Cron 作业每天发送一封电子邮件报告,或者每 10 分钟更新一次缓存数据,每小时刷新一次摘要信息。
Cron 作业会按计划对网址发出 HTTP GET
请求。调用网址的处理程序后,即执行相应逻辑。Cron 作业请求与推送任务队列请求受相同的限制约束。
准备工作
要部署或更新计划,您的帐号需要拥有以下某个 IAM 角色:
- 所有者
- Editor
您可以在 Google Cloud Console 中的 IAM 页面上设置权限。
创建 Cron 作业
- 在应用的根目录中创建
cron.yaml
文件(以及app.yaml
)。 在此文件中添加一个或多个
<cron>
条目,并定义作业的必要元素,包括必需的<url>
和<schedule>
元素。以下示例将创建一个每天执行的基本 Cron 作业:
cron: - description: "daily summary job" url: /tasks/summary target: beta schedule: every 24 hours
您可以视情况将目标 (target) 指定为服务/版本的名称。如果指定该元素,请将其添加到应用的主机名之前,以将作业路由到该服务/版本。如果未指定目标,则作业将在为流量配置的
default
服务版本中运行。为 Cron 作业网址创建处理程序。处理程序应执行您想安排的任何任务,并使用 200 到 299(含)之间的 HTTP 状态代码进行响应,以表示其运行成功。或者,也可以返回其他状态代码,以用于重试 Cron 作业。
在开发服务器中测试 Cron 作业
本地开发服务器不会自动运行 Cron 作业。您可以直接向 Cron 作业网址发出请求,以测试其功能。您可以使用本地 Cron 或计划任务界面,通过 curl 或类似工具触发作业的网址。
您可以使用本地开发服务器的管理界面查看位于 http://localhost:8000/cron
的 Cron 作业。
重试运行失败的 Cron 作业
如果 Cron 作业的请求处理程序返回的状态代码不在 200-299(含)范围内,则 App Engine 认为该作业失败。默认情况下,除非返回 503 状态代码,否则不会重试运行失败的作业。如返回 503 状态代码,则每分钟重试一次,直到运行成功或返回 200-299 状态代码。
要设置重新尝试执行失败的作业,请执行以下操作:
- 在
cron.yaml
文件中添加retry_parameters
块。 在
retry_parameters
块中选择并设置重试参数。例如,下面是一个
cron.yaml
文件示例,其中包含一个 Cron 作业,该作业配置为最多重试五次(默认值),起始退避时间为 2.5 秒,每次加倍。cron: - description: "retry demo" url: /retry schedule: every 10 mins retry_parameters: min_backoff_seconds: 2.5 max_doublings: 5
部署 cron 作业
如需部署 cron.yaml
配置文件中指定的 Cron 作业,请运行以下命令:
gcloud app deploy cron.yaml
删除所有 cron 作业
要删除所有 cron 作业:
将
cron.yaml
文件的内容修改为:cron:
将
cron.yaml
文件部署到 App Engine。
保护 Cron 的网址
Cron 处理程序只是 app.yaml
中定义的一个普通处理程序。您可以将访问权限仅局限于管理员帐号,这样就可以防止用户访问计划任务使用的网址。计划任务可以访问仅限管理员访问的网址。您可以通过将 login: admin
添加到 app.yaml
中的处理程序配置来限制网址。
app.yaml
中的一个示例可能如下所示:
runtime: python27
api_version: 1
handlers:
- url: /report/weekly
script: reports.app
login: admin
如需了解详情,请参阅 app.yaml 参考文档中关于如何要求登录或管理员状态的内容。
要测试 Cron 作业,请以管理员身份登录,然后在浏览器中访问处理程序的网址。
来自 Cron 服务的请求还包含下面的 HTTP 标头:
X-Appengine-Cron: true
X-Appengine-Cron
标头由 App Engine 在内部设置。如果您的请求处理程序找到此标头,则可以确信该请求是 Cron 请求。如果该标头出现在应用的外部用户请求中,将该标头会被删除(由允许设置测试标头的应用管理员登录并发出的请求除外)。
App Engine 从 IP 地址 0.1.0.2
发出 Cron 请求。对于使用旧版 gcloud(版本低于 326.0.0)创建的 Cron 作业,Cron 请求将来自 0.1.0.1
。
调用 Google Cloud Endpoints
您无法在 Cron 作业的 url
字段中指定 Google Cloud Endpoints 端点。如果您希望 Cron 作业调用 Google Cloud Endpoints 端点,请向应用中的处理程序处理的目标发出请求,并通过处理程序代码调用端点类和方法。
在控制台中查看 Cron 作业
您可以在 Cloud Scheduler 的 App Engine Cron 作业标签页中查看计划的 Cron 作业。
您可以查看日志,以了解添加或删除 Cron 作业的时间。
了解详情
如需详细了解如何定义 Cron 作业,请参阅 cron.yaml 参考文档。