Knative 基本功能深入剖析:Knative Eventing 之 Sequence 介绍

作者 | 元毅,阿里云容器平台高级开发工程师,负责阿里云容器平台 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 个部分:

  1. steps: 在 step 中定义了按照顺序执行的服务,每个服务会对应创建 Subscription;
  2. channelTemplate:指定了使用具体的那个 Channel;
  3. 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 交流群

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )