一、前言
Pulsar是由yahoo公司于2016年开源,2018年成为Apache的顶级项目,被誉为下一代的消息队列,业界之所以对其期望很高,pulsar具备了高吞吐,低延迟,计算存储分离,多租户,异地复制等特性。这些特性也使得Pulsar成为kafka的有力竞争者,国内的一些大厂也逐渐关注该组件,并在生产系统使用。下面我们开始介绍,对于一些架构特点和设计,和kafka进行比较。
二、架构
我们看下官网给的架构图,包含以下几部分:

Producer,生产者,封装消息,并将消息以同步或者异步的方式发送到broker。
Broker,broker负责消息的传输,topic的管理以及负载均衡,与其他消息队列组件不同,该broker不负责消息的存储,是个无状态组件。
Bookie,负责消息的的持久化,采用Apache BookKeeper组件,BookKeeper是一个分布式的WAL系统。
Consumer:消费者,以订阅主题的方式消费消息,并确认。Pulsar中还定义了Reader角色,也是一种消费者,区别在于,它可以从指定置位获取消息,且不需要确认。
ZK,负责集群的配置管理,包括租户,命名空间等,并进行一致性协调。
从架构上看,与kafka最大的不同点在于计算和存储分离。这种设计的好处是服务层和存储层可以独立扩展,提升了弹性的扩容。
三、生产消息
1、生产者创建
创建连接和生产者,需要指定以下必要的属性信息:
(1)Broker地址,一般是指定broker集群的域名地址,由集群重定向到某台具体broker上提供服务
(2)Topic信息,明确消息发送到哪个topic,topic由以下几个部分组成
{persistent|non-persistent}://tenant/namespace/topic
| Topic名称组成 | Description |
|---|---|
persistent / non-persistent |
用来标识 topic 的类型。 Pulsar 支持两种不同 topic:持久化和 非持久化型(如果你没有明确指定,topic 将会是默认的持久化类型)。 持久化 topic 的所有消息都会存储到硬盘上(除非是单机模式的broker,否则都是会在多块磁盘上)。非持久化 topic 的数据将不会存储到硬盘上。 |
tenant |
租户,Pulsa支持多租户,该topic所属的租户名 |
| namspace | 将相关联的 topic 作为一个组来管理,是管理 Topic 的基本单元。, 每个租户可以有多个命名空间。 |
topic |
主题名称 |
2、分区选择
除了普通的topic,Pulsar也支持分区topic,一个topic可以设置多个分区,那么在消息发送时如何路由到不同的分区,Pulsar支持三种路由模式。
(1)RoundRobinPartition,如果没有指定key,则以round-robin的方式路由到所有分区;如果指定key,则根据key做hash,散列到对应的分区上。
(2)SinglePartition,如果没有指定key,则随机选择一个分区,并发送所有消息;如果指定key,则根据key做hash,散列到对应的分区上。
(3)CustomPartition,使用自定义消息路由,可以定制消息进入特定的分区的策略。
3、消息发送
前面介绍生产者在创建的时候,配置的是集群的请求地址(比如‘pulsar://pulsar-cluster.acme.com:6650’),最终重定向到一个具体的broker地址上,这就涉及到寻址的过程(可以对比下kafka的元数据更新机制)。具体的步骤如下:

(1)客户端将尝试通过向服务器(Broker)发送 HTTP 查找请求,来确定主题(Topic)所在的服务器(Broker)。 通过查询Zookeeper中(缓存)的元数据,来确定这条消息的topic在哪个broker上,如果该topic不在任何一个broker上,则把这个topic分配在负载最少的broker上。
(2)当客户端获取了broker的地址之后,将会创建一个TCP连接(或复用连接池中的连接)并且进行鉴权。 客户端和broker通过该连接交换基于自定义协议的二进制命令。 同时,客户端会向broker发送一条命令用以在broker上创建生产者/消费者,该命令将会在验证授权策略后生效。
连接建立后,就可以开始发送消息。发送的模式有同步和异步两种:
同步发送,生产者发送消息后,等待broker的ack,如果没有接受到ack,则认为发送失败。
异步发送,生产者将消息发送到本地的阻塞队列,就立即返回,客户端将在后台将消息发送达到broker,队列的大小可以配置(配置MaxPendingMessages大小 )。发送完成后,将调用回调方法进行通知。
与kafka类似,生产者支持消息的批量发送。producer将会累积一批消息,然后通过一次请求发送出去。批处理的大小取决于设置的最大的消息数量及最大的发布延迟。
四、消息存储
Pulsar采用的是计算存储分离架构,broker并不持久化消息内容,可以认为是一个proxy层,实现类似kafka的client的一部分功能,broker是个无状态组件,消息内容实际存储在bookie中。broker实现topic的负载均衡,以及对外对提供读写接口,实现消息传输。
1、负载均衡
生产者在发送前,需要拿到Topic归属的broker,才能将消息发送到正确的broker上。那topic和broker的对应关系是如何维护和均衡的呢?
每个topic(分区)归属一个broker,此broker为该topic(分区)的所有者(ower),负责topic读写服务。topic(分区)发送变化,基于当前broker的负载状况,将topic(分区)动态分配到适合的broker。
实际实现中,Pu

本文深入剖析Pulsar消息队列系统,涵盖其架构、生产消息、消息存储、消息消费、可靠性设计、高吞吐设计、跨地域复制、多租户特性等方面,对比kafka,阐述Pulsar的独特优势。

5521

被折叠的 条评论
为什么被折叠?



