预订入门
在分布式环境中,您通常希望应用程序或作业对从其他组件 (通常称为事件生产者) 生成的消息 (事件) 作出反应。 通过 Code Engine,应用程序或作业可以通过预订事件生产者来接收感兴趣的事件。 对于应用程序,事件信息以 POST HTTP 请求的形式接收,对于作业,则以环境变量的形式接收。
Code Engine 支持以下类型的事件生产者。
- Cron
- Cron 事件生产者基于 cron,并定期生成事件。 当需要在明确定义的时间间隔或特定时间执行操作时,请使用 cron 事件生产者。
- IBM Cloud Object Storage
- 当对对象存储区中的对象进行更改时,Object Storage 事件生产者将生成事件。 例如,当对象添加到存储区时,应用程序可以接收事件,然后根据该更改执行操作,可能使用该新对象。
- Kafka
- Kafka 事件生产者监视要在 Kafka 实例中显示的新消息。 为一组主题创建 Code Engine Kafka 预订时,应用程序或作业会针对其中一个主题中显示的每条新消息接收单独的事件。
- Webhook
- 您可以使用 GitHub Webhook 将事件从 GitHub 存储库发送到 Code Engine 工作负载。 在其中一个 受支持的内容类型中,将事件作为 POST 请求发送。 必须将应用程序与公共端点配合使用以接收 GitHub 事件; 作业不受支持。 有关更多信息,请参阅 将 GitHub 事件发送到应用程序。
有关预订 API 的更多信息,请参阅 预订 CRD 方法。
应用程序和应用程序缩放的预订
应用程序可以预订多个事件生产者,但只有一个应用程序可以从每个预订接收事件。 请注意,预订可能会影响应用程序的扩展方式。 例如,如果您期望应用程序同时接收许多事件,并且处理每个事件需要几分钟时间,那么可能需要比可以快速处理每个事件更高的最大规模值。 有关更多信息,请参阅 配置应用程序缩放。
所有传递给应用程序的事件都是以 HTTP 消息的形式接收的。 事件包含某些 HTTP 标头,可帮助您快速确定事件的关键信息,而无需查看事件的主体(业务逻辑)。 有关更多信息,请参阅 向应用程序发送的IBM Cloud Object Storage事件的 HTTP 标头示例。
作业预订和作业运行限制
预订可能会影响启动的作业数。 例如,如果作业预订删除 Object Storage 存储区上的更改并删除该存储区,那么将针对该存储区中的每个对象运行一个作业,并且您可以快速达到 100 个作业运行的限制。 此外,您需要考虑由事件触发的每个作业运行的运行时。 例如,如果事件生产者每秒触发 10 个或更多事件,并且每个作业运行约 20 秒,那么将在约 10 秒内达到作业运行限制 100,并且任何后续作业运行都将丢失,直到先前启动的作业运行完成为止。 仅当传入事件数通常较低且特定时间范围内期望的事件数峰值足够低,使正在运行的作业数低于配额限制时,才选择作业作为事件订户目标。 有关更多信息,请参阅 Code Engine的限制和配额。
10 分钟后,将删除由预订创建的作业运行。 有关更多信息,请参阅 我的作业在何处运行?。
传递到作业的所有事件都将作为环境变量接收。 有关更多信息,请参阅 发送到作业的 IBM Cloud Object Storage 事件的示例环境变量。
事件元数据
将修改创建预订时由 Code Engine 管理的事件,以使其符合
CloudEvents
规范。 此规范定义了一组公共属性,这些属性可以包含在每个事件中,以提供一组公共元数据。 通过查看元数据,您可以快速了解消息的关键部分,而无需解析和了解整个事件有效内容。 例如,传递给应用程序的每个事件都包含一个名为 ce-type
的 HTTP 标头,表示事件的语义(或
"原因")。 来自数据库的事件可能包含 ce-type
值 com.example.row.deleted
,指示由于在数据库中删除了某行而生成了该事件。
下表列出了一些关键的公共属性。 每个属性指示它是入局事件上的 必需 属性还是 可选属性。
头 | 描述 |
---|---|
标识 | 此 required 属性是事件的唯一标识。 没有为来自同一事件生产者的两个事件分配相同的值。 |
源 | 此 required 属性指定发生事件的上下文。 例如,对于对象存储系统,此值可能是所讨论对象所在的存储区。 |
规范版本 | 此 required 属性指示事件使用的 CloudEvents 规范的版本。 |
Type | 此 required 属性描述事件的类型。 例如,事件类型可能是创建或删除了资源。 |
主题 | 此 可选 属性指示与事件相关的资源。 例如,在对象存储系统中,此值可能是已修改的存储区中的对象。 |
时间 | 此 可选 属性是发生事件的时间戳记。 |
有关完整属性列表的更多信息,请参阅 CloudEvents
规范。
在Code Engine中,当事件被传送到应用程序时,CloudEvent
属性会以 HTTP 标头的形式出现,并以 ce-
作为前缀。 将事件传递到批处理作业时,属性将显示为以 CE_
为前缀的环境变量,并且整个变量名称为大写。
向应用程序发送IBM Cloud Object Storage事件的 HTTP 头信息示例
ce-id: 3fb2c04e-a660-4640-8899-b82efb8169b6
ce-source: https://cloud.ibm.com/catalog/services/cloud-object-storage/mybucket
ce-specversion: 1.0
ce-subject: object-69-144
ce-time: 2021-08-17T20:22:02.917Z
ce-type: com.ibm.cloud.cos.document.delete
发送到作业的 IBM Cloud Object Storage 事件的环境变量示例
CE_DATA={"bucket":"mybucket","endpoint":"","key":"Notes.rtf","notification":{"bucket_name":"mybucket","content_type":"text/rtf","event_type":"Object:Delete","format":"2.0","object_length":"4642","object_name":"Notes.rtf","request_id":"b59727ee-9c4e-446a-9261-5616f6d1283b","request_time":"2021-04-13T20:10:37.631Z"},"operation":"Object:Delete"}
CE_ID=b59727ee-9c4e-446a-9261-5616f6d1283b
CE_SOURCE=https://cloud.ibm.com/catalog/services/cloud-object-storage/mybucket
CE_SPECVERSION=1.0
CE_TIME=2021-08-17T20:22:02.917Z
CE_TYPE=com.ibm.cloud.cos.document.delete
创建订阅后会发生什么?
缺省情况下,subscription cron create
,subscription cos create
和 subscription kafka create
命令首先检查目标应用程序或作业是否存在。 如果由于应用程序或作业在项目中不存在而导致目标检查失败,那么用于预订创建的命令将返回错误。 如果要在不首先创建应用程序的情况下创建预订,请使用 --force
选项。 通过使用 --force
选项,该命令将绕过目标检查。 请注意,在创建目标应用程序或作业之前,预订的 Ready
字段显示为 false。 然后,预订将自动进入 Ready: true
状态。
创建预订后,将重复轮询该预订以获取状态以验证其就绪性。 缺省情况下,此轮询在超时前持续 15 秒。 您可以使用 --wait-timeout
选项来更改命令超时之前的时间量。 您还可以通过将 --no-wait
选项设置为 false
来绕过状态轮询。
您可以使用 subscription cron get
,subscription cos get
或 subscription kafka get
CLI 命令来显示预订的状态。