速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

  • 2019-09-04
  • 本文字数:7181 字

    阅读完需:约 24 分钟

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

在实际的开发中我们经常会遇到将一条数据需要经过多次处理的场景,称为 Pipeline。那么在 Knative 中是否也提供这样的能力呢?其实从 Knative Eventing 0.7 版本开始,就提供了 Sequence CRD 资源,用于事件处理 Pipeline。本篇文章中,阿里云容器平台高级开发工程师元毅将为大家详细介绍 Sequence 的定义及在 Knative Eventing 中提供的 4 种使用场景。

Sequence 定义

首先来看一下 Sequence Spec 定义:


apiVersion: messaging.knative.dev/v1alpha1kind: Sequencemetadata:  name: testspec:  channelTemplate:    apiVersion: messaging.knative.dev/v1alpha1    kind: InMemoryChannel  steps:    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: test  reply:    kind: Broker    apiVersion: eventing.knative.dev/v1alpha1    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 接收到事件之后会打印当前的事件处理信息。


apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata:  name: firstspec:  template:    spec:      containers:        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700          env:            - name: STEP              value: "0"
---apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata: name: secondspec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 env: - name: STEP value: "1"---apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata: name: thirdspec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 env: - name: STEP value: "2"---
复制代码


创建 Sequence

创建顺序调用 first->second->third Service 的 Sequence。


apiVersion: messaging.knative.dev/v1alpha1kind: Sequencemetadata:  name: sequencespec:  channelTemplate:    apiVersion: messaging.knative.dev/v1alpha1    kind: InMemoryChannel  steps:    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: first    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: second    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: third
复制代码


创建数据源

创建 CronJobSource 数据源,每隔 1 分钟发送一条事件消息 {"message": "Hello world!"} 到 Sequence 服务。


apiVersion: sources.eventing.knative.dev/v1alpha1kind: CronJobSourcemetadata:  name: cronjob-sourcespec:  schedule: "*/1 * * * *"  data: '{"message": "Hello world!"}'  sink:    apiVersion: messaging.knative.dev/v1alpha1    kind: Sequence    name: sequence
复制代码


示例结果




面向事件处理场景

事件源产生的事件直接发送给 Sequence 服务, Sequence 接收到事件之后顺序调用 Service 服务对事件进行处理,处理之后的最终结果会调用 event-display Service 显示:


创建 Knative Service

同上创建 3 个 Knative Service 用于事件处理:


apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata:  name: firstspec:  template:    spec:      containers:        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700          env:            - name: STEP              value: "0"
---apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata: name: secondspec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 env: - name: STEP value: "1"---apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata: name: thirdspec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 env: - name: STEP value: "2"---
复制代码

创建 Sequence

创建顺序调用 first->second->third Service 的 Sequence,将处理结果通过 reply 发送给 event-display


apiVersion: messaging.knative.dev/v1alpha1kind: Sequencemetadata:  name: sequencespec:  channelTemplate:    apiVersion: messaging.knative.dev/v1alpha1    kind: InMemoryChannel  steps:    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: first    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: second    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: third  reply:    kind: Service    apiVersion: serving.knative.dev/v1alpha1    name: event-display
复制代码

创建结果显示 Service

创建 event-display Service, 用于接收最终的结果信息。


apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata:  name: event-displayspec:  template:    spec:      containers:        - image: registry.cn-hangzhou.aliyuncs.com/knative-release/event_display:bf45b3eb1e7fc4cb63d6a5a6416cf696295484a7662e0cf9ccdf5c080542c21d
复制代码

创建数据源

创建 CronJobSource 数据源,每隔 1 分钟发送一条事件消息 {"message": "Hello world!"} 到 Sequence 服务。


apiVersion: sources.eventing.knative.dev/v1alpha1kind: CronJobSourcemetadata:  name: cronjob-sourcespec:  schedule: "*/1 * * * *"  data: '{"message": "Hello world!"}'  sink:    apiVersion: messaging.knative.dev/v1alpha1    kind: Sequence    name: sequence
复制代码

示例结果


级联 Sequence 场景

Sequence 更高级的地方还在于支持级联处理: Sequence By Sequence,这样可以进行多次 Sequence 处理,满足复杂事件处理场景需求。


创建 Knative Service

创建 6 个 Knative Service 用于事件处理, 前 3 个用于第 1 个 Sequence,后 3 个用于第 2 个 Sequence。


apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata:  name: firstspec:  template:    spec:      containers:        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700          env:            - name: STEP              value: "0"
---apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata: name: secondspec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 env: - name: STEP value: "1"---apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata: name: thirdspec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 env: - name: STEP value: "2"---apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata: name: fourthspec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 env: - name: STEP value: "3"
---apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata: name: fifthspec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 env: - name: STEP value: "4"---apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata: name: sixthspec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 env: - name: STEP value: "5"---
复制代码

