写点什么

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:5411354
用户头像
阿里云容器平台 ACK,企业云原生转型最佳搭档

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

关注

评论 1 条评论

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

正确选择数据库安全运维平台的几个原则-行云管家

行云管家

数据库 数据安全 数据库安全 安全运维

用大模型Prompt解决行业问题

百度开发者中心

大模型训练 Prompt

HarmonyOS音频开发指导:使用AVPlayer开发音频播放功能

HarmonyOS开发者

HarmonyOS

万字长文:拆解银行数智运营之困!

京东科技开发者

人工智能 数字化转型 金融 企业号10月PK榜

和鲸ModelWhale与中科可控X系列异构加速服务器完成适配认证,搭载海光芯片,构筑AI算力底座

ModelWhale

gpu 服务器 信创 算力 数据科学

C4D 2024插件:Arnold for mac(C4D S2024阿诺德渲染器) v4.6.6.1完美激活版

mac

苹果mac Windows软件 Arnold for Cinema 4D C4D R24插件

DAPP智能合约双币质押挖矿项目系统开发

l8l259l3365

管控变更对提升质量的重要性

老张

质量保障 配置管理

腾讯云入选2023 Gartner分布式混合基础设施魔力象限

Geek_2d6073

Loopback for Mac(音频路由和虚拟音频设备软件) v2.3.2直装激活版

mac

苹果mac Windows软件 Loopback 虚拟音频软件

在Vue中使用Mock.js虚拟接口数据实例详解

树上有只程序猿

Vue Mock.js

深入理解 Netty FastThreadLocal

vivo互联网技术

性能优化 Netty ThreadLocal 内存泄漏 FastThreadLocal

Mac电脑高效音频录制 Piezo 最新 for mac

mac大玩家j

Mac软件 音频录制软件 录音软件

不会写代码同学的福音——AI 代码生成器 Amazon CodeWhisperer(通过注释写代码)

亚马逊云科技 (Amazon Web Services)

人工智能 CodeWhisperer Amazon Lambda 云上探索实验室

社区团购,拯救消费降级的利器

用友BIP

社区团购

对话在行人|九州通:携手用友打造招聘共享中心实现招聘数智化

用友BIP

2023全球商业创新大会 对话在行人

峰会倒计时 3 天!互联网与文娱论坛演讲亮点预告!

SelectDB

数据库 大数据 数据仓库 实时数仓 apache doris

选择香港服务器发展线上业务的未来趋势:技术与市场的变化

一只扑棱蛾子

香港服务器

cpu温度监测推荐 Turbo Boost Switcher Pro激活最新版

胖墩儿不胖y

Mac软件 温度监测工具

哪家堡垒机支持国密算法?有哪些功能?

行云管家

运维 堡垒机 安全运维 国密浏览器 国密算法

产品需求交付质量保证的“七重门” | 京东云技术团队

京东科技开发者

测试 交付质量 企业号10月PK榜

高性能计算与多模态处理的探索之旅:英伟达GH200性能优化与GPT-4V的算力加速未来

GPU算力

即刻报名,企业服务与新经济论坛亮点提前揭秘!

SelectDB

数据库 大数据 数据仓库 实时数仓 apache doris

瑞技伙伴 | ZPE 带外管理方案,稳固您的IT世界

Bytebridge

数据中心 带外管理方案 ZPE

ABAQUS二次开发怎样接入Python代码?ABAQUS软件教程

思茂信息

abaqus abaqus软件 abaqus有限元仿真

中国水泥行业数字化采购:驱动产业链供应链现代化的关键

用友BIP

数智采购

研发日常踩坑-Mysql分页数据重复 | 京东云技术团队

京东科技开发者

MySQL 数据库 分页 企业号10月PK榜

云计算进入 AI 原生时代

Baidu AICLOUD

大模型 RDMA AI 原生云

即时通讯音视频开发(二十):一文读懂视频的颜色模型转换和色域转换

JackJiang

网络编程 即时通讯 IM

梦幻西游手游详细图文架设教程

echeverra

梦幻西游

IBM只有29%的职位看学历?基于技能的招聘到底是什么?

用友BIP

智能招聘

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