pulsar vs kafka
消息模型
消息模型的要点:发布和订阅,ack,消息何时删除。
流模型和队列模型区别:消费方是否关心顺序
Kafka:流模式 RabbitMQ:共享队列,不保证顺序
Apache Bookkeeper
Kafka
- Consumer partition rebalance
Pulsar
pulsar是yahoo的项目。
几种消费模式:独占,failover,共享。对比kafka提供只独占,RabbitMQ只提供共享。
ack:有选择提交特性(提交一个特定的),独占和failover可以单个或者累积确认,共享只能选择提交。类似selective ack,不过是单点。而kafka只能累积确认(offset)。
pulsar实现的是游标的方式管理ack(游标如何实现单个确认?)。
消息保留:
- TTL:超出TTL才会被删除
- 没有TTL,等所有订阅(subscription)都确认了就可以删除
分层架构:有点类似mysql的存储引擎架构,存储借助bookkeeper实现多副本分布式一致性存储,一个具体的topic交给broker负责。
topic发生故障时,只需要把topic的控制权移交给其他节点,无须数据复制。
存储节点故障时,借助bookkeeper能够平滑切换。对比kafka需要partition备份完成后才能可用。
分区和分区路由:segment方式分片(简单理解为相比kafka的partition有更灵活的分片粒度控制),支持hash(保证有序)
持久化:
- broker写多个节点,大多数节点构成的quorum返回成功后才发ack给生产者。每个节点强制写日志到磁盘后才返回成功,断电也能保证不丢。
bookkeeper和broker都需要依赖zk:
对比:
总结卖点:
-
既能提供高性能的流模型(kafka拥有的),也能够提供队列模型(RabbitMQ提供的)
-
借助Bookkeeper实现存储的扩展(对比kafka受到单机partition的限制),这也是pulsar解决的kafka很难处理的问题(更好的存储能力)
-
借助分层架构实现处理能力的扩展(负责计算的broker和底层负责存储的bookkeepr分离,计算是无状态的可以水平扩展)
-
多租户,有业务(property)/命名空间(namespace)区分
-
查询:能够借助pulsar SQL查询,或者借助presto直接查询bookkeeper