Pulsar 是一款分布式发布/订阅消息平台,近两年非常火,被称为下一代的消息流平台,大有取代 Kafka 的势头。今天我们就来比较一下 Pulsar 跟 Kafka。
图片来自 Pexels
Pulsar 源自 Yahoo,于 2016 年开源并捐献给 Apache 基金会,并在 2018 年 9 月升级成为 Apache 顶级项目。
Kafka 最初由 Linkedin 开发,并于 2010 年贡献给了 Apache 基金会,之后成为 Apache 顶级项目。
01
架构
①Kafka
Kafka 架构由 Broker 和 Zookeeper 组成,如下图: 注意:Kafka 2.8 版本可以不依赖 Zookeeper 独立运行了。②Pulsar
Pulsar 的架构如下:Pulsar Broker 会在本地缓存消息,并且支持 TTL。
从上面的两个架构图我们看到,Kafka 和 Pulsar 有三点不同:
-
Pulsar 采用分层架构,将计算和存储相分离,存储使用 BookKeeper 集群,计算使用 Broker 集群,Broker 需要内置 BookKeeper 客户端。
-
Pulsar 的部署和架构更加复杂,但是也更具有伸缩性。
-
Pulsar 在最新版本中依然不能脱离 Zookeeper 独立运行。
02
消息存储模型
①Kafka
Kafka 采用分区(Partition)的方式来保存 topic,模型图如下:每个 topic 都会在不同的 broker 保存多个分区副本,其中只有一个副本的分区是 leader 分区,供消费者使用。
如果某个 broker 宕机了,这个 broker 上的 leader 分区失效,需要在其他 broker 上重新进行选举。
②Pulsar
跟 Kafka 不同的是,Pulsar 的消息存储模型采用了分层的方式,如下图:
第一层是 Topic,用来存储 Producer 追加的 messages,Topic 下面是 ledger 层,保存了分片(Segment),分片里面保存更小粒度的 ertries,entries 存储一条条的 Message。
Bookkeeper 中,数据的最小操作单位是 Segment。Ledger 中的最后一个分片是最新写入的分片,如上图 Segment-2。
Segment-2 之前的所有分片已完成封装,这些分片的数据是不会再发生变化的。
这样增加或删除一个 BookKeeper 节点,或者迁移长期存储节点,都不会发生一致性问题。
03
消息消费模型
①Kafka
Kafka 的消费模型是采用消费者组的模式,每一个分区只能给消费者组中的一个消费者消费。如下图:
②Pulsar
Pulsar 的消费模型如下图:Pulsar 的 topic 是一种 partitioned topic,可以被保存到多个 broker,提高了 topic 的吞吐量。
Consumer 通过 Subscription 获取消息,同一 Topic 的 Subscription 可以获取到 Topic 数据的完整拷贝,这样 Subscription 为每一个 Consumer 分配一个 Cursor,Consumer 之间互不影响。
如下图:
Pulsar 的消费模型有四种:
独占模式(Exclusive):同一个 topic 只能有一个消费者订阅,如果多个消费者订阅,就会出错。灾备模式(Failover):同一个 topic 可以有多个消费者订阅,但是只能有一个消费者消费,其他订阅的消费者作为故障转移的消费者,只有当前消费者出了故障才可以进行消费当前的 topic。
如下图:
共享订阅(Shared):同一个 topic 可以由多个消费者订阅和消费。消息通过 round robin 轮询机制分发给不同的消费者,并且每个消息仅会被分发给一个消费者。当消费者断开,发送给它的没有被消费的消息还会被重新分发给其它存活的消费者。
如下图:
Key_Shared:消息和消费者都会绑定一个 key,消息只会发送给绑定同一个 key 的消费者。如果有新消费者建立连接或者有消费者断开连接,就需要更新一些消息的 key。
如下图:
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 和腾讯这样的集群体量。