Serverless Eventing:探索 Pulsar 作为 Knative Eventing 的后端详解
在云原生架构中,事件驱动(Event-Driven Architecture, EDA) 已成为构建松耦合、高扩展性应用的核心范式。Knative Eventing 是 Kubernetes 上主流的 Serverless 事件管理平台,它提供了一套标准化的事件模型(CloudEvents)、事件源(Event Sources)、事件通道(Channels)和订阅(Subscriptions)。
而 Apache Pulsar 凭借其高吞吐、低延迟、多租户、持久化和跨地域复制等能力,正逐渐成为 Knative Eventing 的理想后端消息系统(Broker)。
本文将深入探讨如何将 Pulsar 作为 Knative Eventing 的 Channel Backend,实现高性能、可扩展的 Serverless 事件流处理。
一、Knative Eventing 架构回顾
Knative Eventing 的核心组件包括:
| 组件 | 作用 |
|---|---|
| Event Source | 产生事件(如 GitHub、Kafka、Timer) |
| Broker | 事件入口,接收并路由事件 |
| Trigger | 定义事件过滤与目标服务(Function/Service) |
| Channel | 事件的持久化队列(可选) |
| Subscription | 连接 Channel 与 Subscriber 的管道 |
🔁 事件流路径:
Source → Broker/Channel → Subscription → Trigger → Sink (Service/Function)
其中,Channel 是可插拔的消息中间件,Knative 支持多种 Channel 实现,如 InMemoryChannel、KafkaChannel、PulsarChannel。
二、为什么选择 Pulsar 作为 Knative 后端?
| 特性 | Pulsar 优势 | 对 Knative 的价值 |
|---|---|---|
| ✅ 高吞吐 & 低延迟 | 百万级 TPS,毫秒级延迟 | 支持高并发事件处理 |
| ✅ 持久化 & 重放 | 基于 BookKeeper 持久化 | 事件不丢失,支持回溯 |
| ✅ 多租户 & 隔离 | Namespace 级配额、ACL | 多团队/应用安全共用 |
| ✅ 跨地域复制 | Geo-replication | 多区域事件同步 |
| ✅ 灵活订阅模型 | Exclusive, Shared, Key_Shared, Failover | 支持多种消费语义 |
| ✅ 分层存储 | 冷热数据自动分层 | 长期事件归档 |
| ✅ 轻量级 Proxy | 统一接入、安全网关 | 简化 Knative 集成 |
🚀 相比 Kafka,Pulsar 更适合 Serverless 场景:更灵活的订阅模型、更低的运维复杂度、更强的多租户支持。
三、Pulsar 作为 Knative Channel Backend 的架构
+----------------+ +---------------------+
| Event Source | ----> | Knative Broker |
+----------------+ +----------+----------+
|
| (CloudEvent)
v
+-------------------------------+
| PulsarChannel (CRD) |
| - Topic: knative-broker-x |
| - Persistence: Pulsar |
+---------------+---------------+
|
| (Pulsar Protocol)
v
+-------------------------------+
| Apache Pulsar Cluster |
| - Broker |
| - BookKeeper (Storage) |
| - ZooKeeper (Coordination) |
+---------------+---------------+
|
| (Consumer)
v
+-----------+ +-----------+ +-------------+
| Service | | Function | | Operator |
| (Sink) | | (Sink) | | (Sink) |
+-----------+ +-----------+ +-------------+
- PulsarChannel:Knative 自定义资源(CRD),由 Pulsar Controller 管理
- Topic 映射:每个 Knative Broker 对应一个 Pulsar Topic(如
persistent://knative/channels/default-broker) - 事件路由:Trigger 通过 Subscription 订阅 Channel,由 Pulsar Consumer 拉取消息
四、部署 Pulsar 作为 Knative 后端
1. 前置条件
- Kubernetes 集群(v1.20+)
- Knative Serving & Eventing 已安装
- Apache Pulsar 集群可用(可本地或远程)
2. 安装 Pulsar Controller for Knative
使用官方或社区提供的 Pulsar Channel Controller:
# 克隆项目(示例:apache/pulsar-knative)
git clone https://github.com/apache/pulsar-knative.git
cd pulsar-knative
# 部署 Controller
kubectl apply -f config/
该 Controller 会监听 PulsarChannel CRD,并自动创建 Pulsar Topic。
3. 配置 Pulsar 连接信息
创建 Secret 存储 Pulsar 连接参数:
apiVersion: v1
kind: Secret
metadata:
name: pulsar-secret
namespace: knative-eventing
type: Opaque
data:
webServiceURL: cHVsc2FyOi8v<base64> # pulsar://pulsar-broker:8080
brokerServiceURL: cHVsc2FyOi8v<base64> # pulsar://pulsar-broker:6650
✅ 支持 TLS、认证(JWT/OAuth2)等高级配置。
4. 创建 PulsarChannel
apiVersion: messaging.knative.dev/v1
kind: PulsarChannel
metadata:
name: my-channel
namespace: default
spec:
persistence:
pulsar:
tenant: knative
namespace: channels
cluster: standalone
topic:
name: my-topic
retention:
time: "P7D" # 保留 7 天
size: "10GB"
Controller 会自动创建 Pulsar Topic:persistent://knative/channels/my-topic
五、使用 PulsarChannel 创建 Broker
apiVersion: eventing.knative.dev/v1
kind: Broker
metadata:
name: default
namespace: default
annotations:
# 指定使用 PulsarChannel
eventing.knative.dev/channel: "messaging.knative.dev/v1:PulsarChannel"
spec:
config:
apiVersion: messaging.knative.dev/v1
kind: PulsarChannel
name: my-channel
✅ 此 Broker 的所有事件将通过
my-channel持久化到 Pulsar。
六、定义 Trigger 与事件处理
apiVersion: eventing.knative.dev/v1
kind: Trigger
metadata:
name: handle-github
namespace: default
spec:
broker: default
filter:
attributes:
type: dev.knative.source.github.push
subscriber:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: github-handler
当 GitHub 事件到达 Broker 时:
- 被写入 Pulsar Topic
- Trigger 订阅该事件
- 事件被转发到
github-handlerServerless 函数
七、Pulsar 特性在 Knative 中的应用
1. 事件重放(Replay)
- 利用 Pulsar 的持久化能力,可重新消费历史事件
- 用于调试、数据修复、新服务初始化
2. 多订阅模型
- Exclusive:单实例处理(如状态机)
- Shared:负载均衡(如无状态函数)
- Key_Shared:按 key 分区处理(如用户会话)
3. 跨地域事件复制
# 在 Pulsar 中启用 geo-replication
pulsar-admin tenants create knative --allowed-clusters us-west,us-east
pulsar-admin namespaces set-clusters knative/channels --clusters us-west,us-east
- 实现多区域事件同步,支持灾备与就近处理
4. 分层存储(Tiered Storage)
pulsar-admin namespaces set-tiered-storage-threshold knative/channels --size 1G
- 超过 1GB 的数据自动归档到 S3/GCS
- 支持长期事件审计
八、监控与运维
1. 监控指标
- Knative:
event_count,event_processing_duration - Pulsar:
pulsar_broker_topic_backlog,pulsar_producer_rate,bookie_journal_write_latency
2. 日志收集
- 使用 Fluentd / Loki 收集 Pulsar 和 Knative 日志
- 关键日志:
pulsar-channel-controller,broker,trigger
3. 故障排查
- 事件丢失? 检查 Pulsar 持久化、Ack 策略
- 延迟高? 检查 Pulsar 写入延迟、GC、网络
- Consumer 未触发? 检查 Trigger 状态、Subscription
九、最佳实践
| 场景 | 建议 |
|---|---|
| 多租户环境 | 使用 Pulsar Tenant/Namespace 隔离 |
| 高吞吐事件流 | 启用批处理、压缩、多分区 Topic |
| 低延迟处理 | 使用 Key_Shared 订阅,避免排队 |
| 生产环境 | 部署 Pulsar Proxy,统一接入与安全控制 |
| Serverless 函数 | 使用 Knative Autoscaler 自动伸缩 |
十、总结
| 能力 | Pulsar + Knative 实现 |
|---|---|
| 事件持久化 | ✅ BookKeeper 保证不丢失 |
| 高吞吐处理 | ✅ 百万级 TPS 支持 |
| 灵活消费模型 | ✅ 多种订阅语义 |
| 跨区域复制 | ✅ Geo-replication |
| 长期归档 | ✅ 分层存储 |
| 安全隔离 | ✅ 多租户 ACL |
| Serverless 集成 | ✅ Knative Trigger 自动扩缩容 |
✅ Pulsar 作为 Knative Eventing 的后端,完美结合了 Serverless 的弹性与消息系统的可靠性,是构建现代云原生事件驱动架构的理想选择。
📌 附:开源项目推荐
- apache/pulsar-knative:官方 Pulsar Channel 实现
- knative/eventing:Knative Eventing 主仓库
- streamnative/pulsar-charts:Pulsar Helm Chart
549

被折叠的 条评论
为什么被折叠?



