Pulsar 项目于 2012 年在 Yahoo 内部启动,最早的目标是在 Yahoo 内部构架一套多租户、跨机房、可扩展和高可用的统一的消息平台,用于支持 Yahoo 内部不同的使用场景。在经历了三四年生产线的磨砺,Pulsar 成功地支撑了 Yahoo 内部的许多 mission-criticial 的应用,比如 Yahoo Finance,Yahoo Mail,Yahoo Sports 以及相应的广告平台。Yahoo 于 2016 年底将 Pulsar 开源,并于 2017 年六月正式将其捐献给 Apache 软件基金会进行孵化。
Apache Pulsar,相对其他传统消息中间件系统,有着根本性的不同。这些不同可以囊括为以下几点:
在消息模型和 API 层面上,Pulsar 基于日志这个存储抽象,统一了消息队列(Queue)和流处理(Streaming)这两种经典的消息中间件应用场景。用户只需要使用一套系统,通过不同的订阅(Subscription)模式,即可支持不同的应用场景,从根本上打通了应用和服务之间的数据孤岛,从而实现真正意义上的数据”中台“。
在架构层面上,Pulsar 使用了最前沿的将计算和存储相互分离的思路,将传统的消息中继(Broker)和消息存储(Storage)分开,从而将原有的消息中继(Broker)变成一层无状态化的服务层。将 Broker 变成无状态化之后,Broker 和存储可以相互独立扩展,同时 Broker 的失效恢复可以在极短的时间内完成,从而大大提高了服务的可用性。而且这种分层架构也让 Pulsar 可以很容易部署在 Kubernetes 这样的容器编排环境里面,最高效地使用云原生的基础架构。
在存储层面上,Pulsar 使用 Apache BookKeeper 作为其日志存储系统,将存储粒度从传统的分区粒度,拉低到了分片(Segment)粒度。一旦存储粒度被细分之后,分区不再是物理绑定的了。分区更多的是逻辑层面上的概念,一个分区可以被切分成细粒度的分片,均匀打散到整个集群中;从而极大程度上最大化了数据放置的可能性,也降低了进行集群扩容、故障恢复等操作带来的复杂性。
也正是因为 Pulsar 在 API 模型、架构设计和存储设计上最有独天得厚的优越性,使得 Pulsar 在进行 Apache 孵化后,可以从最开始的 Pub-Sub 消息中间件快速迭代演化成为了流原生的数据平台。Pulsar 对于流原生的支持主要包括以下重要的 Feature。
首先是 Pulsar Functions,一套基于无服务器化(Serverless)的轻量级计算框架。这套计算框架为数据科学家提供了最为简便的方式进行流计算逻辑的编写。学习成本基本为零,只要能写 Java 或者 Python 的函数,就可以编写在 Pulsar 进行流计算的逻辑。
基于 Pulsar Functions 的架构和 serverless 的理念,实现了一套无服务器化的连接器(Connectors)框架 Pulsar IO。Pulsar IO 提供了简化了 Pulsar 和流生态环境的链接。用户不需要编写任何的代码,只需要准备一个简单的配置文件。并且提供了对连接器的自动的容错管理,负载均衡,随着负载自动伸缩扩容等,极其简化了用户的使用。
目前已经提供的连接器包括:Kafka,Kinesis,RabbitMQ,Elastic-search,HDFS,Aerospike,JDBC 等。
相比于其他消息 / 流系统,Apache Pulsar 最大的优势是它基于 Apache BookKeeper 的分块存储(Segment Storage)架构。 Pulsar 通过提供层级存储(Tiered Storage)的方式来解决容量和开销的权衡。
层级存储通过将老的数据分块从 BookKeeper 卸载到更廉价的存储系统(比如 AWS S3, Google GCS,Azure 和 HDFS)中,从真正意义上把 Pulsar 变成了真正的无限数据流(Infinite Streams)存储。终端用户不需要知道数据是存储在 BookKeeper 中,还是存储在更廉价的存储系统中,整个流程对用户是透明的。这也意味着用户主要编写一套代码即可同时消费最新的流数据和历史数据。目前 2.1 版本只支持 S3。在将 release 的 2.2 版本中,将支持更多的云存储,比如 Google GCS,Azure Blobstore 等。
流计算中最充满挑战的一个问题是解决状态(State)的管理。Pulsar 引入了状态(State)API,借助底层的 BookKeeper 提供状态存储,简化了流计算中的状态的管理。通过这套 API, 不仅可以支持 Pulsar Functions 自身的状态管理问题;而且为开发者编写原生流处理的逻辑,提供了便捷。这套状态 API 跟 Apache BookKeeper 的表服务进行了深入的整合。目前支持简单的 key/value 操作以及对于计数支持的 inc 操作。
Pulsar 引入了对 Schema 的原生支持。这意味着用户可以在创建 Pulsar 主题的时候定义消息相应的 Schema,然后 Pulsar 会根据指定的 Schema 保证发布消息的完整性。
Pulsar 不仅支持 String、Bytes、JSON 三种内置 Schema,还原生支持 Avro 和 Protobuf 这两种类型。Schema 将 Pulsar 从一个只支持非结构化数据的消息系统变成了也支持结构化数据的流数据平台。Schema 将作为最重要的基石组件用来实现 Pulsar SQL,完成对流数据的可查询化。
发布的 2.2 版本中,Pulsar 将会引入了 SQL,方便数据科学家对于存储在 Pulsar 里面数据进行 SQL 查询和分析。Pulsar SQL 借助 Presto,为用途提供了高效可扩展的查询。这种高效的查询,主要得益于 Pulsar 底层的存储系统 Apache BookKeeper。Pulsar 的数据会根据配置均衡的存储在多个存储节点上,这使得 Pulsar SQL 可以通过 BookKeeper 的接口,并发访问多个存储节点。
在 Pulsar 从开源到毕业的这段时间,吸引了不少国内外用户。目前 Pulsar 的成熟用户包括 MercadoLibre, Oath, One Click Retail, STICorp, TaxiStartup, Yahoo Japan Corporation 和智联招聘等。
智联招聘于 2017 年初开始计划搭建统一的消息平台,智联招聘的原系统在 RabbitMQ 之上通过一层服务封装来实现底层存储的资源分配、单队列的扩展能力、延时消息、定时消息等特性。在智联招聘一年多的实践中,业务逐渐对消息回溯、数据容灾等提出了更高的要求。因此于 2018 年年中基于 Apache Pulsar 重新设计和搭建了统一的消息平台。
Apache 官方消息参考:
http://globenewswire.com/news-release/2018/09/25/1575494/0/en/The-Apache-Software-Foundation-Announces-Apache-Pulsar-as-a-Top-Level-Project.html
PS:在 Pulsar 毕业之际,Pulsar 社区的 PMC 成员,联合智联和计算所的贡献者一起,将于 10 月 20 日在中科院计算所举办 Apache Pulsar Meetup·北京站的活动,感兴趣的同学可以戳【阅读原文】报名。
如果你喜欢这篇文章,或希望看到更多类似优质报道,记得给我留言和点赞哦!