这是我参与「第四届青训营」笔记创作活动的第12天
历史背景
Pulsar源自Yahoo,于2016年开源并捐献给Apache基金会,并在2018年9月升级成为Apache顶级项目。
Kafka最初由Linkedin开发,并于2010年贡献给了Apache基金会,之后成为Apache顶级项目。
架构
Kafka
Kafka架构由broker和zookeeper组成,如下图:
[1]
注意:Kafka2.8版本可以不依赖Zookeeper独立运行了\
Pulsar
Pulsar的架构如下:
Pulsar Broker会在本地缓存消息,并且支持TTL,\
从上面的2个架构我们看到,Kafka和Pulsar有3点不同:
- Pulsar采用分层架构,将计算和存储相分离,存储使用BookKeeper集群,计算使用Broker集群,Broker需要内置BookKeeper客户端。
- Pulsar的部署和架构更加复杂,但是也更具有伸缩性。
- Pulsar在最新版本中依然不能脱离Zookeeper独立运行。
消息存储模型
Kafka
Kafka采用分区(Partition)的方式来保存topic;
每个topic都会在不同的broker保存多个分区副本,其中只有一个副本的分区是leader分区,供消费者使用。如果某个broker宕机了,这个broker上的leader分区失效,需要在其他broker上重新进行选举。
Pulsar
跟Kafka不同的是,Pulsar的消息存储模型采用了分层的方式
[2]
第一层是Topic,用来存储Producer追加的messages,Topic下面是ledger层,保存了分片(Segment),分片里面保存更小粒度的ertries,entries存储一条条的Message。
Bookkeeper中,数据的最小操作单位是Segment。\
Ledger中的最后一个分片是最新写入的分片,如上图Segment-2。Segment-2之前的所有分片已完成封装,这些分片的数据是不会再发生变化的。这样增加或删除一个BookKeeper节点,或者迁移长期存储节点,都不会发生一致性问题。
消息消费模型
Kafka
Kafka的消费模型是采用消费者组的模式,每一个分区只能给消费者组中的一个消费者消费。
Pulsar的消费模型有4种:biji bi'ji笔记
-
独占模式(Exclusive):同一个topic只能有一个消费者订阅,如果多个消费者订阅,就会出错。
-
灾备模式(Failover):同一个topic可以有多个消费者订阅,但是只能有一个消费者消费,其他订阅的消费者作为故障转移的消费者,只有当前消费者出了故障才可以进行消费当前的topic。
-
共享订阅(Shared):同一个topic可以由多个消费者订阅和消费。 消息通过round robin轮询机制分发给不同的消费者,并且每个消息仅会被分发给一个消费者。 当消费者断开,发送给它的没有被消费的消息还会被重新分发给其它存活的消费者。
-
Key_Shared:消息和消费者都会绑定一个key,消息只会发送给绑定同一个key的消费者。如果有新消费者建立连接或者有消费者断开连接,就需要更新一些消息的key。