CTO问我Pulsar到底能不能取代Kafka

本文对比了Pulsar与Kafka在历史背景、架构、消息存储与消费模型、多租户支持以及社区发展等方面的异同,探讨了Pulsar作为新兴力量挑战Kafka地位的可能性和各自的优劣势。

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

历史背景

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

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

架构

Kafka

Kafka架构由broker和zookeeper组成,如下图:

CTO问我Pulsar到底能不能取代Kafka

[1]

注意:Kafka2.8版本可以不依赖Zookeeper独立运行了

Pulsar

Pulsar的架构如下:

CTO问我Pulsar到底能不能取代Kafka

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

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

  • Pulsar采用分层架构,将计算和存储相分离,存储使用BookKeeper集群,计算使用Broker集群,Broker需要内置BookKeeper客户端。
  • Pulsar的部署和架构更加复杂,但是也更具有伸缩性。
  • Pulsar在最新版本中依然不能脱离Zookeeper独立运行。

消息存储模型

Kafka

Kafka采用分区(Partition)的方式来保存topic,模型图如下:

CTO问我Pulsar到底能不能取代Kafka

每个topic都会在不同的broker保存多个分区副本,其中只有一个副本的分区是leader分区,供消费者使用。如果某个broker宕机了,这个broker上的leader分区失效,需要在其他broker上重新进行选举。

Pulsar

跟Kafka不同的是,Pulsar的消息存储模型采用了分层的方式,如下图:

CTO问我Pulsar到底能不能取代Kafka

[2]

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

Bookkeeper中,数据的最小操作单位是Segment。

Ledger中的最后一个分片是最新写入的分片,如上图Segment-2。Segment-2之前的所有分片已完成封装,这些分片的数据是不会再发生变化的。这样增加或删除一个BookKeeper节点,或者迁移长期存储节点,都不会发生一致性问题。

消息消费模型

Kafka

Kafka的消费模型是采用消费者组的模式,每一个分区只能给消费者组中的一个消费者消费。如下图:

CTO问我Pulsar到底能不能取代Kafka

Pulsar

Pulsar的消费模型如下图:

CTO问我Pulsar到底能不能取代Kafka

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

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

CTO问我Pulsar到底能不能取代Kafka

Pulsar的消费模型有4种:

  • 独占模式(Exclusive):同一个topic只能有一个消费者订阅,如果多个消费者订阅,就会出错。
  • 灾备模式(Failover):同一个topic可以有多个消费者订阅,但是只能有一个消费者消费,其他订阅的消费者作为故障转移的消费者,只有当前消费者出了故障才可以进行消费当前的topic。如下图:
CTO问我Pulsar到底能不能取代Kafka

  • 共享订阅(Shared):同一个topic可以由多个消费者订阅和消费。消息通过round robin轮询机制分发给不同的消费者,并且每个消息仅会被分发给一个消费者。当消费者断开,发送给它的没有被消费的消息还会被重新分发给其它存活的消费者。如下图:
CTO问我Pulsar到底能不能取代Kafka

  • Key_Shared:消息和消费者都会绑定一个key,消息只会发送给绑定同一个key的消费者。如果有新消费者建立连接或者有消费者断开连接,就需要更新一些消息的key。如下图:
CTO问我Pulsar到底能不能取代Kafka

多租户

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本身。使用配额可以防止这些问题,让集群体验更好。

运维

集群部署

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

扩容

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

云原生支持

Pulsar 计算和存储节点分离,对云原生支持很好。

Kafka 多数组件也支持云原生。

替换broker

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

社区

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

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

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

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

总结

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

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

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

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

如果觉得本文对你有帮助,可以转发关注支持一下

### Apache Pulsar 和 Apache Kafka 的特性、性能和使用场景比较 #### 特性比较 Apache Pulsar 和 Apache Kafka 都是流行的事件流处理系统,但它们的设计哲学和技术架构有所不同。Pulsar 是一个分布式发布-订阅消息系统,而 Kafka 更侧重于流处理和数据管道构建。 - **架构设计**:Pulsar 采用分层架构,将存储和计算分离,这使得它能够更灵活地扩展[^3]。Kafka 的架构则是基于分区日志的模型,所有的消息都按顺序存储在磁盘上[^1]。 - **多租户支持**:Pulsar 原生支持多租户环境,允许不同的团队或项目在同一集群中运行而不互相干扰[^4]。Kafka 虽然也可以通过主题隔离实现多租户,但在资源管理和隔离方面不如 Pulsar 灵活[^5]。 - **持久性和可靠性**:两者都提供高持久性和可靠性保障,但 Pulsar 提供了更细粒度的消息确认机制(如 At-Least-Once、At-Most-Once 和 Exactly-Once),并且其 BookKeeper 存储层提供了更强的一致性保证[^6]。 #### 性能比较 性能是选择流处理平台时的重要考量因素之一。 - **吞吐量和延迟**:Kafka 在批量写入和读取操作中表现出色,尤其是在高吞吐量场景下。然而,Pulsar 的分层架构使其能够在低延迟场景中表现更好,尤其是在需要实时处理的应用中[^7]。 - **可扩展性**:Pulsar 的存储和计算分离设计使其更容易水平扩展,特别是在大规模部署时。Kafka 的扩展性也很好,但随着分区数量增加,管理复杂度会显著上升[^8]。 #### 使用场景比较 两者的适用场景各有侧重。 - **Kafka 的典型使用场景**: - 数据管道构建:Kafka 是构建企业级数据管道的理想选择,尤其适合需要高吞吐量和低延迟的数据传输场景[^1]。 - 流处理:结合 Kafka Streams 或其他流处理框架(如 Flink 和 Spark Streaming),Kafka 可以高效地处理实时数据流[^9]。 - **Pulsar 的典型使用场景**: - 多租户环境:Pulsar 的多租户特性使其非常适合云原生环境下的应用,尤其是需要隔离不同用户或项目的场景[^4]。 - 实时消息传递:Pulsar 的低延迟特性和灵活的订阅模式使其成为实时消息传递的理想选择[^10]。 #### 示例代码 以下是一个简单的 Pulsar 生产者和消费者的 Python 示例: ```python from pulsar import Client # 创建 Pulsar 客户端 client = Client('pulsar://localhost:6650') # 创建生产者 producer = client.create_producer('my-topic') # 发送消息 producer.send('Hello Pulsar'.encode('utf-8')) # 创建消费者 consumer = client.subscribe('my-topic', 'my-subscription') # 接收消息 msg = consumer.receive() print("Received message: '%s'" % msg.data().decode('utf-8')) consumer.acknowledge(msg) # 关闭客户端 client.close() ``` 以下是 Kafka 的简单生产者和消费者示例: ```python from kafka import KafkaProducer, KafkaConsumer # 创建 Kafka 生产者 producer = KafkaProducer(bootstrap_servers='localhost:9092') producer.send('my-topic', b'Hello Kafka') # 创建 Kafka 消费者 consumer = KafkaConsumer('my-topic', bootstrap_servers='localhost:9092', auto_offset_reset='earliest') # 接收消息 for message in consumer: print("Received message: '%s'" % message.value.decode('utf-8')) ``` ###
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值