Pulsar Functions 详解

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 ModeFunction 作为线程运行在 Broker 内部轻量级、低延迟,但影响 Broker 稳定性
Process ModeFunction 作为独立进程运行在 Broker 节点上隔离性好,推荐生产使用
Kubernetes ModeFunction 作为 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 是“消息流水线上的小工兵” —— 它让你在消息流动过程中,轻松完成清洗、过滤、转换、路由等任务,是构建实时数据系统的“瑞士军刀”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值