0%

[笔记] Apache Pulsar Versus Apache Kafka

只有33页的新书,可以从MemSQL上下载到。

Architecture

Kafka broker既负责处理请求,也负责存储数据,因此:

  • 它是有状态的,对新node接管有要求:要有一份replica。
  • 移动topic需要复制数据,因此rebalance也很复杂。
  • 请求处理的压力与存储空间的压力耦合在一块,没办法灵活扩容。
  • 扩容时容易出现配置不一致与容量异构,导致管理成本高。

Pulsar是计算存储分离的架构,存储层交给Apache BookKeeper,因此:

  • broker是无状态的,迁移不需要复制数据,rebalance也非常容易(有内置的load balancer)。
  • 基于BookKeeper,实现了分布式存储,数据更安全。
  • 计算与存储节点的扩容是独立的。

Replication Model

Kafka是leader-follwer模型,因此:

  • 不发生failover和新增topic的话节点的数据分布是静态的,新节点加入后没办法立即分担压力。

Pulsar是quorum-vote模型,因此:

  • 读写性能更好(压力更平均)。
  • 新节点加入后立即可以分担压力。
  • failover处理更简单(转交给BookKeeper处理)。

Pub-Sub Messaging

Kafka与Pulsar有着非常类似的Log Abstraction,它们在Pub-Sub方面的区别在于对Traditional Messaging的处理方式。

Queues and Competing Consumers

Kafka中一个topic可以有多个partition,message按round-robin或按key分派给某个partition。但一个partition只能对应一个consumer,多出来的consumer只能闲置。这样应用方需要提前确定好要多少个partition。另外,向consumer group新增consumer还会触发rebalance这个topic对应的所有consumer(为什么?),期间整个message投递都会暂停。

与传统的MessageQueue不同,Kafka不会重复向consumer投递未确认的message,需要应用方自己重试。

Pulsar中与consumer group类似的概念叫subscription。shared subscription就是competing consumers,但不需要有partition与consumer的对应关系。新增consumer也不会触发rebalance。Pulsar中有partition,但控制message消费的维度是subscription,而不是partition。

Pulsar的shared subscription支持:

  • 定期向consumer发送未确认的message。
  • 只确认单条message(对应确认某个offset之前的所有消息)。
  • 恢复单条message到未确认状态(允许这条message被其它人消费)。

Pulsar还支持其它subscription模式:

  • exclusive:对应topic只允许一个consumer。
  • failover:允许一个活跃的consumer和多个不活跃的consumer。
  • key_shared:对应key只允许一个consumer,这样能保序,且不需要引入partition。

结论:

  • Kafka可以用来实现work queue,但需要考虑的东西比较多。因此很多人另外使用传统的MQ来配合Kafka使用,这样增加了管理负担。
  • Pulsar既支持Kafka的功能,也支持MQ的功能,不需要管理两个系统。

Log Abstraction

Kafka中,每个topic是一个log流(应该是partition维度吧?),topic不能分裂成多个给多个broker,或使用同一broker的多块盘,因此无法无限增大,需要扩容时只能增加盘的大小,在用本地盘时是有上限的。在迁移topic时需要做大量的数据复制,而且热迁移的运维也非常复杂。

Pulsar中每个topic也是一个log流,但Pulsar把它分成了若干个segment,每个segment独立写入BookKeeper,这样整个log流的大小只受限于集群大小,在broker挂掉或新增时也不需要实际移动数据。另外不同segment分布在不同机器上,也加快了topic的恢复速度。

使用BookKeeper也增加了Pulsar的数据安全性:数据每写入BookKeeper成功时就确保落盘了,而Kafka是定期flush,有failover时很难避免丢数据。如果Kafka配置成每笔写都flush,性能就会受到很大影响。

得益于存储计算分离,Pulsar很容易就支持了分层存储,冷数据可以存到其它云存储介质中,进一步降低成本。另外应用可以因此做长时间的溯源,使用events来恢复最终状态。

Partitions

Kafka中每个topic都分为一个或多个partition,partition数量就是这个topic的消费并行度。

但随着软硬件性能的提升,现在一个topic可能只需要一个partition就可以满足性能需求了。但在Kafka中一个partition就只能对应一个consumer。

Kafka中可以增加partition(如果是按key划分的partition,会导致相同key的message在增加前后落到不同的partition上,影响保序性),但不可以减少partition。

Pulsar中partition是可选的,可以不用partition而支持多个consumer。使用partition是为了增加性能,或需要按key保序消费message。producer可以向topic投递,也可以直接向某个partition投递。consumer同理。与Kafka相同,Pulsar中partition也是只能增加不能减少。

结论:Pulsar中可以像Kafka那样使用partition,但不用一上来就必须了解partition,这样显著降低了学习成本。

Performance

GigaOm的一份报告显示:

  • Pulsar的吞吐上限比Kafka高出150%。
  • Pulsar的延时比Kafka低40%,且一致性等级更高。
  • 得益于更好的伸缩性,Pulsar在不同的message大小和partition数量下有着一致的结果。

另一份基于OpenMessage的报告有类似的结论。

Tenancy

Pulsar有namespace和ACL,支持多租户。Kafka不支持多租户,不同团队使用同一个Kafka集群时需要协调好。

Geo-Replication

Geo-replication是Pulsar一开始设计时就考虑到的功能。Pulsar中可以按namespace打开或关闭geo-replication,可以配置哪些topic可以或不可以replicate。producer还可以指定跳过哪些data center。

Pulsar支持多种拓扑:active-standby、active-active、full-mesh、edge aggregation。

Kafka中可以用MirrorMaker来做geo-replication,它是将一个data center的consumer和另一个data center的producer链接起来,不能动态配置,也不支持在两个data center间同步配置或subscription。

另一个工具是Uber的uReplicator,它比MirrorMaker更好用,但本身是一个单独集群,有管理成本。

Kafka也有商用方案,如Confluent Replicator。

结论:Pulsar内置对geo-replication的良好支持,Kafka需要使用外部工具,且运维负担重。

Ecosystem

Kafka本身是ASF控制的,但它的很多第三方工具由大公司控制,未来有开源协议变动的风险。

Pulsar本身和主要工具都是由ASF控制的,未来协议变动的风险非常低。

Summary

两个系统的对比:

Dimension Kafka Pulsar
Architectural components ZooKeeper, Kafka broker ZooKeeper, Pulsar broker, BookKeeper
Replication model Leader–follower Quorum-vote
High-performance pub–sub messaging Supported Supported
Message replay Supported Supported
Competing consumers Supported with limitations Supported
Traditional consuming patterns Not supported Supported
Log abstraction Single node Distributed
Tiered storage Not supported Supported
Partitions Required Optional
Performance High Higher
Geo-replication Available through tool or external projects Built-in
Community and related projects Large and mature Small and growing
Open source Mixture of ASF and others All ASF

(附另一组对比:Kafka vs. Pulsar vs. RabbitMQ: Performance, Architecture, and Features Compared