Документы Knative Eventing немного сбивают с толку, когда дело касается различных поддерживаемых им методов доставки событий. Здесь говорится о брокерах событий и триггерах, а также говорится об источниках, услугах, каналах и подписки. Что и когда использовать? Не ясно. Давайте разберемся с этим.
Способы доставки
В Knative есть 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, если у вас есть какие-либо вопросы!