Kafka on Pulsar (KoP) 详解

Kafka on Pulsar 技术解析

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 概念
Topicpersistent://public/default/<topic>
PartitionPulsar 分区 Topic 的分区
Consumer GroupPulsar Subscription(订阅)
OffsetPulsar Cursor(游标)
BrokerPulsar Broker(KoP 协议层)
ZooKeeperPulsar 的 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 APIcreateTopics, 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

迁移步骤:
  1. 部署 KoP 插件
    在 Pulsar 集群中启用 KoP。

  2. 修改客户端配置
    bootstrap.servers 从 Kafka 地址改为 Pulsar Broker 的 9092 端口。

  3. 验证功能

    • 生产/消费是否正常
    • Consumer Group 是否正确
    • Offset 是否持久化
  4. 逐步迁移

    • 先迁移部分 Topic
    • 监控性能与延迟
    • 逐步切换所有应用
  5. (可选)后续演进

    • 将 Kafka Topic 逐步转为原生 Pulsar Topic
    • 使用 Pulsar 高级特性(Schema、Functions、分层存储)

八、KoP 的限制与注意事项

限制说明解决方案
不支持 Kafka StreamsKoP 仅支持 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,享受更强大、更云原生的消息平台。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值