Pulsar Functions 是 Apache Pulsar 内置的轻量级、无服务器(Serverless)流处理框架,允许你在 Pulsar 集群内部直接对消息进行 简单的 ETL、过滤、转换、聚合、路由 等操作,无需引入外部流处理引擎(如 Flink、Spark Streaming)。
它填补了“消息传递”与“复杂流处理”之间的空白,是构建实时数据管道的理想工具。
📘 Pulsar Functions 详解
一、Pulsar Functions 的定位与优势
1. 定位:轻量级流处理(Lightweight Stream Processing)
| 场景 | 是否适合 Pulsar Functions |
|---|---|
| ✅ 简单 ETL(清洗、格式转换) | ✅ 推荐 |
| ✅ 消息过滤(按条件丢弃) | ✅ 推荐 |
| ✅ 消息路由(根据 Key 转发到不同 Topic) | ✅ 推荐 |
| ✅ 聚合(计数、求和) | ⚠️ 仅限低频、小窗口 |
| ✅ 复杂窗口计算、状态管理 | ❌ 建议用 Flink |
| ✅ 机器学习推理 | ✅ 可行(Go/Python) |
✅ 一句话定位:
“在消息流动过程中,做一点小加工”。
2. 核心优势
| 优势 | 说明 |
|---|---|
| ✅ 原生集成 | 与 Pulsar 深度集成,无需外部依赖 |
| ✅ 低延迟 | 处理在 Broker 侧或附近执行,延迟低 |
| ✅ 多语言支持 | Java、Python、Go |
| ✅ Serverless 模型 | 自动扩缩容,按需运行 |
| ✅ 轻量级 | 资源消耗小,适合边缘计算 |
| ✅ 与 Schema 无缝集成 | 支持类型安全处理 |
| ✅ 支持 Source/Sink 连接器 | 可与外部系统集成 |
二、Function 的核心概念
| 概念 | 说明 |
|---|---|
| Function | 一个处理逻辑单元,接收输入 Topic 消息,处理后输出到输出 Topic |
| Input Topic | 消费的消息来源(可以是多个) |
| Output Topic | 处理结果写入的目标 Topic |
| SerDe | 序列化/反序列化器(支持 Schema) |
| Processing Guarantee | 处理语义:ATLEAST_ONCE(默认)、EFFECTIVELY_ONCE |
| State Storage | 可选状态存储(基于 BookKeeper) |
三、编写 Function(多语言支持)
1. Java Function 示例:消息转换
public class TransformFunction implements Function<String, String> {
@Override
public String process(String input, Context context) {
// 将消息转为大写
return input.toUpperCase();
}
}
2. Python Function 示例:消息过滤
# filter_function.py
def process(input_data):
# 只转发包含 "ERROR" 的日志
if "ERROR" in input_data:
return input_data
else:
return None # 返回 None 表示不转发
3. Go Function 示例:路由
package main
import (
"context"
"strings"
"github.com/apache/pulsar/pulsar-function-go/pf"
)
func process(ctx context.Context, input []byte) error {
msg := string(input)
if strings.Contains(msg, "user") {
return pf.Publish(ctx, []byte(msg), "persistent://public/default/user-events")
} else {
return pf.Publish(ctx, []byte(msg), "persistent://public/default/system-events")
}
}
func main() {
pf.Start(process)
}
✅ 所有语言都支持 Context API,用于访问元数据、发布消息、访问状态等。
四、部署与管理 Function
1. 打包
- Java:JAR 文件(包含依赖)
- Python:ZIP 或单文件
- Go:可执行二进制
2. 使用 pulsar-admin 部署
# Java Function
pulsar-admin functions create \
--jar target/transform-function.jar \
--classname com.example.TransformFunction \
--inputs persistent://public/default/input-topic \
--output persistent://public/default/output-topic \
--name transform-fn
# Python Function
pulsar-admin functions create \
--py filter_function.py \
--classname filter_function \
--inputs persistent://public/default/logs \
--output persistent://public/default/errors \
--name error-filter
# Go Function
pulsar-admin functions create \
--go ./router-function \
--inputs persistent://public/default/events \
--name topic-router
3. 常用管理命令
# 列出所有 Function
pulsar-admin functions list
# 获取 Function 详情
pulsar-admin functions get --name transform-fn
# 更新 Function
pulsar-admin functions update --name transform-fn --parallelism 2
# 删除 Function
pulsar-admin functions delete --name transform-fn
# 触发 Function(测试用)
pulsar-admin functions trigger --name transform-fn --data "hello world"
# 查看 Function 状态(是否运行、实例数)
pulsar-admin functions get-status --name transform-fn
# 查看 Function 日志
pulsar-admin functions get-metrics --name transform-fn
五、运行模式(Runtime Modes)
Pulsar Functions 支持三种运行模式,适应不同部署环境:
| 模式 | 说明 | 适用场景 |
|---|---|---|
| Thread Mode | Function 作为线程运行在 Broker 内部 | 轻量级、低延迟,但影响 Broker 稳定性 |
| Process Mode | Function 作为独立进程运行在 Broker 节点上 | 隔离性好,推荐生产使用 |
| Kubernetes Mode | Function 作为 Pod 部署在 Kubernetes 集群中 | 云原生、弹性伸缩、多租户隔离 |
配置运行模式(functionsWorkerEnabled=true in broker.conf)
# 启用 Functions Worker
functionsWorkerEnabled=true
# 设置运行模式
functionRuntimeFactoryClassName=org.apache.pulsar.functions.runtime.thread.ThreadRuntimeFactory
# 或 process / kubernetes
✅ 生产环境推荐 Kubernetes Mode,实现完全隔离与弹性伸缩。
六、连接 Source 和 Sink(Pulsar IO)
Pulsar Functions 可通过 Connectors(Pulsar IO) 与外部系统集成。
1. Source(输入源)
- 从外部系统读取消息 → 写入 Pulsar Topic → 被 Function 消费。
- 支持:Kafka、JDBC、AWS Kinesis、RabbitMQ 等。
# 创建 Kafka Source
pulsar-admin sources create \
--source-type kafka \
--source-config-file kafka-source-config.yaml \
--tenant public \
--namespace default \
--name kafka-source \
--destination-topic-name kafka-input
2. Sink(输出目标)
- Function 处理结果 → 写入外部系统。
- 支持:Elasticsearch、JDBC、AWS S3、Cassandra 等。
# 创建 Elasticsearch Sink
pulsar-admin sinks create \
--sink-type elasticsearch \
--sink-config-file es-sink-config.yaml \
--inputs persistent://public/default/enriched-data \
--name es-sink
3. 构建完整数据流
Kafka → [Kafka Source] → Pulsar Topic → [Function: ETL] → Pulsar Topic → [Elasticsearch Sink] → ES
✅ 实现 无代码 ETL 管道。
七、高级功能
1. 状态管理(State)
public String process(String input, Context context) {
// 获取状态
Integer count = context.getState("count");
if (count == null) count = 0;
count++;
// 更新状态
context.putState("count", count);
return input + " [count=" + count + "]";
}
状态存储在 BookKeeper 中,支持容错。
2. 处理语义(Processing Guarantees)
--processing-guarantees ATLEAST_ONCE # 默认
--processing-guarantees EFFECTIVELY_ONCE # 需启用事务
3. Schema 支持
--inputs persistent://public/default/user-events \
--output persistent://public/default/enriched-users \
--custom-serde-inputs '{"user-events":"org.apache.pulsar.common.schema.SchemaInfo"}'
✅ 总结
| 特性 | 说明 |
|---|---|
| ✅ 轻量级 | 适合简单 ETL、过滤、路由 |
| ✅ 多语言 | Java、Python、Go |
| ✅ 运行模式灵活 | Thread / Process / Kubernetes |
| ✅ 与 Pulsar 深度集成 | 低延迟、高吞吐 |
| ✅ 支持 Source/Sink | 可构建完整数据管道 |
| ✅ 状态与 Exactly-Once | 支持有状态处理 |
📌 一句话总结:
Pulsar Functions 是“消息流水线上的小工兵” —— 它让你在消息流动过程中,轻松完成清洗、过滤、转换、路由等任务,是构建实时数据系统的“瑞士军刀”。
107

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



