10.2. 使用频道

可以 sink 事件从一个事件源到一个 Knative Eventing 频道。频道是定义单一事件转发和持久层的自定义资源 (CR)。事件发送到某个频道后,可使用订阅将这些事件发送到多个 Knative 服务。

频道实例的默认配置在 default-ch-webhook ConfigMap 中定义。但是,开发人员仍可以通过实例化受支持的频道对象直接创建他们自己的频道。

10.2.1. 支持的频道类型

目前,作为 Knative Eventing 技术预览的一部分,OpenShift Serverless 只支持将 InMemoryChannel 类型频道。

10.2.2. 使用默认 InMemoryChannel 配置

InMemoryChannels 仅适用于开发环境,不应在生产环境中使用。

以下是 InMemoryChannel 类型频道的限制:

  • 没有可用的事件持久性。如果 Pod 停机,则 Pod 上的事件将会丢失。
  • InMemoryChannel 类型频道没有实现事件排序,因此同时接收到的两个事件可能会以任何顺序传送给订阅者。
  • 如果订阅者拒绝某个事件,就不会再重新发送尝试。如果存在 sink,则被拒绝的事件会被发送到一个 deadLetterSink。如果不存在,则被拒绝的事件将被丢弃。如需有关为频道配置事件交付和 deadLetterSink 设置的更多信息,请参阅,使用订阅从频道向 sink 发送事件

安装 Knative Eventing 时,会自动创建以下自定义资源定义(CRD):

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: knative-eventing
  name: config-br-default-channel
data:
  channelTemplateSpec: |
    apiVersion: messaging.knative.dev/v1
    kind: InMemoryChannel

使用集群默认配置创建频道

  • 创建通用频道自定义对象。

    apiVersion: messaging.knative.dev/v1
    kind: Channel
    metadata:
      name: example-channel
      namespace: default

    当 Channel 对象被创建后,会根据默认频道的实施,一个经过更改的准入 Webhook 会为 Channel 对象添加一组 spec.channelTemplate 属性。

    apiVersion: messaging.knative.dev/v1
    kind: Channel
    metadata:
      name: example-channel
      namespace: default
    spec:
      channelTemplate:
        apiVersion: messaging.knative.dev/v1
        kind: InMemoryChannel

然后,频道控制器将根据这个 spec.channelTemplate 配置创建后备频道实例。创建后,spec.channelTemplate 属性将无法更改,因为它们由默认频道机制设置,而不是由用户设置。

当使用此机制时,会创建两个对象,一个通用频道和一个 InMemoryChannel 类型频道。

通用频道充当将订阅复制到 InMemoryChannel 的代理,并设置它的状态来反映支持的 InMemoryChannel 类型频道的状态。

因为本示例中的频道是在 default 命名空间中创建的,所以频道会使用集群默认值,即 InMemoryChannel。