Knative Eventing 中如何实现 Registry 事件注册机制
背景
作為事件消費者,之前是無法事先知道哪些事件可以被消費,如果能通過某種方式獲得哪些 Broker 提供哪些事件,那么事件消費者就能很方便通過這些 Broker 消費事件。Registry 就是在這樣的背景下被提出的,通過 Registry 機制,消費者能針對特定的 Broker 的事件通過 Trigger 進行事件訂閱消費。這里需要說明一下,Registry 設(shè)計與實現(xiàn)目前是針對 Broker/Trigger 事件處理模型。
訴求
- 每個Registry 對應(yīng)一個 Namespace 作為資源隔離的邊界
- Registry 中包括事件類型列表,以提供事件發(fā)現(xiàn)機制,通過事件列表,我們可以決定對哪些 Ready 的事件進行消費
- 由于事件最終需要通過 Trigger 進行訂閱,因此事件類型信息中需要包括創(chuàng)建 Trigger 所需要的信息。
實現(xiàn)
定義 EventType CRD 資源
定義 EventType 類型的CRD資源,示例yaml:
apiVersion: eventing.knative.dev/v1alpha1 kind: EventType metadata:name: com.github.pullrequestnamespace: default spec:type: com.github.pull_requestsource: github.comschema: //github.com/schemas/pull_requestdescription: "GitHub pull request"broker: default- name: 設(shè)置時需要符合k8s命名規(guī)范
- type:遵循CloudEvent 類型設(shè)置。
- source: 遵循 CloudEvent source設(shè)置。
- schema: 可以是JSON schema, protobuf schema等。可選項。
- description: 事件描述,可選項。
- broker: 所提供 EventType 的 Broker。
事件注冊與發(fā)現(xiàn)
1.創(chuàng)建 EventType
一般我們通過以下兩種方式創(chuàng)建 EventType 實現(xiàn)事件的注冊。
1.1通過Event 事件源實例自動注冊
基于事件源實例,通過事件源控制器創(chuàng)建 EventType 進行注冊:
通過運行上面的yaml信息,通過GitHubSource 事件源控制器可以創(chuàng)建事件類型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: defaultowner: # Owned by github-source-sample spec:type: dev.knative.source.github.pushsource: github.combroker: default --- apiVersion: eventing.knative.dev/v1alpha1 kind: EventType metadata:generateName: dev.knative.source.github.pullrequest-namespace: defaultowner: # Owned by github-source-sample spec:type: dev.knative.source.github.pull_requestsource: github.combroker: default這里有兩點需要注意:
- 通過自動生成默認名稱,避免名稱沖突。對于是否應(yīng)該在代碼(在本例中是GithubSource控制器)創(chuàng)建事件類型時生成,需要進一步討論。
- 我們給spec.type加上了dev.knative.source.github.前綴,這個也需要進一步討論確定是否合理。
1.2手動注冊
直接通過創(chuàng)建EventType CR資源實現(xiàn)注冊,如:
通過這種方式可以注冊名稱為org.bitbucket.repofork, type 為?org.bitbucket.repo:fork, source 為?bitbucket.org?以及屬于dev?Broker 的 EventType。
2.獲取 Registry 的事件注冊
事件消費者可以通過如下方式獲取 Registry 的事件注冊列表:
$ kubectl get eventtypes -n default
3.Trigger訂閱事件
最后基于事件注冊列表信息,事件消費者創(chuàng)建對應(yīng)的Trigger對Registry中的EventType進行監(jiān)聽消費
Trigger示例:
其它
針對 Registry,一般可能涉及到有如下問題:
答:Registry 設(shè)計的初衷主要是針對事件消費者能夠發(fā)現(xiàn)事件并進行消費,因此它的出現(xiàn)主要是讓用戶創(chuàng)建Trigger進行事件訂閱
答:Registry 的設(shè)計主要是針對 Broker/Trigger 事件處理模型, 并且我們可以發(fā)現(xiàn) EventType 中的Broker字段是必需設(shè)置的。如果沒有發(fā)送事件到Broker, 就不會創(chuàng)建EventType注冊到Registry。在實現(xiàn)方面,我們可以檢查Event Source的Sink類型是否是Broker,如果是,則對其注冊EventType。
答:EventType CRD資源不會包含subject字段, 因為我們認為subject是更高級別的過濾設(shè)置。不過社區(qū)后續(xù)會通過高級過濾規(guī)則?進行實現(xiàn)。例如:
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的Knative Eventing 中如何实现 Registry 事件注册机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 隐私与AI兼得,蚂蚁金服是如何做到的?
- 下一篇: 阿里HBase高可用8年“抗战”回忆录