最近这个 Apache Pulsar 消息中间件非常的火,号称云原生时代最能打的消息中件,今天,就一起来看看它到底有多牛逼?
Apache Pulsar是一个企业级的分布式消息系统,最初由Yahoo开发并在2016年开源,目前正在Apache基金会下孵化。Plusar已经在Yahoo的生产环境使用了三年多,主要服务于Mail、Finance、Sports、 Flickr、 the Gemini Ads platform、 Sherpa以及Yahoo的KV存储。Pulsar之所以能够称为下一代消息队列,主要是因为以下特性:
从最上层来看,一个Plusar单元由若干个集群组成,单元内的集群可以互相之间复制数据, plusar中通常有以下几种组件:
Pulsar 的 Server 端,用来处理 Producer 和 Consumer 的数据收发逻辑. 每个 Broker管理 topic 中的一些分区, 生产者和消费者连接到主题分区的所有者 Broker 发送消息或消费消息.plusar中的broker是一个无状态的节点,主要负责三件事情:
BookKeeper是一个可横向扩展的、错误容忍的、低延迟的分布式存储服务,BookKeeper中最基本的单位是记录,实际上就一个字节数组,而记录的数组称之为ledger,BK会将记录复制到多个bookies,存储ledger的节点叫做bookies,从而获得更高的可用性和错误容忍性。
Pulsar 中把每一个消息认为是存储在 Apache BookKeeper 中的分布式日志, 每个分布式日志又被分为多个 Segment 分段, 每个 Segment 分段在 Apache BookKeeper 中叫做一个 Ledger,并分散储在 BookKeeper 群集中的多个节点中.通过 Segment 分段的方式,主题分区中的消息可以均衡地分布在群集中的所有Bookie 中.并且所有的副本是对等的,客户端可以从任何一个 Bookie 的副本中读取消息. 数 据写入 Bookie 的一个基本过程:
我们知道Kafka在0.8版本之前是将消费进度存储到ZK中的,但是ZK本质上基于单个日志的中心服务,简单来讲,ZK的性能不会随着你增加更多的节点而线性增加,会只会相反减少,因为更多的节点意味着需要将日志同步到更多的节点,性能也会随之下降,因此QPS也会受单机性能影响,因此0.8版本之后就将消费进度存储到了Kafka的Topic中,而RocketMQ最初的版本也类似,有几种不同的实现例如ZK、数据库等,目前版本采用的是存储到本机文件系统中,而Plusar采用了和Kafka类似的思想,Plusar将消费进度也存储到了BK的ledger中。
发布订阅系统中最核心的概念是topic,简单来说,topic可以理解为一个管道,producer可以往这个管道丢消息,consumer可以从这个管道的另一端读取消息,但是这里可以有多个consumer同时从这个管道读取消息。
每个topic可以划分为多个分区,同一个topic下的不同分区所包含的消息都是不同的。每个消息在被添加到一个分区后都会分配一个唯一的offset,在同一个分区内消息是有序的,因此客户端可以根据比如说用户ID进行一个哈希取模从而使得整个用户的消息都发往整个分区,从而一定程度上避免race condition的问题。通过分区,将大量的消息分散到不同的节点处理从而获得高吞吐。默认情况下,plusar的topic都是非分区的,但是支持通过cli或者接口创建一定分区数目的topic。
Pulsar 是支持多租户(tenant)的,租户下面又分了命名空间(namespace). 所以 topic 的创建格式是/tenant/namespance/topic. 为了兼容kafka等消息中间件. pulsar预置了默认的租户和命名空间: pulibc/default. 举个例子,假设部署了一个 Pulsar 集群来支持多个应用程序,那么每个 tenant 都可以代表一个团队,一个核心的功能,或者一个产品线;一个 tenant 下面可以包含多个 namespace,例如,每个应用程序为一个 namespace; 一个 namespace 可以包含多个 Topic,如下图:
生产者, 负责将消息发送给 Broker 节点, 发送消息的过程如下:
订阅, 决定了消息具体是如何被分发到消费者的,Plusar支持几种不同的消费模式: exclusive、shared、failover。图示如下:
Pulsar作为下一代分布式消息队列,拥有非常多吸引人的特性,也弥补了一些其他竞品的短板,例如地域复制、多租户、扩展性、读写隔离等等.