Pulsar 是一款分布式发布/订阅消息平台,近两年非常火,被称为下一代的消息流平台,大有取代 Kafka 的势头。今天我们就来比较一下 Pulsar 跟 Kafka。

你为什么要用Kafka,而不用Pulsar?_Kafka

图片来自 Pexels

Pulsar 源自 Yahoo,于 2016 年开源并捐献给 Apache 基金会,并在 2018 年 9 月升级成为 Apache 顶级项目。

Kafka 最初由 Linkedin 开发,并于 2010 年贡献给了 Apache 基金会,之后成为 Apache 顶级项目。

01

 架构

①Kafka

Kafka 架构由 Broker 和 Zookeeper 组成,如下图:

你为什么要用Kafka,而不用Pulsar?_Kafka_02

注意:Kafka 2.8 版本可以不依赖 Zookeeper 独立运行了。

 

②Pulsar

Pulsar 的架构如下:

你为什么要用Kafka,而不用Pulsar?_Kafka_03

Pulsar Broker 会在本地缓存消息,并且支持 TTL。

从上面的两个架构图我们看到,Kafka 和 Pulsar 有三点不同:

  • Pulsar 采用分层架构,将计算和存储相分离,存储使用 BookKeeper 集群,计算使用 Broker 集群,Broker 需要内置 BookKeeper 客户端。

  • Pulsar 的部署和架构更加复杂,但是也更具有伸缩性。

  • Pulsar 在最新版本中依然不能脱离 Zookeeper 独立运行。

02

 消息存储模型

①Kafka

Kafka 采用分区(Partition)的方式来保存 topic,模型图如下:你为什么要用Kafka,而不用Pulsar?_Kafka_04

每个 topic 都会在不同的 broker 保存多个分区副本,其中只有一个副本的分区是 leader 分区,供消费者使用。

 

如果某个 broker 宕机了,这个 broker 上的 leader 分区失效,需要在其他 broker 上重新进行选举。

 

②Pulsar

 

跟 Kafka 不同的是,Pulsar 的消息存储模型采用了分层的方式,如下图:你为什么要用Kafka,而不用Pulsar?_Kafka_05

第一层是 Topic,用来存储 Producer 追加的 messages,Topic 下面是 ledger 层,保存了分片(Segment),分片里面保存更小粒度的 ertries,entries 存储一条条的 Message。

Bookkeeper 中,数据的最小操作单位是 Segment。Ledger 中的最后一个分片是最新写入的分片,如上图 Segment-2。

 

Segment-2 之前的所有分片已完成封装,这些分片的数据是不会再发生变化的。

 

这样增加或删除一个 BookKeeper 节点,或者迁移长期存储节点,都不会发生一致性问题。

 

03

 消息消费模型

 

①Kafka

 

Kafka 的消费模型是采用消费者组的模式,每一个分区只能给消费者组中的一个消费者消费。如下图:你为什么要用Kafka,而不用Pulsar?_Kafka_06

②Pulsar

Pulsar 的消费模型如下图:

你为什么要用Kafka,而不用Pulsar?_Kafka_07

Pulsar 的 topic 是一种 partitioned topic,可以被保存到多个 broker,提高了 topic 的吞吐量。

Consumer 通过 Subscription 获取消息,同一 Topic 的 Subscription 可以获取到 Topic 数据的完整拷贝,这样 Subscription 为每一个 Consumer 分配一个 Cursor,Consumer 之间互不影响。

 

如下图:

你为什么要用Kafka,而不用Pulsar?_Kafka_08

Pulsar 的消费模型有四种:

独占模式(Exclusive):同一个 topic 只能有一个消费者订阅,如果多个消费者订阅,就会出错。灾备模式(Failover):同一个 topic 可以有多个消费者订阅,但是只能有一个消费者消费,其他订阅的消费者作为故障转移的消费者,只有当前消费者出了故障才可以进行消费当前的 topic。

 

如下图:

你为什么要用Kafka,而不用Pulsar?_Kafka_09

