
作者 | 元毅,阿里云容器平台高级开发工程师,负责阿里云容器平台 Knative 相关工作。
导读:在实际的开发中我们经常会遇到将一条数据需要经过多次处理的场景,称为 Pipeline。那么在 Knative 中是否也提供这样的能力呢?其实从 Knative Eventing 0.7 版本开始,就提供了 Sequence CRD 资源,用于事件处理 Pipeline。本篇文章中,阿里云容器平台高级开发工程师元毅将为大家详细介绍 Sequence 的定义及在 Knative Eventing 中提供的 4 种使用场景。
Sequence 定义
首先来看一下 Sequence Spec 定义:
1apiVersion: messaging.knative.dev/v1alpha1 2kind: Sequence 3metadata: 4 name: test 5spec: 6 channelTemplate: 7 apiVersion: messaging.knative.dev/v1alpha1 8 kind: InMemoryChannel 9 steps: 10 - ref: 11 apiVersion: serving.knative.dev/v1alpha1 12 kind: Service 13 name: test 14 reply: 15 kind: Broker 16 apiVersion: eventing.knative.dev/v1alpha1 17 name: test
Sequence Spec 包括 3 个部分:
- steps: 在 step 中定义了按照顺序执行的服务,每个服务会对应创建 Subscription;
- channelTemplate:指定了使用具体的那个 Channel;
- reply:(可选)定义了将最后一个 step 服务结果转发到的目标服务。
Sequence 都是适合哪些具体应用场景呢?我们上面也提到了事件处理的 Pipeline。那么在实际场景应用中究竟以什么样的形式体现呢? 现在我们揭晓一下 Sequence 在 Knative Eventing 中提供的如下 4 种使用场景:
- 直接访问 Service;
- 面向事件处理;
- 级联 Sequence;
- 面向 Broker/Trigger。
直接访问 Service 场景
事件源产生的事件直接发送给 Sequence 服务, Sequence 接收到事件之后顺序调用 Service 服务对事件进行处理:

创建 Knative Service
这里我们创建 3 个 Knative Service 用于事件处理。每个 Service 接收到事件之后会打印当前的事件处理信息。
1apiVersion: serving.knative.dev/v1alpha1 2kind: Service 3metadata: 4 name: first 5spec: 6 template: 7 spec: 8 containers: 9 - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 10 env: 11 - name: STEP 12 value: "0" 13 14--- 15apiVersion: serving.knative.dev/v1alpha1 16kind: Service 17metadata: 18 name: second 19spec: 20 template: 21 spec: 22 containers: 23 - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 24 env: 25 - name: STEP 26 value: "1" 27--- 28apiVersion: serving.knative.dev/v1alpha1 29kind: Service 30metadata: 31 name: third 32spec: 33 template: 34 spec: 35 containers: 36 - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 37 env: 38 - name: STEP 39 value: "2" 40---
创建 Sequence
创建顺序调用 first->second->third Service 的 Sequence。
1apiVersion: messaging.knative.dev/v1alpha1 2kind: Sequence 3metadata: 4 name: sequence 5spec: 6 channelTemplate: 7 apiVersion: messaging.knative.dev/v1alpha1 8 kind: InMemoryChannel 9 steps: 10 - ref: 11 apiVersion: serving.knative.dev/v1alpha1 12 kind: Service 13 name: first 14 - ref: 15 apiVersion: serving.knative.dev/v1alpha1 16 kind: Service 17 name: second 18 - ref: 19 apiVersion: serving.knative.dev/v1alpha1 20 kind: Service 21 name: third
创建数据源
创建 CronJobSource 数据源,每隔 1 分钟发送一条事件消息 {"message": "Hello world!"} 到 Sequence 服务。
1apiVersion: sources.eventing.knative.dev/v1alpha1 2kind: CronJobSource 3metadata: 4 name: cronjob-source 5spec: 6 schedule: "*/1 * * * *" 7 data: '{"message": "Hello world!"}' 8 sink: 9 apiVersion: messaging.knative.dev/v1alpha1 10 kind: Sequence 11 name: sequence
示例结果

