Knative Eventing 中如何实现 Registry 事件注册机制
摘要: 在最新的 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,一般可能涉及到有如下问题:
- Registry 是对 Trigger 订阅事件,是否包括 Event Source 事件源的处理?
答:Registry 设计的初衷主要是针对事件消费者能够发现事件并进行消费,因此它的出现主要是让用户创建Trigger进行事件订阅 - 如果仅仅创建 Event Source 通过Sink设置 KnService 进行事件消费(没有Trigger), 是否也可以使用Registry?
答:Registry 的设计主要是针对 Broker/Trigger 事件处理模型, 并且我们可以发现 EventType 中的Broker字段是必需设置的。如果没有发送事件到Broker, 就不会创建EventType注册到Registry。在实现方面,我们可以检查Event Source的Sink类型是否是Broker,如果是,则对其注册EventType。 - 是否可以通过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 事件注册机制的更多相关文章
- 事件监听:诀别Android繁琐的事件注册机制——view.setOnXXXXListener
本版本为1.0,支持较少,使用不够方便.相关封装逻辑结构已升级至2.0,详情可参见:更完善的安卓事件监听实现 先简单扯两句这几天学习下来对java事件监听机制的一点感触.客观地讲,java的事件监听机 ...
- Knative 基本功能深入剖析:Knative Eventing 之 Sequence 介绍
作者 | 元毅,阿里云容器平台高级开发工程师,负责阿里云容器平台 Knative 相关工作. 导读:在实际的开发中我们经常会遇到将一条数据需要经过多次处理的场景,称为 Pipeline.那么在 Kna ...
- TensorFlow中的设备管理——Device的创建与注册机制
背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 作为一款优秀的异构深度学习算法框架,TensorFlow可以在多种设备上运行算 ...
- jQuery中四个绑定事件的区别 on,bind,live,delegate
1.jQ操作DOM元素的绑定事件的四种方式 jQ中提供了四种事件监听方式,bind.live.delegate.on,对应的解除监听的函数分别是unbind,die,undelegate, ...
- Unity3.0基于约定的自动注册机制
前文<Unity2.0容器自动注册机制>中,介绍了如何在 Unity 2.0 版本中使用 Auto Registration 自动注册机制.在 Unity 3.0 版本中(2013年),新 ...
- 初识Android触摸事件传递机制
前言 今天总结的一个知识点是Andorid中View事件传递机制,也是核心知识点,相信很多开发者在面对这个问题时候会觉得困惑,另外,View的另外一个难题滑动冲突,比如在ScrollView中嵌套Li ...
- VBA中自定义类和事件的(伪)注册
想了解一下VBA中自定义类和事件,以及注册事件处理程序的方法. 折腾了大半天,觉得这样的方式实在称不上“注册”,所以加一个“伪”字.纯粹是瞎试,原理也还没有摸透.先留着,有时间再接着摸. 做以下尝试: ...
- C#中的事件注册和注销
C#中的事件注册和注销 由于.NET框架对消息循环机制进行了很好的封装,开发人员不再需要深入的了解Windows事件/消息实现的具体机制,也无需创建复杂的事件结构体和所谓的消息句柄.我们所要做的无非就 ...
- Spring 源码(8)Spring BeanPostProcessor的注册、国际化及事件发布机制
上一篇文章https://www.cnblogs.com/redwinter/p/16198942.html介绍了Spring的注解的解析过程以及Spring Boot自动装配的原理,大概回顾下:Sp ...
随机推荐
- zabbix自定义监控redis
zabbix监控redis脚本 #!/bin/bash #此脚本用来获取redis-cli info信息 redis_cli="/usr/local/redis/bin/redis-cli& ...
- js封装ajax的方法
常用的ajax请求方法封装 /** * ajax请求的封装代码 */ function ajaxPost(url, params, cb) { $.ajax({ type : 'post', url ...
- cf round 480E The Number Games
题意:给一棵树,点$i$的点权是$2^i$,你需要删掉$k$个点,使得剩下的点连通的情况下剩下的点权值和最大. $k \leq n \leq 10^6$ 如果考虑删哪些点,是不好考虑的,会出问题. 反 ...
- LintCode刷题笔记-- Distinct Subsequences
标签:动态规划 题目描述: Given a string S and a string T, count the number of distinct subsequences of T in S. ...
- Statement对象
Statement 对象 创建 Statement 对象 在你准备使用 Statement 对象执行 SQL 语句之前,你需要使用 Connection 对象的 createStatement() 方 ...
- DirectX11笔记(三)--Direct3D初始化2
原文:DirectX11笔记(三)--Direct3D初始化2 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/article/ ...
- Ubuntu查找通过apt命令已安装软件
方法一 apt list --installed 方法二 dpkg -l
- laravel微信自定义分享
https://blog.csdn.net/weixin_41530218/article/details/80777036 今天接触到了微信分享,来记录一下自己所理解的一些逻辑,首先,我画了一个草图 ...
- JMeter 参数意义
样本数目:运行时得到的取样器响应结果个数 最新样本:最近一个取样器结果的响应时间 平均:所有取样器结果的响应时间平均值 偏离:所有取样器结果的响应时间标准差 吞吐量:每分钟响应的取样器结果个数 中值: ...
- JAVA-WEB-错误之-'OPTION SQL_SELECT_LIMIT=DEFAULT'
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version ...