共享订阅(Shared):同一个 topic 可以由多个消费者订阅和消费。消息通过 round robin 轮询机制分发给不同的消费者,并且每个消息仅会被分发给一个消费者。

 

当消费者断开,发送给它的没有被消费的消息还会被重新分发给其它存活的消费者。

如下图:

你为什么要用Kafka,而不用Pulsar?_Kafka_10

Key_Shared:消息和消费者都会绑定一个 key,消息只会发送给绑定同一个 key 的消费者。如果有新消费者建立连接或者有消费者断开连接,就需要更新一些消息的 key。

 

如下图:

你为什么要用Kafka,而不用Pulsar?_Kafka_11

04

 多租户

 

①Pulsar

 

Pulsar 是一个多租户系统,租户可以跨集群分布,每个租户都可以有单独的认证和授权机制。租户也是存储配额、消息 TTL 和隔离策略的管理单元。

Pulsar 中 topic 的 URL 如下,可以看到租户是最基本的管理单位:

persistent://tenant/namespace/topic

上面的 URL 可以看到,Pulsar 通过 tenant 和 namespace 来支持多租户。

namespace 是一个术语,指租户的管理单元。同一个 namespace 上设置的配置策略适用于在 namespace 中创建的所有 topic。

Pulsar 为实例中的每个租户分配:

  • 授权机制

  • 适用于租户配置的集群配置

 

②Kafka

 

Kafka 为了控制客户端对 broker 资源的限制,从 0.9 版本引入了配额(quotas)管理,强制客户端请求使用配额。

 

目前 Kafka 支持两种类型的配额:

  • 网络带宽配额,用来定义 byte-rate 阈值(从 0.9 版本开始)

  • 请求速率配额,将 CPU 利用率阈值定义为网络和 I/O 线程的百分比(从 0.11 开始)

 

生产者和消费者有可能以很高的速率生产和消费大量的请求,从而垄断 broker 资源,导致网络饱和,最终影响到其他客户端和 broker 本身。使用配额可以防止这些问题,让集群体验更好。

 

05

 运维

①集群部署

 

Kafka 去除 Zookeeper 以后,部署是非常简单的。而 Pulsar 目前还没有去除 Zookeeper 的详细计划,而且需要使用到 BookKeeper 集群,部署复杂不少。

 

②扩容

 

Pulsar 支持自动负载均衡,这对于增加 broker 节点和增加存储节点都非常方便。

 

③云原生支持

 

Pulsar 计算和存储节点分离,对云原生支持很好。Kafka 多数组件也支持云原生。

 

④替换 broker

Pulsar 的 broker 节点是无状态的,替换时不用考虑数据丢失。

 

06

 社区

Pulsar 社区发展非常迅速,StreamNative 还推出了 StreamNative Hub 来支持 Pulsar 社区建设。

但 Pulsar 毕竟是一个新型的消息中间件,文档和社区都不太完善。在过去的一年多时间里,Pulsar 在这方面做了很多的努力,包括举办全球峰会,创作视频和培训教程,邀请专业讲师进行培训。

使用 Pulsar 时,遇到的一些问题可能在网上找不到答案,需要查找源代码来解决。这对于中小公司来说,无疑增加了使用成本。

而 Kafka 作为非常成熟中间件,用户遇到的问题也非常多,新用户可以很方便地从网上找到答案。

 

07

 总结

Pulsar 作为新型的云原生分布式消息流平台,确实有很多优秀的设计理念。

在 Yahoo 内部支持应用服务平台中 140 万个 topic,日处理消息超过 1000 亿条。腾讯的分布式交易引擎 TDXA 也使用了 Pulsar,应用于腾讯的计费平台。

Kafka 目前的使用场景最多的还是日志大数据处理,对金融场景的应用比较少。

但这并不能说明 Pulsar 可以取代 Kafka,Kafka 用户群体庞大,社区和资源完善,而且在 2.8 版本中去除了 Zookeeper,部署非常容易。毕竟不是每家公司都需要 Yahoo 和腾讯这样的集群体量。