面向事件处理场景
事件源产生的事件直接发送给 Sequence 服务, Sequence 接收到事件之后顺序调用 Service 服务对事件进行处理,处理之后的最终结果会调用 event-display Service 显示: 
创建 Knative Service
同上创建 3 个 Knative Service 用于事件处理:
1apiVersion: serving.knative.dev/v1alpha1 2kind: Service 3metadata: 4 name: first 5spec: 6 template: 7 spec: 8 containers: 9 - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 10 env: 11 - name: STEP 12 value: "0" 13 14--- 15apiVersion: serving.knative.dev/v1alpha1 16kind: Service 17metadata: 18 name: second 19spec: 20 template: 21 spec: 22 containers: 23 - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 24 env: 25 - name: STEP 26 value: "1" 27--- 28apiVersion: serving.knative.dev/v1alpha1 29kind: Service 30metadata: 31 name: third 32spec: 33 template: 34 spec: 35 containers: 36 - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 37 env: 38 - name: STEP 39 value: "2" 40---
创建 Sequence
创建顺序调用 first->second->third Service 的 Sequence,将处理结果通过 reply 发送给 event-display:
1apiVersion: messaging.knative.dev/v1alpha1 2kind: Sequence 3metadata: 4 name: sequence 5spec: 6 channelTemplate: 7 apiVersion: messaging.knative.dev/v1alpha1 8 kind: InMemoryChannel 9 steps: 10 - ref: 11 apiVersion: serving.knative.dev/v1alpha1 12 kind: Service 13 name: first 14 - ref: 15 apiVersion: serving.knative.dev/v1alpha1 16 kind: Service 17 name: second 18 - ref: 19 apiVersion: serving.knative.dev/v1alpha1 20 kind: Service 21 name: third 22 reply: 23 kind: Service 24 apiVersion: serving.knative.dev/v1alpha1 25 name: event-display
创建结果显示 Service
创建 event-display Service, 用于接收最终的结果信息。
1apiVersion: serving.knative.dev/v1alpha1 2kind: Service 3metadata: 4 name: event-display 5spec: 6 template: 7 spec: 8 containers: 9 - image: registry.cn-hangzhou.aliyuncs.com/knative-release/event_display:bf45b3eb1e7fc4cb63d6a5a6416cf696295484a7662e0cf9ccdf5c080542c21d
创建数据源
创建 CronJobSource 数据源,每隔 1 分钟发送一条事件消息 {"message": "Hello world!"} 到 Sequence 服务。
1apiVersion: sources.eventing.knative.dev/v1alpha1 2kind: CronJobSource 3metadata: 4 name: cronjob-source 5spec: 6 schedule: "*/1 * * * *" 7 data: '{"message": "Hello world!"}' 8 sink: 9 apiVersion: messaging.knative.dev/v1alpha1 10 kind: Sequence 11 name: sequence
示例结果