创建第 1 个 Sequence

使用 first->second->third Service 用于第 1 个 Sequence 调用处理,将执行结果发送给第 2 个 Sequence。


apiVersion: messaging.knative.dev/v1alpha1kind: Sequencemetadata:  name: first-sequencespec:  channelTemplate:    apiVersion: messaging.knative.dev/v1alpha1    kind: InMemoryChannel  steps:    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: first    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: second    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: third  reply:    kind: Sequence    apiVersion: messaging.knative.dev/v1alpha1    name: second-sequence
复制代码

创建第 2 个 Sequence

使用 fourth->fifth->sixth Service 用于第 2 个 Sequence 调用处理,将执行结果发送给 event-display


apiVersion: messaging.knative.dev/v1alpha1kind: Sequencemetadata:  name: second-sequencespec:  channelTemplate:    apiVersion: messaging.knative.dev/v1alpha1    kind: InMemoryChannel  steps:    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: fourth    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: fifth    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: sixth  reply:    kind: Service    apiVersion: serving.knative.dev/v1alpha1    name: event-display
复制代码

创建结果显示 Service

apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata:  name: event-displayspec:  template:    spec:      containerers:        - image: registry.cn-hangzhou.aliyuncs.com/knative-release/event_display:bf45b3eb1e7fc4cb63d6a5a6416cf696295484a7662e0cf9ccdf5c080542c21d
复制代码

创建数据源指向第 1 个 Sequence

apiVersion: sources.eventing.knative.dev/v1alpha1kind: CronJobSourcemetadata:  name: cronjob-sourcespec:  schedule: "*/1 * * * *"  data: '{"message": "Hello world!"}'  sink:    apiVersion: messaging.knative.dev/v1alpha1    kind: Sequence    name: first-sequence
复制代码

示例结果


Broker/Trigger 场景

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


创建 Knative Service

同上创建 3 个 Knative Service,用于 Sequence 中服务处理。


apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata:  name: firstspec:  template:    spec:      containers:      - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700        env:        - name: STEP          value: "0"
---apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata: name: secondspec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 env: - name: STEP value: "1"---apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata: name: thirdspec: template: spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/probable-summer:2656f39a7fcb6afd9fc79e7a4e215d14d651dc674f38020d1d18c6f04b220700 env: - name: STEP value: "2"
---
复制代码

创建 Sequence

创建 Sequence,这里依次顺序执行 first->second->third 这 3 个服务。将最终处理的结果发送到 broker-test 中。


apiVersion: messaging.knative.dev/v1alpha1kind: Sequencemetadata:  name: sequencespec:  channelTemplate:    apiVersion: messaging.knative.dev/v1alpha1    kind: InMemoryChannel  steps:    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: first    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: second    - ref:        apiVersion: serving.knative.dev/v1alpha1        kind: Service        name: third  reply:    kind: Broker    apiVersion: eventing.knative.dev/v1alpha1    name: default
复制代码

创建事件源指向 Broker

创建 CronjobSource,它将每隔 1 分钟发送一条 {"message": "Hello world!"} 消息到 broker-test 中。


apiVersion: sources.eventing.knative.dev/v1alpha1kind: CronJobSourcemetadata:  name: cronjob-sourcespec:  schedule: "*/1 * * * *"  data: '{"message": "Hello world!"}'  sink:    apiVersion: eventing.knative.dev/v1alpha1    kind: Broker    name: default
复制代码

创建 Broker

创建默认 Broker:


kubectl label namespace default knative-eventing-injection=enabled
复制代码

创建 Trigger,指向 Sequence

创建订阅事件类型为 dev.knative.cronjob.event 的 Trigger, 用于 Sequence 进行消费处理。


apiVersion: eventing.knative.dev/v1alpha1kind: Triggermetadata:  name: sequence-triggerspec:  filter:    sourceAndType:      type: dev.knative.cronjob.event  subscriber:    ref:      apiVersion: messaging.knative.dev/v1alpha1      kind: Sequence      name: sequence
复制代码

创建结果订阅 Trigger

创建订阅 samples.http.mod3 的事件类型 Trigger,将 Sequence 执行的结果发送给 event-display Service 进行显示。


apiVersion: eventing.knative.dev/v1alpha1kind: Triggermetadata:  name: display-triggerspec:  filter:    sourceAndType:      type: samples.http.mod3  subscriber:    ref:      apiVersion: serving.knative.dev/v1alpha1      kind: Service      name: event-display---apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata:  name: event-displayspec:  template:    spec:      containers:        - image: registry.cn-hangzhou.aliyuncs.com/knative-release/event_display:bf45b3eb1e7fc4cb63d6a5a6416cf696295484a7662e0cf9ccdf5c080542c21d---
复制代码

