摘要: 在最新的 Knative Eventing 0.6 版本中新增了 Registry 特性, 为什么要增加这个特性, 该特性是如何实现的。针对这些问题,希望通过本篇文章给出答案。

背景

作为事件消费者,之前是无法事先知道哪些事件可以被消费,如果能通过某种方式获得哪些 Broker 提供哪些事件,那么事件消费者就能很方便通过这些 Broker 消费事件。Registry 就是在这样的背景下被提出的,通过 Registry 机制,消费者能针对特定的 Broker 的事件通过 Trigger 进行事件订阅消费。这里需要说明一下,Registry 设计与实现目前是针对 Broker/Trigger 事件处理模型。

诉求

  • 每个Registry 对应一个 Namespace 作为资源隔离的边界
  • Registry 中包括事件类型列表,以提供事件发现机制,通过事件列表,我们可以决定对哪些 Ready 的事件进行消费
  • 由于事件最终需要通过 Trigger 进行订阅,因此事件类型信息中需要包括创建 Trigger 所需要的信息。

实现

定义 EventType CRD 资源

定义 EventType 类型的CRD资源,示例yaml:

apiVersion: eventing.knative.dev/v1alpha1
kind: EventType
metadata:
name: com.github.pullrequest
namespace: default
spec:
type: com.github.pull_request
source: github.com
schema: //github.com/schemas/pull_request
description: "GitHub pull request"
broker: default

  • name: 设置时需要符合k8s命名规范
  • type:遵循CloudEvent 类型设置。
  • source: 遵循 CloudEvent source设置。
  • schema: 可以是JSON schema, protobuf schema等。可选项。
  • description: 事件描述,可选项。
  • broker: 所提供 EventType 的 Broker。

事件注册与发现

1.创建 EventType

一般我们通过以下两种方式创建 EventType 实现事件的注册。

1.1通过Event 事件源实例自动注册

基于事件源实例,通过事件源控制器创建 EventType 进行注册:

apiVersion: sources.eventing.knative.dev/v1alpha1
kind: GitHubSource
metadata:
name: github-source-sample
namespace: default
spec:
eventTypes:
- push
- pull_request
ownerAndRepository: my-other-user/my-other-repo
accessToken:
secretKeyRef:
name: github-secret
key: accessToken
secretToken:
secretKeyRef:
name: github-secret
key: secretToken
sink:
apiVersion: eventing.knative.dev/v1alpha1
kind: Broker
name: default

通过运行上面的yaml信息,通过GitHubSource 事件源控制器可以创建事件类型dev.knative.source.github.push以及事件类型dev.knative.source.github.pull_request这两个EventType进行注册,其中source为github.com以及名称为default的Broker。具体如下:

apiVersion: eventing.knative.dev/v1alpha1
kind: EventType
metadata:
generateName: dev.knative.source.github.push-
namespace: default
owner: # Owned by github-source-sample
spec:
type: dev.knative.source.github.push
source: github.com
broker: default
---
apiVersion: eventing.knative.dev/v1alpha1
kind: EventType
metadata:
generateName: dev.knative.source.github.pullrequest-
namespace: default
owner: # Owned by github-source-sample
spec:
type: dev.knative.source.github.pull_request
source: github.com
broker: default

这里有两点需要注意:

  • 通过自动生成默认名称,避免名称冲突。对于是否应该在代码(在本例中是GithubSource控制器)创建事件类型时生成,需要进一步讨论。
  • 我们给spec.type加上了dev.knative.source.github.前缀,这个也需要进一步讨论确定是否合理。

1.2手动注册

直接通过创建EventType CR资源实现注册,如:

apiVersion: eventing.knative.dev/v1alpha1
kind: EventType
metadata:
name: org.bitbucket.repofork
namespace: default
spec:
type: org.bitbucket.repo:fork
source: bitbucket.org
broker: dev
description: "BitBucket fork"

通过这种方式可以注册名称为org.bitbucket.repofork, type 为 org.bitbucket.repo:fork, source 为 bitbucket.org 以及属于dev Broker 的 EventType。

2.获取 Registry 的事件注册

事件消费者可以通过如下方式获取 Registry 的事件注册列表:
$ kubectl get eventtypes -n default

NAME                                         TYPE                                    SOURCE          SCHEMA                              BROKER     DESCRIPTION           READY   REASON
org.bitbucket.repofork org.bitbucket.repo:fork bitbucket.org dev BitBucket fork False BrokerIsNotReady
com.github.pullrequest com.github.pull_request github.com //github.com/schemas/pull_request default GitHub pull request True
dev.knative.source.github.push-34cnb dev.knative.source.github.push github.com default True
dev.knative.source.github.pullrequest-86jhv dev.knative.source.github.pull_request github.com default True

3.Trigger订阅事件

最后基于事件注册列表信息,事件消费者创建对应的Trigger对Registry中的EventType进行监听消费
Trigger示例:

apiVersion: eventing.knative.dev/v1alpha1
kind: Trigger
metadata:
name: my-service-trigger
namespace: default
spec:
filter:
sourceAndType:
type: dev.knative.source.github.push
source: github.com
subscriber:
ref:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
name: my-service

其它