级联 Sequence 场景
Sequence 更高级的地方还在于支持级联处理: Sequence By Sequence,这样可以进行多次 Sequence 处理,满足复杂事件处理场景需求。 
创建 Knative Service
创建 6 个 Knative Service 用于事件处理, 前 3 个用于第 1 个 Sequence,后 3 个用于第 2 个 Sequence。
1apiVersion: serving.knative.dev/v1alpha1 2kind: Service 3metadata: 4 name: first 5spec: 6 template: 7 spec: 8 containers: 9 - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 10 env: 11 - name: STEP 12 value: "0" 13 14--- 15apiVersion: serving.knative.dev/v1alpha1 16kind: Service 17metadata: 18 name: second 19spec: 20 template: 21 spec: 22 containers: 23 - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 24 env: 25 - name: STEP 26 value: "1" 27--- 28apiVersion: serving.knative.dev/v1alpha1 29kind: Service 30metadata: 31 name: third 32spec: 33 template: 34 spec: 35 containers: 36 - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 37 env: 38 - name: STEP 39 value: "2" 40--- 41apiVersion: serving.knative.dev/v1alpha1 42kind: Service 43metadata: 44 name: fourth 45spec: 46 template: 47 spec: 48 containers: 49 - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 50 env: 51 - name: STEP 52 value: "3" 53 54--- 55apiVersion: serving.knative.dev/v1alpha1 56kind: Service 57metadata: 58 name: fifth 59spec: 60 template: 61 spec: 62 containers: 63 - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 64 env: 65 - name: STEP 66 value: "4" 67--- 68apiVersion: serving.knative.dev/v1alpha1 69kind: Service 70metadata: 71 name: sixth 72spec: 73 template: 74 spec: 75 containers: 76 - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 77 env: 78 - name: STEP 79 value: "5" 80---
创建第 1 个 Sequence
使用 first->second->third Service 用于第 1 个 Sequence 调用处理,将执行结果发送给第 2 个 Sequence。
1apiVersion: messaging.knative.dev/v1alpha1 2kind: Sequence 3metadata: 4 name: first-sequence 5spec: 6 channelTemplate: 7 apiVersion: messaging.knative.dev/v1alpha1 8 kind: InMemoryChannel 9 steps: 10 - ref: 11 apiVersion: serving.knative.dev/v1alpha1 12 kind: Service 13 name: first 14 - ref: 15 apiVersion: serving.knative.dev/v1alpha1 16 kind: Service 17 name: second 18 - ref: 19 apiVersion: serving.knative.dev/v1alpha1 20 kind: Service 21 name: third 22 reply: 23 kind: Sequence 24 apiVersion: messaging.knative.dev/v1alpha1 25 name: second-sequence
创建第 2 个 Sequence
使用 fourth->fifth->sixth Service 用于第 2 个 Sequence 调用处理,将执行结果发送给 event-display。
1apiVersion: messaging.knative.dev/v1alpha1 2kind: Sequence 3metadata: 4 name: second-sequence 5spec: 6 channelTemplate: 7 apiVersion: messaging.knative.dev/v1alpha1 8 kind: InMemoryChannel 9 steps: 10 - ref: 11 apiVersion: serving.knative.dev/v1alpha1 12 kind: Service 13 name: fourth 14 - ref: 15 apiVersion: serving.knative.dev/v1alpha1 16 kind: Service 17 name: fifth 18 - ref: 19 apiVersion: serving.knative.dev/v1alpha1 20 kind: Service 21 name: sixth 22 reply: 23 kind: Service 24 apiVersion: serving.knative.dev/v1alpha1 25 name: event-display
创建结果显示 Service
1apiVersion: serving.knative.dev/v1alpha1 2kind: Service 3metadata: 4 name: event-display 5spec: 6 template: 7 spec: 8 containerers: 9 - image: registry.cn-hangzhou.aliyuncs.com/knative-release/event_display:bf45b3eb1e7fc4cb63d6a5a6416cf696295484a7662e0cf9ccdf5c080542c21d
创建数据源指向第 1 个 Sequence
1apiVersion: sources.eventing.knative.dev/v1alpha1 2kind: CronJobSource 3metadata: 4 name: cronjob-source 5spec: 6 schedule: "*/1 * * * *" 7 data: '{"message": "Hello world!"}' 8 sink: 9 apiVersion: messaging.knative.dev/v1alpha1 10 kind: Sequence 11 name: first-sequence
示例结果

Broker/Trigger 场景
事件源 cronjobsource 向 Broker 发送事件,通过 Trigger 将这些事件发送到由 3 个 Service 调用的 Sequence 中。Sequence 处理完之后将结果事件发送给 Broker,并最终由另一个 Trigger 发送给 event-display Service 显示事件结果:

