订阅 cron 事件

通过本教程,您可以学习如何使用 IBM Cloud® Code Engine 命令行界面(CLI)订阅cron事件。

在分布式环境中,您经常希望您的应用程序或作业对其他组件(通常称为事件生产者)生成的消息(事件)做出反应。 借助 Code Engine,您的应用程序或作业可以通过订阅事件发布者来接收感兴趣的事件。 对于应用程序,事件信息以 POST HTTP 请求的形式接收;对于作业,则以环境变量的形式接收。

准备工作

所有 Code Engine 用户都必须拥有一个“按需付费”账户。 教程可能会产生费用。 使用“成本估算器”,根据您的预计使用情况生成成本估算。 如需了解更多信息,请参阅 Code Engine 中的定价信息

确定 cron 时间间隔

cron 事件生成器会定期生成事件。 这个时间间隔可以按分钟、小时、天、月或几个不同时间间隔的组合来安排。

Cron 使用标准的 crontab 来指定时间间隔的详细信息,格式为 "* * * * *,代表分钟、小时、月日、月份和星期。 例如,要将事件安排在午夜,请指定 "0 0 * * *。 要将事件安排在每周五午夜,请指定 "0 0 * * FRI

如步骤 3 所示,您可以使用“--schedule 选项和”subscription cron 命令来设置 cron 时间间隔。 如果不指定 "--schedule 选项,则默认情况下每天每分钟发送一次 cron 事件。

创建应用程序(或工作)

虽然事件可用于触发应用程序或作业,但本教程使用的是应用程序。

cron-app 使用 ibmcloud ce app create 命令。 该应用程序会提取一张名为 "icr.io/codeengine/cron 的图片。 该应用会在每个事件到达时进行记录,并显示完整的 HTTP 请求头和 HTTP 请求体内容。 有关本示例所用代码的更多信息,请参阅 "cron

ibmcloud ce app create --name cron-app --image icr.io/codeengine/cron

运行“ibmcloud ce application get --name cron-app,验证应用程序是否处于”Ready 状态。

有关此应用程序的更多信息,请参阅 cron readme 文件

创建预订

应用程序准备就绪后,创建 cron 事件生产者订阅,并使用 "ibmcloud ce sub cron create 命令将其连接到应用程序。

下面的示例创建了一个名为“cron-sub 的 cron 订阅,并指定”cron-app 应用程序为其目标。 订阅使用 "--data 选项在 cron 事件中包含一个 JSON 字符串。 它还指定了 cron 计划,使用 "--schedule 选项和 "* * * * * 值,每天每分钟向 "cron-app 应用程序发送一个事件。

ibmcloud ce sub cron create --name cron-sub --destination cron-app --data '{"mydata":"hello world"}' --schedule '* * * * *'

运行 "ibmcloud ce sub cron get -n cron-sub 查找订阅信息。

示例输出

在此输出中,可以看到订阅名称、目的地、计划和数据都是正确的。

Getting cron event subscription 'cron-sub'...
OK
Name:          cron-sub
ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:  myproject
Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
Age:           2m18s
Created:       2021-03-14T13:21:13-05:00
Destination Type:  app
Destination:       cron-app
Schedule:          * * * * *
Time Zone:         UTC
Data:              {"mydata":"hello world"}
Ready:             true
Events:
    Type     Reason                 Age                Source                 Messages
    Normal   FinalizerUpdate        65s                pingsource-controller  Updated "cron-sub" finalizers

测试您的订阅

成功将应用程序订阅到 cron 事件后,请查看日志以确定其是否有效。

使用 "ibmcloud ce app logs 命令获取应用程序的日志。

ibmcloud ce app logs --name cron-app

示例输出

在以下输出中,您可以看到事件的接收日期和时间,以及创建订阅时传递的 HTTP 头部信息和 HTTP 正文JSON内容。