针对 Registry,一般可能涉及到有如下问题:

  1. Registry 是对 Trigger 订阅事件,是否包括 Event Source 事件源的处理?
    答:Registry 设计的初衷主要是针对事件消费者能够发现事件并进行消费,因此它的出现主要是让用户创建Trigger进行事件订阅
  2. 如果仅仅创建 Event Source 通过Sink设置 KnService 进行事件消费(没有Trigger), 是否也可以使用Registry?
    答:Registry 的设计主要是针对 Broker/Trigger 事件处理模型, 并且我们可以发现 EventType 中的Broker字段是必需设置的。如果没有发送事件到Broker, 就不会创建EventType注册到Registry。在实现方面,我们可以检查Event Source的Sink类型是否是Broker,如果是,则对其注册EventType。
  3. 是否可以通过CloudEvents subject 字段过滤资源
    答:EventType CRD资源不会包含subject字段, 因为我们认为subject是更高级别的过滤设置。不过社区后续会通过高级过滤规则 进行实现。例如:
apiVersion: eventing.knative.dev/v1alpha1
kind: Trigger
metadata:
name: only-knative
spec:
filter:
cel:
expression: ce.subject.match("/knative/*")
subscriber:
ref:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
name: knative-events-processor


本文作者:元毅

原文链接

本文为云栖社区原创内容,未经允许不得转载。

Knative Eventing 中如何实现 Registry 事件注册机制的更多相关文章

  1. 事件监听:诀别Android繁琐的事件注册机制——view.setOnXXXXListener

    本版本为1.0,支持较少,使用不够方便.相关封装逻辑结构已升级至2.0,详情可参见:更完善的安卓事件监听实现 先简单扯两句这几天学习下来对java事件监听机制的一点感触.客观地讲,java的事件监听机 ...

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

    作者 | 元毅,阿里云容器平台高级开发工程师,负责阿里云容器平台 Knative 相关工作. 导读:在实际的开发中我们经常会遇到将一条数据需要经过多次处理的场景,称为 Pipeline.那么在 Kna ...

  3. TensorFlow中的设备管理——Device的创建与注册机制

    背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 作为一款优秀的异构深度学习算法框架,TensorFlow可以在多种设备上运行算 ...

  4. jQuery中四个绑定事件的区别 on,bind,live,delegate

    1.jQ操作DOM元素的绑定事件的四种方式       jQ中提供了四种事件监听方式,bind.live.delegate.on,对应的解除监听的函数分别是unbind,die,undelegate, ...

  5. Unity3.0基于约定的自动注册机制

    前文<Unity2.0容器自动注册机制>中,介绍了如何在 Unity 2.0 版本中使用 Auto Registration 自动注册机制.在 Unity 3.0 版本中(2013年),新 ...

  6. 初识Android触摸事件传递机制

    前言 今天总结的一个知识点是Andorid中View事件传递机制,也是核心知识点,相信很多开发者在面对这个问题时候会觉得困惑,另外,View的另外一个难题滑动冲突,比如在ScrollView中嵌套Li ...

  7. VBA中自定义类和事件的(伪)注册

    想了解一下VBA中自定义类和事件,以及注册事件处理程序的方法. 折腾了大半天,觉得这样的方式实在称不上“注册”,所以加一个“伪”字.纯粹是瞎试,原理也还没有摸透.先留着,有时间再接着摸. 做以下尝试: ...

  8. C#中的事件注册和注销

    C#中的事件注册和注销 由于.NET框架对消息循环机制进行了很好的封装,开发人员不再需要深入的了解Windows事件/消息实现的具体机制,也无需创建复杂的事件结构体和所谓的消息句柄.我们所要做的无非就 ...

  9. Spring 源码(8)Spring BeanPostProcessor的注册、国际化及事件发布机制

    上一篇文章https://www.cnblogs.com/redwinter/p/16198942.html介绍了Spring的注解的解析过程以及Spring Boot自动装配的原理,大概回顾下:Sp ...

随机推荐

  1. Linux安装Desktop 和 vncserver

    sudo su - #使用 root 账户 yum grouplist #查看所有可用的group yum groupinstall GNOME Desktop #安装 GNOME 桌面 yum -y ...

  2. node 和npm环境安装

    node 安装 1.下载node二进制文件 [root@baolin-images#>> ~]#wget https://nodejs.org/dist/v10.16.0/node-v10 ...

  3. git中由readme.md文件引发的问题

    在GitHub上建立一个仓库并且添加了readme.txt文件. 无论是push前先将远程仓库pull到本地仓库,还是强制push都会弹出这个问题. Github 禁用了TLS v1.0 and v1 ...

  4. 3_58 csapp 第三版的答案

    参考代码了http://blog.csdn.net/scf0920/article/details/77543294 3.58 看汇编写c代码 long decode(long x, long y,l ...

  5. leetcode 31-40 easy

    38.Count and Say The count-and-say sequence is the sequence of integers with the first five terms as ...

  6. openpyxl 模块的使用

    参考博客:https://www.cnblogs.com/anpengapple/p/6399304.html?utm_source=itdadao&utm_medium=referral 在 ...

  7. visual studio code 调试reactjs

    1.首先到visual studio code官网下载ide. 2.打开visual studio code,点击右侧菜单条的小图标 找到[Debugger for Chrome],并安装 3.打开c ...

  8. Codeforces Round #410 (Div. 2) A. Mike and palindrome【判断能否只修改一个字符使其变成回文串】

    A. Mike and palindrome time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  9. 帮助你构建云服务的开源平台:openstack

    from:http://os.51cto.com/art/201205/336386_all.htm 概念架构 3-5 OpenStack Compute服务架构 点评:从openstack的能力来看 ...

  10. java8的stream系列教程之filter过滤集合的一些属性

    贴代码 List<Student> lists = new ArrayList<>(); Student student = new Student(); student.se ...