Apache Pulsar 是 2016 年 yahoo 开源的下一代大规模分布式消息系统,目前已经加入 Apache 基金会。在 Yahoo 的生产环境中大规模部署并使用了近 4 年,服务于 Mail、Finance、Sports、Flickr、the Gemini Ads platform、Sherpa 以及 Yahoo 的 KV 存储等,在 Yahoo 全球 8 个数据中心之间维护了全联通的复制,并支持了 200 多万个 Topics。
Apache Pulsar 有几个明显区别于其他消息系统的特点:
-
优秀的数据持久性和顺序性。每一条消息都提供了全局唯一的 ID,多副本,并都是在实时刷盘后再返回给用户。
-
统一的消费模型: 支持 Stream (如 Kafka )和 Queue (如 RabbitMQ )两种消费模型, 支持 exclusive、failover 和 shared 三种消费模式。
-
灵活的扩展性: 节点扩展的线性和瞬时完成,在扩展中不会有数据的拷贝和迁移。
-
高吞吐低延迟,在实时刷盘的前提下,依然提供了高带宽( 180 万 messages/ 秒)和低延迟( 5ms at 99%)。
Pulsar 2.1 更加了丰富消息系统之外的“ Stream Native ”的属性,比如 Schema 的支持, 层级存储, 状态函数等。。
===========
今天Apache Pulsar正式发布了2.1.0版本!距离2.0版本的发布,相距不到两个月的时间。在这短短两个月的时间内,社区的贡献非常迅猛。2.1版本包含了很多新的特性和改进,这些改进帮助Pulsar从一个分布式消息系统演进成一个完整的流原生(Stream Native)实时数据平台。
在这个版本中,你可以看到以下几个重要特性:
-
Pulsar IO: 一套基于Pulsar Functions实现的无服务器化的连接器(Connectors)框架,以及一组内置的连接器实现
-
Tiered Storage: 层级存储
-
Stateful Functions: 状态函数
-
Clients:Go语言客户端
-
Schema: 支持Avro 和 Protobuf
Pulsar IO
在Pulsar 2.0版本中,我们首次引入了Pulsar Functions,一套基于无服务器化(Serverless)的轻量级计算框架。这套计算框架为用户提供了最为简便的方式进行流计算逻辑的编写。自从Pulsar Functions发布之后,社区的反响程度十分热烈,很多社区的用户非常喜欢这个特性。因为使用它的学习成本基本为零,只要能写Java或者Python的函数,就可以编写在Pulsar进行流计算的逻辑。
我们将这种极简至上(simplicity first)的理念延续在开发Pulsar 2.1的过程中。我们在Pulsar Functions上实现了一套无服务器化的连接器(Connectors)框架Pulsar IO,用来简化用户导入数据到Pulsar和从Pulsar中导出数据。用户在使用连接器的时候,不需要编写任何的代码。你所需要做的事情只是准备一个关于你需要连接的系统的配置文件,然后就可以使用Pulsar提供的管理工具向Pulsar提交相应的连接器。Pulsar就会负责剩下的事情,包括容错管理,负载均衡,随着负载自动伸缩扩容。
另外,2.1版本包含六个内置的连接器实现。他们分别是:
-
Aerospike连接器
-
Cassandra连接器
-
Kafka连接器
-
Kinesis连接器
-
RabbitMQ连接器
-
Twitter Firehose连接器
你可以参考Pulsar 2.1的教程来学习使用Cassandra连接器,将数据从Pulsar导出到Cassandra里。
我们计划在未来的发布版本中包含更多的连接器实现。如果你对Pulsar感兴趣,想成为Pulsar的代码贡献者,我们十分欢迎你为Pulsar开发不同的连接器。开发连接器也十分简单,跟编写一个Pulsar函数进行流处理一样简单。
层级存储
相比于其他消息/流系统,Apache Pulsar最大的优势是它基于Apache BookKeeper的分块存储(Segment Storage)架构。在Pulsar里面,一个主题分区(Topic Partition,或者称为一个流)会被切分成分块(Segments)存储在BookKeeper里面。这就意味着,一个主题分区的容量不受限于单台机器的容量。只要整个集群有足够的容量,你就可以往一个主题分区里面无限追加数据。如果你的集群开始没有容量,你只需简单地往集群里面添加存储节点即可,Pulsar就会开始自动使用新的存储节点,而不需要重新均衡已有的数据分区。但是,如果一直在BookKeeper里面累积存储历史数据,那么整个集群的开销就会变得昂贵。
Pulsar通过提供层级存储(Tiered Storage)的方式来解决容量和开销的权衡。层级存储通过将老的数据分块从BookKeeper卸载到更廉价的存储系统(比如AWS S3, Google GCS和HDFS),从真正意义上把Pulsar变成了真正的无限数据流(Infinite Streams)存储。对于终端用户而言,他们不需要知道数据是存储在BookKeeper还是存储在更廉价的存储系统中,整个流程对用户是透明的。这也意味着用户主要编写一套代码即可同时消费最新的流数据和历史数据。
目前2.1版本只支持S3。在未来的2.2版本中,我们即将支持更多的云存储,比如Google GCS,Azure Blobstore和HDFS。如果你对层级存储感兴趣,也想贡献对其他云存储的支持,我们也十分欢迎来自你的代码贡献。
状态函数
流计算中最充满挑战的一个问题是解决状态(State)的管理。Pulsar Functions也面临同样的问题。我们开发Pulsar Functions的初衷就是为开发者简化编写原生流处理的逻辑。我们同样也希望简化流计算中的状态的管理。因为在2.1版本中,我们引入了状态(State)API,开发者可以使用状态API来将计算的一些状态存储到底层的存储系统中。这套状态API跟Apache BookKeeper的表服务进行了深入的整合。目前支持简单的key/value操作以及对于计数支持的inc操作。
状态函数在2.1版本中作为一个开发者预览(Developer Preview)特性发布。我们希望通过收集社区的意见完善出一套真正简化流计算状态管理的API。如果你有好的想法和建议,欢迎通过Pulsar的邮件列表,Github或者Slack来跟我们交流。
Schema
在2.0版本中,Pulsar引入了对Schema的原生支持。这意味着你可以在创建Pulsar主题的时候定义消息相应的Schema,然后Pulsar会根据你指定的Schema保证发布消息的完整性。2.0版本只支持String,Bytes和JSON三种内置Schema。从2.1版本开始,Pulsar原生支持Avro和Protobuf这两种类型。
Schema将Pulsar从一个只支持非结构化数据的消息系统变成了也支持结构化数据的流数据平台。在接下来的2.2版本中,Schema将作为最重要的基石组件用来实现流数据的可查询化,也就是传说中的Pulsar SQL。
客户端
在2.1发布版本中,我们正式发布了官方的Go语言客户端。该Go语言客户端是基于原生的C++客户端实现,所以是一个直接用在生产线上的客户端实现。除了官方原生的客户端,Comcast也在这段时间发布了他们使用原生Go语言编写的用在生产线上的客户端。
结语
Apache Pulsar是Yahoo开源的下一代消息系统。在2017年初,Yahoo将Pulsar贡献给Apache进行孵化。在过去一年的时间内,Apache Pulsar一共发布了6个版本,其中包括在六月份发布的2.0里程碑。最新的2.1版本延续Pulsar极简至上的原则,从真正意义上将Pulsar由一个分布式消息系统演变成一个完整的流原生数据平台。在未来一个月,也就是2.2版本中,我们将会有更多强悍的特性发布。欢迎关注和参与到Pulsar社区。
Pulsar 2.1的下载链接:https://pulsar.incubator.apache.org/en/download/
Pulsar的项目链接:https://pulsar.incubator.apache.org/
Pulsar的Github代码库:https://github.com/apache/incubator-pulsar
Pulsar的Slack Channel:https://apache-pulsar.herokuapp.com/
Pulsar的邮件列表:https://pulsar.incubator.apache.org/contact/
原文链接: https://mp.weixin.qq.com/s/klf1UJfkvisxkm0vj12fwg