Apache Pulsar 是一个分布式、可扩展、高性能的消息队列(MQ)和流处理平台,在设计上融合了 Kafka 的高吞吐能力 + RabbitMQ 的灵活性 + Pub/Sub 模式的强一致性。
一、Pulsar 是什么?
- 消息系统(Message Queue):支持队列模型(Queue)+ 发布订阅(Pub/Sub)
- 存算分离 架构:Brokers 负责接收发送,BookKeeper 负责数据持久化
- 原生支持多租户、地理多数据中心、分区、订阅模式
- 支持 高吞吐 + 低延迟 + 海量 Topic
二、核心架构图
Producer → Broker → BookKeeper ← Consumer
↑
Zookeeper(协调)
| 组件 | 功能说明 |
|---|
| Producer | 发送消息到 topic |
| Broker | 路由消息、维护元数据、管理连接 |
| BookKeeper | 存储消息日志(持久化层) |
| Consumer | 消费者读取消息 |
| Zookeeper | 负责元数据协调、管理服务发现和分区信息 |
三、Pulsar vs Kafka 区别
| 特性 | Pulsar | Kafka |
|---|
| 存储架构 | ✅ 存算分离(BookKeeper) | ❌ 计算和存储耦合 |
| 多租户支持 | ✅ 原生 | ⚠️ 需自己扩展 |
| 消费模型 | ✅ 多订阅模式(exclusive, shared) | 单订阅组 |
| Topic 数量支持 | ✅ 百万级(轻量) | ⚠️ 数千个后性能下降 |
| 延迟/吞吐 | 低延迟 / 高吞吐 | 高吞吐,但延迟稍高 |
| 消息确认机制(ack) | ✅ 精细控制 | ⚠️ 粗粒度 |
| 地理多中心复制(Geo Rep) | ✅ 原生 | ⚠️ 依赖 MirrorMaker |
| 消息回溯/延迟消息 | ✅ 支持 | Kafka 也支持(需要配置) |
👉 简言之:Pulsar 更现代、更灵活,更适合云原生和大规模多 Topic 的场景。
四、核心概念
| 概念 | 说明 |
|---|
| Tenant | 租户(多租户支持) |
| Namespace | 命名空间(隔离资源) |
| Topic | 消息通道,可分区、可复制 |
| Producer | 发送消息的客户端 |
| Consumer | 接收消息的客户端 |
| Subscription | 订阅名,控制消息消费进度 |
| Ack | 确认消费(支持单条或批量) |
| Retention | 消息保留策略 |
| Compaction | 消息压缩保留(last-value only) |
五、订阅模式(消费模型)
Pulsar 支持多种订阅方式,适配不同场景:
| 模式 | 特点说明 |
|---|
| Exclusive | 仅一个 consumer 能订阅该 subscription(强唯一) |
| Shared | 多个 consumer 共享消费,负载均衡 |
| Failover | 主备切换,类似 Kafka group |
| Key_Shared | 同一个 key 的消息只会被一个 consumer 处理(有序) |
六、开发示例(Java SDK)
引入依赖
<dependency>
<groupId>org.apache.pulsar</groupId>
<artifactId>pulsar-client</artifactId>
<version>3.2.0</version>
</dependency>
发送消息(Producer)
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar://localhost:6650")
.build();
Producer<String> producer = client.newProducer(Schema.STRING)
.topic("my-topic")
.create();
producer.send("Hello Pulsar");
producer.close();
client.close();
接收消息(Consumer)
Consumer<String> consumer = client.newConsumer(Schema.STRING)
.topic("my-topic")
.subscriptionName("my-subscription")
.subscriptionType(SubscriptionType.Shared)
.subscribe();
while (true) {
Message<String> msg = consumer.receive();
System.out.println("Received: " + msg.getValue());
consumer.acknowledge(msg);
}
七、管理工具
| 工具 | 说明 |
|---|
| Pulsar Admin CLI | 管理 topic、namespace、tenant、消息等 |
| Pulsar Dashboard | Web UI,可视化管理(需部署) |
| Pulsar Manager | 官方 Web 管理平台 |
| Prometheus + Grafana | 性能监控集成 |
八、云原生支持
- ✅ Kubernetes Operator:自动化部署
- ✅ 支持 Function(轻量计算逻辑)、Connector(数据源接入)
- ✅ 支持 Kafka 协议(使用 Pulsar-Kafka wrapper)
九、使用 Pulsar 的典型场景
| 场景 | 说明 |
|---|
| 高并发日志收集 | 比 Kafka 更低延迟、更高吞吐 |
| 多租户微服务间通信 | 支持 tenant、namespace 隔离 |
| 流计算、消息驱动架构 | 与 Flink / Spark 集成良好 |
| 事件驱动架构、分布式任务处理 | 支持延迟消息、精准 Ack |
| 地理多活、跨数据中心复制 | 支持 geo-replication |
十、总结一句话
Pulsar = Kafka + RabbitMQ + 云原生能力的融合体
性能强、功能全、架构现代,是下一代消息平台的有力选择。