Документы Knative Eventing немного сбивают с толку, когда дело касается различных поддерживаемых им методов доставки событий. Здесь говорится о брокерах событий и триггерах, а также говорится об источниках, услугах, каналах и подписки. Что и когда использовать? Не ясно. Давайте разберемся с этим.

Способы доставки

В Knative есть 3 различных метода:

  1. Простая доставка
  2. Комплексная доставка с дополнительным ответом
  3. Брокерская и триггерная доставка

Брокерская и триггерная доставка - это то, о чем вы должны заботиться большую часть времени. Тем не менее, простая и сложная доставка была в Knative некоторое время, и все еще полезно знать, что происходит под прикрытием.

Простая доставка

При простой доставке источник событий отправляет сообщения непосредственно в службу. Это 1: 1 без каких-либо гарантий доставки:

Например, вот CronJobSource, который запускает события по заданному расписанию cron, отправляя сообщения непосредственно в Knative Service:

apiVersion: sources.eventing.knative.dev/v1alpha1
kind: CronJobSource
metadata:
  name: source
spec:
  schedule: "* * * * *"
  data: '{"message": "Hello world from cron!"}'
  sink:
    apiVersion: serving.knative.dev/v1
    kind: Service
    name: service

Вы можете увидеть полный простой пример доставки в моем Knative Tutorial.

Комплексная доставка

Комплексная доставка позволяет гарантировать доставку с каналами и разветвлением 1: n с подписками.

Источник отправляет сообщение на канал. Это может быть канал в памяти или более постоянный канал, такой как канал Kafka:

apiVersion: sources.eventing.knative.dev/v1alpha1
kind: CronJobSource
metadata:
  name: source
spec:
  schedule: "* * * * *"
  data: '{"message": "Hello world from cron!"}'
  sink:
    apiVersion: messaging.knative.dev/v1alpha1
    kind: InMemoryChannel
    name: channel

Затем сервисы подключаются к каналу по подписке:

apiVersion: messaging.knative.dev/v1alpha1
kind: Subscription
metadata:
  name: subscription1
spec:
  channel:
    apiVersion: messaging.knative.dev/v1alpha1
    kind: InMemoryChannel
    name: channel
  subscriber:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: service1

Комплексная доставка также позволяет сервису отвечать на события другими событиями:

В этом случае Service2 отвечает на входящее событие другим событием, которое направляется в Service3 через другой канал и подписку. Ответы определяются как часть подписки:

apiVersion: messaging.knative.dev/v1alpha1
kind: Subscription
metadata:
  name: subscription2
spec:
  channel:
    apiVersion: messaging.knative.dev/v1alpha1
    kind: InMemoryChannel
    name: channel1
  subscriber:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: service2
  reply:
    ref:
      apiVersion: messaging.knative.dev/v1alpha1
      kind: InMemoryChannel
      name: channel2

Вы можете увидеть полные пример сложной доставки и сложную доставку с ответом в моем учебнике Knative.

Брокерская и триггерная доставка

Модель комплексной доставки работает, но сложно поддерживать несколько каналов, подписок и ответов. В нем также нет концепции фильтрации, поэтому службы должны сами фильтровать все сообщения.

Более простая модель для работы - это брокер и триггер. Брокер объединяет функции канала, ответа и фильтрации в одном ресурсе. Триггер обеспечивает декларативную фильтрацию всех событий.

В этом методе предыдущий пример превращается в это:

Брокер вводится в пространство имен сервисов и источников. Источник отправляет события брокеру:

apiVersion: sources.eventing.knative.dev/v1alpha1
kind: CronJobSource
metadata:
  name: source
spec:
  schedule: "* * * * *"
  data: '{"message": "Hello world from cron!"}'
  sink:
    apiVersion: eventing.knative.dev/v1alpha1
    kind: Broker
    name: default

Брокер поддерживается каналом. Сервисы регистрируют интерес к определенному типу событий с помощью триггера:

apiVersion: eventing.knative.dev/v1alpha1
kind: Trigger
metadata:
  name: trigger1
spec:
  filter:
    attributes:
      type: dev.knative.cronjob.event
  subscriber:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: service1

Под прикрытием триггер создает подписки. Любая служба может ответить на входящее событие. Событие ответа, направленное обратно через брокера и службы, заинтересованные в событии этого типа, получает событие:

apiVersion: eventing.knative.dev/v1alpha1
kind: Trigger
metadata:
  name: trigger3
spec:
  filter:
    attributes:
      type: dev.knative.samples.hifromknative
  subscriber:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: service3

Вы можете увидеть полный пример доставки через брокера и триггера в моем Knative Tutorial.

Как я упоминал ранее, в Knative Eventing вы обычно заботитесь только о брокере и триггере, но я надеюсь, что этот пост разъясняет различные методы доставки и то, что происходит под прикрытием.

Как всегда, не стесняйтесь обращаться ко мне в Twitter, если у вас есть какие-либо вопросы!