示例结果


小结

以上介绍了什么是 Sequence, 以及基于 Sequence 的 4 种使用场景,我们可以根据实际需求选择不同的使用场景,从而实现事件处理 Pipeline。这对于需要多步骤处理事件的场景尤为适合。


作者介绍:


元毅,阿里云容器平台高级开发工程师,负责阿里云容器平台 Knative 相关工作。


相关文章:


《初识 Knative:跨平台的 Serverless 编排框架》


《Knative 初体验:Serving Hello World》


《Knative 初体验:Eventing Hello World》


《Knative 初体验:Build Hello World》


《Knative 初体验:CI/CD 极速入门》


《Knative 基本功能深入剖析:Knative Serving 的流量灰度和版本管理》


《Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler》


《Knative 基本功能深入剖析:Knative Serving 之服务路由管理》


《Knative 实践:从源代码到服务的自动化部署》


2019-09-04 10:5411332
用户头像
阿里云容器平台 ACK,企业云原生转型最佳搭档

发布了 43 篇内容, 共 23.4 次阅读, 收获喜欢 81 次。

关注

评论 1 条评论

发布
用户头像
您好 级联那个场景 好像放错了流程图
2019-12-03 20:25
回复
没有更多了
发现更多内容

深入理解Argo CD工作原理

快乐非自愿限量之名

k8s

第67期 | GPTSecurity周报

云起无垠

数据库运维实操优质文章文档分享(含Oracle、MySQL等) | 2024年8月刊

墨天轮

MySQL 数据库 oracle postgresql 国产数据库

企业智能之旅(4): 智能企业为生成式 AI 做好数据准备

亚马逊云科技 (Amazon Web Services)

陶建辉演讲干货分享,AI 时代下的数据预测和数据处理挑战

TDengine

tdengine

解锁精准电商营销新纪元:深度剖析京东商品详情API数据驱动的营销策略

代码忍者

api 网关 API 测试

企业出海网络方案,助力TikTok直播

Ogcloud

海外直播专线 tiktok运营 tiktok直播 tiktok直播专线 tiktok直播网络

携手浙商证券、华锐技术,共话交易技术的创新与应用

非凸科技

时隔七年重启编码人生,豆包MarsCode 让我快速回归 | MarsCoders 开发者说

豆包MarsCode

Python 人工智能 程序员 AI

增强洞察力,通过预测性规划引领企业走向光明未来

智达方通

全面预算管理 财务规划和分析 财务管理 财务转型

DApp开发入门指南:从概念到实践

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 NFT开发 代币开发

软件测试学习笔记丨Postman实战练习

测试人

软件测试

代币化资产如何拯救 DeFi:让金融重回价值创造的正轨

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 NFT开发 代币开发

Python将表格文件中某些列的数据整体向上移动一行

不在线第一只蜗牛

Python 机器学习 Excel

什么是 structuredClone?如何实现深拷贝?

伤感汤姆布利柏

李飞飞团队 ReKep:空间智能机器人可整合 GPT-4o;苹果首款 AI 手机 iPhone 16 发布丨RTE 开发者日报

声网

Docker 容器中镜像导出/导入

快乐非自愿限量之名

Docker 容器

云手机能否全面替代传统手机?深入探讨云手机的优缺点

Ogcloud

云手机 海外云手机 云手机海外版 云手机群控 手机群控

从 Greenplum 到 Databend,数据仓库的开源新选择

Databend

Python存储与读写二进制文件

EquatorCoco

Python

财务团队应如何推动企业创新升级和可持续发展

智达方通

团队协作 企业管理 战略规划 全面预算管理

软件测试学习笔记丨Charles 安装及证书配置

测试人

软件测试

淘宝API大全:淘宝商品详情数据接口

tbapi

淘宝商品详情数据接口 淘宝API接口

中国CRM的出路:先做好该做的

ToB行业头条

说说唯一ID与CAS|得物技术

得物技术

后端 分布式锁 一致性 无锁 企业号2024年8月PK榜

软件测试学习笔记丨Vim编辑器的常用命令

测试人

软件测试

企业智能之旅(3): 构建智能企业的文化、组织、人才与能力

亚马逊云科技 (Amazon Web Services)

面试官:如何实现线程池任务编排?

不在线第一只蜗牛

面试 线程池

Acrobat Pro DC 2021 (Win&Mac) 中文特别版

你的猪会飞吗

mac软件下载 Acrobat Pro DC mac mac破解软件下载

AI加持的云端IDE——三种方法高效开发前后端聊天交互功能

豆包MarsCode

人工智能 ide 程序员 AI 编程语言

低代码开发技术在农村现代化中的应用探索

EquatorCoco

低代码 数智化

Knative 基本功能深入剖析:Knative Eventing 之 Sequence 介绍_架构_阿里云容器平台_InfoQ精选文章