订阅模型
Pulsar提供了灵活的消息模型,支持三种订阅类型:
- Exclusive subscription:排他,只能有一个Consumer,接收一个Topic所有的消息
- Shared subscription:共享,可以同时存在多个Consumer,每个Consumer处理Topic中一部消息(Shared模型是不保证消息顺序的,Consumer数量可以超过分区的数量)
-
Failover subscription:灾备模式,同一时刻只有一个有效的Consumer,其余的Consumer作为备用节点,在Master Consumer不可用后进行替代(看起来适用于数据量小,且解决单点故障的场景)
分区
为了解决吞吐等问题,Pulsar和Kafka一样,采用了分区(Partition)的机制。
Pulsar提供了一些策略来处理消息到Partition的路由(MessageRouter):
- Single partitioning:Producer随机选择一个Partition并将所有消息写入到这个分区
- Round robin partitioning :采用Round robin的方式,轮训所有分区进行消息写入
- Hash partitioning:这种模式每条消息有一个Key,Producer根据消息的Key的哈希值进行分区的选择(Key相同的消息可以保证顺序)。
默认
- Custom partitioning:用户自定义路由策略
持久化
Pulsar通过BookKeeper来存储消息,保证消息不会丢失
Pulsar采用“存储和服务分离”的两层架构(这是Pulsar区别于其他MQ系统最重要的一点,也是所谓的“下一代消息系统”的核心):
Broker:提供发布和订阅的服务(Pulsar的组件)
Bookie:提供存储能力(BookKeeper的存储组件)
通过两层架构使broker变成无状态,可以水平扩容。高可靠和一致性通过bookkeeper保证。
数据复制
- 采用ZooKeeper存储元数据,集群配置,作为协调器
-- local zk负责Pulsar Cluster内部的配置等
-- global zk则用于Pulsar Cluster之间的数据复制等 - 采用Bookie作为存储设备
- Broker负责负载均衡和消息的读取、写入等
- Global replicators负责集群间的数据复制
GEO-REPLICATION(地理复制)
多个Broker节点组成一个Pulsar Cluster;多个Pulsar Cluster组成一个Pulsar Instance。
Pulsar通过GEO-REPLICATION支持一个Instance内在不同的地域发送和消费消息。
在这个图中,每当 P1、P2 和 P3 的生产者分别向Cluster-A、Cluster-B和Cluster-C 中的T1 topic发送消息时,这些消息很快在不同的集群中复制,C1,C2可以在自己的集群内消费到所有的数据。