创建 Knative Service
同上创建 3 个 Knative Service,用于 Sequence 中服务处理。
1apiVersion: serving.knative.dev/v1alpha1 2kind: Service 3metadata: 4 name: first 5spec: 6 template: 7 spec: 8 containers: 9 - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 10 env: 11 - name: STEP 12 value: "0" 13 14--- 15apiVersion: serving.knative.dev/v1alpha1 16kind: Service 17metadata: 18 name: second 19spec: 20 template: 21 spec: 22 containers: 23 - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 24 env: 25 - name: STEP 26 value: "1" 27--- 28apiVersion: serving.knative.dev/v1alpha1 29kind: Service 30metadata: 31 name: third 32spec: 33 template: 34 spec: 35 containers: 36 - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 37 env: 38 - name: STEP 39 value: "2" 40 41---
创建 Sequence
创建 Sequence,这里依次顺序执行 first->second->third 这 3 个服务。将最终处理的结果发送到 broker-test 中。
1apiVersion: messaging.knative.dev/v1alpha1 2kind: Sequence 3metadata: 4 name: sequence 5spec: 6 channelTemplate: 7 apiVersion: messaging.knative.dev/v1alpha1 8 kind: InMemoryChannel 9 steps: 10 - ref: 11 apiVersion: serving.knative.dev/v1alpha1 12 kind: Service 13 name: first 14 - ref: 15 apiVersion: serving.knative.dev/v1alpha1 16 kind: Service 17 name: second 18 - ref: 19 apiVersion: serving.knative.dev/v1alpha1 20 kind: Service 21 name: third 22 reply: 23 kind: Broker 24 apiVersion: eventing.knative.dev/v1alpha1 25 name: default
创建事件源指向 Broker
创建 CronjobSource,它将每隔 1 分钟发送一条 {"message": "Hello world!"} 消息到 broker-test 中。
1apiVersion: sources.eventing.knative.dev/v1alpha1 2kind: CronJobSource 3metadata: 4 name: cronjob-source 5spec: 6 schedule: "*/1 * * * *" 7 data: '{"message": "Hello world!"}' 8 sink: 9 apiVersion: eventing.knative.dev/v1alpha1 10 kind: Broker 11 name: default
创建 Broker
创建默认 Broker:
kubectl label namespace default knative-eventing-injection=enabled
创建 Trigger 指向 Sequence
创建订阅事件类型为 dev.knative.cronjob.event 的 Trigger, 用于 Sequence 进行消费处理。
1apiVersion: eventing.knative.dev/v1alpha1 2kind: Trigger 3metadata: 4 name: sequence-trigger 5spec: 6 filter: 7 sourceAndType: 8 type: dev.knative.cronjob.event 9 subscriber: 10 ref: 11 apiVersion: messaging.knative.dev/v1alpha1 12 kind: Sequence 13 name: sequence
创建结果订阅 Trigger
创建订阅 samples.http.mod3 的事件类型 Trigger,将 Sequence 执行的结果发送给 event-display Service 进行显示。
1apiVersion: eventing.knative.dev/v1alpha1 2kind: Trigger 3metadata: 4 name: display-trigger 5spec: 6 filter: 7 sourceAndType: 8 type: samples.http.mod3 9 subscriber: 10 ref: 11 apiVersion: serving.knative.dev/v1alpha1 12 kind: Service 13 name: event-display 14--- 15apiVersion: serving.knative.dev/v1alpha1 16kind: Service 17metadata: 18 name: event-display 19spec: 20 template: 21 spec: 22 containers: 23 - image: registry.cn-hangzhou.aliyuncs.com/knative-release/event_display:bf45b3eb1e7fc4cb63d6a5a6416cf696295484a7662e0cf9ccdf5c080542c21d 24---
<a name="4ed65929-3"></a>
示例结果

小结
以上介绍了什么是 Sequence, 以及基于 Sequence 的 4 种使用场景,我们可以根据实际需求选择不同的使用场景,从而实现事件处理 Pipeline。这对于需要多步骤处理事件的场景尤为适合。<br />
欢迎加入 Knative 交流群
