Kafka on Pulsar(KoP) 是 Apache Pulsar 社区推出的一个重要插件,它允许 Kafka 客户端直接连接 Pulsar 集群,使用原生 Kafka 协议(Producer/Consumer API、Admin API)进行消息收发,而无需修改任何代码。
这为 从 Kafka 平滑迁移到 Pulsar 提供了无缝路径,是 Pulsar 兼容性与生态扩展的关键能力。
📘 Kafka on Pulsar (KoP) 详解
一、KoP 是什么?
KoP = Kafka on Pulsar
它是一个运行在 Pulsar Broker 上的 协议处理器(Protocol Handler),实现了 Kafka 协议栈,使得 Pulsar 能“伪装”成一个 Kafka 集群。
核心目标:
- ✅ 让 Kafka 客户端(Java、Go、Python 等)无需修改代码即可连接 Pulsar
- ✅ 降低从 Kafka 迁移到 Pulsar 的成本
- ✅ 复用 Kafka 生态工具(如 MirrorMaker、Kafka Connect、Kafka Streams)
- ✅ 享受 Pulsar 的高级特性(多租户、分层存储、Geo-Replication)
✅ 类比:MySQL 兼容模式的 PostgreSQL。
二、KoP 的工作原理
1. 架构图(文字描述)
+---------------------+
| Kafka Client |
| - 使用 kafka-clients |
| - 连接 pulsar:9092 |
+----------+----------+
|
v
+----------+----------+
| Pulsar Broker |
| - 内置 KoP 协议层 |
| - 监听 9092 端口 |
| - 将 Kafka 请求 |
| 转换为 Pulsar 操作 |
+----------+----------+
|
v
+----------+----------+
| Apache BookKeeper |
| - 持久化消息 |
+----------+----------+
|
v
+----------+----------+
| Apache ZooKeeper |
| - 存储元数据(Kafka 兼容)|
+---------------------+
2. 协议转换机制
| Kafka 概念 | 映射到 Pulsar 概念 |
|---|---|
Topic | persistent://public/default/<topic> |
Partition | Pulsar 分区 Topic 的分区 |
Consumer Group | Pulsar Subscription(订阅) |
Offset | Pulsar Cursor(游标) |
Broker | Pulsar Broker(KoP 协议层) |
ZooKeeper | Pulsar 的 ZooKeeper(存储 Kafka 元数据) |
✅ KoP 在 Pulsar 的
public/default命名空间下自动管理 Kafka Topic。
3. 请求处理流程
Kafka Producer.send()
↓
TCP 连接 KoP (9092)
↓
KoP 解析 Kafka 协议
↓
转换为 Pulsar Producer API
↓
写入 BookKeeper
↓
返回 Kafka ACK
Kafka Consumer.poll()
↓
KoP 查询 Pulsar Subscription 游标
↓
从 Pulsar 拉取消息
↓
转换为 Kafka 消息格式
↓
返回给 Consumer
✅ 对客户端完全透明。
三、KoP 的核心特性
| 特性 | 说明 |
|---|---|
| ✅ 零代码迁移 | Kafka 客户端无需修改 |
| ✅ 支持 Kafka 2.8+ 协议 | 包括事务、幂等、动态配置 |
| ✅ 支持 Kafka Admin API | createTopics, listTopics, describeConfigs 等 |
| ✅ 支持 Consumer Group 管理 | Offset 提交、Rebalance |
| ✅ 支持 SSL/SASL 认证 | 与 Pulsar 统一安全模型 |
| ✅ 支持多租户 | 可配置 Kafka Topic 映射到不同 Pulsar Tenant |
| ✅ 性能接近原生 Kafka | 延迟增加 < 1ms |
四、安装与配置 KoP
1. 下载 KoP 插件
# 下载 KoP NAR 包(以 3.0.0 为例)
wget https://github.com/streamnative/kop/releases/download/v3.0.0/kafka-protocol-handler-3.0.0.nar
# 放入 Pulsar 的 protocols 目录
cp kafka-protocol-handler-3.0.0.nar $PULSAR_HOME/protocols/
🔗 下载地址:KoP Releases
2. 启用 KoP(broker.conf)
# 启用协议处理器
protocolHandlerDirectory=./protocols
# 加载 KoP
messagingProtocols=kafka
# KoP 监听端口(Kafka 客户端连接此端口)
kafkaBrokerPort=9092
# Kafka 兼容的元数据存储(ZooKeeper)
kafkaZookeeperQuorum=localhost:2181
# 默认命名空间(Kafka Topic 映射到此 Namespace)
kafkaTenant=public
kafkaNamespace=default
# 是否自动创建 Topic
kafkaEnableAutoTopicCreation=true
# 批处理配置
kafkaBatchedMessageHoldMs=1
kafkaMaxBatchSize=65536
3. 启动 Pulsar Broker
bin/pulsar standalone # 或 bin/pulsar broker
KoP 会自动加载并监听
9092端口。
五、使用 Kafka 客户端连接 Pulsar
1. Java Kafka Producer 示例
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
Producer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("kop-topic", "Hello KoP"));
producer.close();
2. Java Kafka Consumer 示例
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "kop-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("enable.auto.commit", "false");
Consumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("kop-topic"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(1));
for (ConsumerRecord<String, String> record : records) {
System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
}
consumer.commitSync();
}
✅ 完全使用 Kafka 客户端,无需 Pulsar SDK!
六、管理 Kafka Topic(Admin API)
// 使用 Kafka AdminClient
Properties adminProps = new Properties();
adminProps.put("bootstrap.servers", "localhost:9092");
AdminClient admin = AdminClient.create(adminProps);
// 创建 Topic
NewTopic newTopic = new NewTopic("admin-topic", 4, (short) 1);
CreateTopicsResult result = admin.createTopics(Collections.singleton(newTopic));
result.all().get();
// 列出所有 Topic
ListTopicsResult topics = admin.listTopics();
topics.names().get().forEach(System.out::println);
✅ 所有 Kafka Admin 操作均支持。
七、迁移 Kafka 应用到 Pulsar
迁移步骤:
-
部署 KoP 插件
在 Pulsar 集群中启用 KoP。 -
修改客户端配置
将bootstrap.servers从 Kafka 地址改为 Pulsar Broker 的9092端口。 -
验证功能
- 生产/消费是否正常
- Consumer Group 是否正确
- Offset 是否持久化
-
逐步迁移
- 先迁移部分 Topic
- 监控性能与延迟
- 逐步切换所有应用
-
(可选)后续演进
- 将 Kafka Topic 逐步转为原生 Pulsar Topic
- 使用 Pulsar 高级特性(Schema、Functions、分层存储)
八、KoP 的限制与注意事项
| 限制 | 说明 | 解决方案 |
|---|---|---|
| ❌ 不支持 Kafka Streams | KoP 仅支持 Producer/Consumer | 使用 Flink 替代 |
| ❌ 不支持 MirrorMaker 2.0 | 依赖 Kafka Connect 框架 | 使用 Pulsar Source/Sink |
| ⚠️ Topic 映射固定 | 默认到 public/default | 可通过配置修改 |
| ⚠️ 性能略低于原生 Kafka | 协议转换开销 | 通常 < 1ms 延迟 |
| ⚠️ ZooKeeper 负担增加 | 存储 Kafka 元数据 | 监控 ZK 性能 |
九、最佳实践建议
| 实践 | 建议 |
|---|---|
| ✅ 生产环境启用 SSL | 防止明文传输 |
| ✅ 监控 9092 端口 | 连接数、吞吐、延迟 |
| ✅ 限制 Kafka Topic 数量 | 防止元数据爆炸 |
| ✅ 定期审计 Topic | 清理无用 Topic |
| ✅ 结合 Pulsar Manager | 查看 KoP Topic 状态 |
| ✅ 逐步迁移 | 先测试,再全量切换 |
✅ 总结
| 特性 | 说明 |
|---|---|
| ✅ 无缝兼容 | Kafka 客户端零代码接入 |
| ✅ 平滑迁移 | 降低从 Kafka 迁移到 Pulsar 的风险 |
| ✅ 复用生态 | 支持 Kafka 工具链 |
| ✅ 享受 Pulsar 优势 | 多租户、分层存储、Geo-Replication |
| ⚠️ 非完全替代 | 不支持 Kafka Streams 等高级组件 |
📌 一句话总结:
KoP 是“Kafka 协议的翻译器” —— 它让 Pulsar 能听懂 Kafka 的语言,使得数百万 Kafka 应用可以无缝迁移到 Pulsar,享受更强大、更云原生的消息平台。
Kafka on Pulsar 技术解析
489

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