2021-01-21 20:15:00 - Received:
Header: Accept-Encoding=[gzip]
Header: Ce-Id=[7de01e8e-84dc-4409-ad56-90d6e391397c]
Header: Ce-Source=[/apis/v1/namespaces/50d38123af5/pingsources/cron-sub]
Header: Ce-Specversion=[1.0]
Header: Ce-Time=[2021-01-21T20:15:00.392503458Z]
Header: Ce-Type=[dev.knative.sources.ping]
Header: Content-Length=[24]
Header: Content-Type=[application/json]
Header: Forwarded=[for=172.30.118.174;proto=http, for=172.30.95.204]
Header: K-Proxy-Request=[activator]
Header: Traceparent=[00-1bf4b6b1d67f278a4b827e4e00f0cf7c-cbce9df0faedd812-00]
Header: User-Agent=[Go-http-client/1.1]
Header: X-B3-Sampled=[0]
Header: X-B3-Spanid=[fb208eaa6af15ede]
Header: X-B3-Traceid=[6db074fdaf6a6411fb208eaa6af15ede]
Header: X-Envoy-Attempt-Count=[1]
Header: X-Envoy-Decorator-Operation=[cron-app-snva7-1.50d38123af5.svc.cluster.local:80/*]
Header: X-Envoy-Internal=[true]
Header: X-Envoy-Peer-Metadata=[ChoKCkNMVVNURVJfSUQSDBoKS3ViZXJuZXRlcwo5CgxJTlNUQU5DRV9JUFMSKRonMTcyLjMwLjk1LjIwNCxmZTgwOjplODBiOjFkZmY6ZmVmMjo1ZjkxCpQCCgZMQUJFTFMSiQIqhgIKHQoDYXBwEhYaFGlzdGlvLWluZ3Jlc3NnYXRld2F5ChMKBWNoYXJ0EgoaCGdhdGV3YXlzChQKCGhlcml0YWdlEggaBlRpbGxlcgoZCgVpc3RpbxIQGg5pbmdyZXNzZ2F0ZXdheQofChFwb2QtdGVtcGxhdGUtaGFzaBIKGghkNzY1NjljOQoSCgdyZWxlYXNlEgcaBWlzdGlvCjkKH3NlcnZpY2UuaXN0aW8uaW8vY2Fub25pY2FsLW5hbWUSFhoUaXN0aW8taW5ncmVzc2dhdGV3YXkKLwojc2VydmljZS5pc3Rpby5pby9jYW5vbmljYWwtcmV2aXNpb24SCBoGbGF0ZXN0ChoKB01FU0hfSUQSDxoNY2x1c3Rlci5sb2NhbAotCgROQU1FEiUaI2lzdGlvLWluZ3Jlc3NnYXRld2F5LWQ3NjU2OWM5LWw5cHZoChsKCU5BTUVTUEFDRRIOGgxpc3Rpby1zeXN0ZW0KXQoFT1dORVISVBpSa3ViZXJuZXRlczovL2FwaXMvYXBwcy92MS9uYW1lc3BhY2VzL2lzdGlvLXN5c3RlbS9kZXBsb3ltZW50cy9pc3Rpby1pbmdyZXNzZ2F0ZXdheQo5Cg9TRVJWSUNFX0FDQ09VTlQSJhokaXN0aW8taW5ncmVzc2dhdGV3YXktc2VydmljZS1hY2NvdW50CicKDVdPUktMT0FEX05BTUUSFhoUaXN0aW8taW5ncmVzc2dhdGV3YXk=]
Header: X-Envoy-Peer-Metadata-Id=[router~172.30.95.204~istio-ingressgateway-d76569c9-l9pvh.istio-system~istio-system.svc.cluster.local]
Header: X-Forwarded-For=[172.30.118.174, 172.30.95.204, 172.30.163.42]
Header: X-Forwarded-Proto=[http]
Header: X-Request-Id=[ce502e5e-dd89-401e-a4cd-b72a6822f689]
Body: {"mydata":"hello world"}

有关标头和正文的更多信息,请参阅 HTTP 中关于 cron 事件的标头和正文信息

有关使用 CLI 查看日志的更多信息,请参阅 使用 CLI 查看日志

请注意,订阅会影响应用程序的扩展。 更多信息,请参阅 配置应用程序缩放

更新您的订阅

现在您已经知道 cron 订阅成功,可以使用 "ibmcloud ce sub cron update 命令更新 cron 事件,使其在不同的日程上运行。 例如,将订阅更新为每天午夜运行。

ibmcloud ce sub cron update -n cron-sub -d cron-app --data '{"mydata":"hello world again"}' -s '0 0 * * *'

运行 "ibmcloud ce sub cron get -n cron-sub 命令查找订阅信息。

示例输出

在该输出中,可以看到计划和数据都已更新。

Getting cron event subscription 'cron-sub'...
OK
Name:          cron-sub
ID:            abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Project Name:  myproject
Project ID:    01234567-abcd-abcd-abcd-abcdabcd1111
Age:           5m7s
Created:       2021-03-14T13:21:13-05:00
Destination:  App:cron-app
Schedule:     0 0 * * *
Data:         {"mydata":"hello world again"}
Ready:        true
Events:
    Type     Reason                 Age                Source                 Messages
    Normal   FinalizerUpdate        65s                pingsource-controller  Updated "cron-sub" finalizers

清理 cron 订阅教程

准备好删除您的 cron 订阅和应用程序了吗? 您可以使用“ibmcloud ce app delete 和”ibmcloud ce sub cron delete 命令。

要取消订阅

ibmcloud ce sub cron delete --name cron-sub

删除您的申请、

ibmcloud ce app delete --name cron-app

想了解更多代码示例? 请查看“IBM Cloud Code Engine”GitHub 代码库中的示例