Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性,被看作是云原生时代实时消息流传输、计算和存储最佳解决方案。
Apache Pulsar 属于分布式消息流领域,为什么它是云原生时代最佳解决方案,它到底能解决什么问题?
相信大家对 MQ(Message Queue)这个名词并不陌生。简单来说,MQ 是用于存放消息的队列,是一种先进先出的数据结构。很多编程语言都自带了这类内存队列,作为多任务之间的数据通道进行异步解耦,例如 Java 的 java.util.Queue
。
以实际生活中的网上购物为例,李四购买了张三的商品,张三需要把物品送到李四手上,张三通过快递服务把物品送到指定地址,快递服务会将物品放在离李四最近的快递仓库中,然后通知给李四来收取。张三也可以直接把物品送给李四,但是需要双方约定好时间和地点,存在上下游强依赖问题,快递服务通过中间的快递仓库解决了强依赖问题。只需通知李四物品到达仓库的时间和地点,李四可以按照自己的时间来收取,这样不仅解耦了上下游的依赖,同时也提升各自的处理效率。
在实际业务流程中也大量存在这样的场景,上游将数据写入到消息队列进行暂存,通知下游来消息队列获取数据消费,完成整个业务流程处理。例如,一个互联网购买业务流程可能需要调用多个服务,包含下单服务、支付服务、发货服务等。如果需要等待这些服务都处理完才能结束业务流程,则用户一次操作时长可能到达秒级或者更长,并且大部分操作可以异步处理,一些非关键的业务(如通知服务)不应该影响或阻塞主流程。
上图是一个典型的电商业务处理流程。利用消息队列可以将支付服务、发货服务以及后续的积分服务等进行解耦,在支付完成时即可结束用户本次操作,后续通过异步的方式把接下来的流程完成。在此场景中,对消息队列最基本的要求是性能、延迟与持久化等能力,例如快递服务同时能运输多少物品、多久能达指定地点,以及快递仓库能存储多少物品,这些直接决定了快递服务质量。
随着大数据时代的到来,数据对于企业来说越来越重要,需要一套平台把海量数据收集和整合并充分利用。在这个处理流程中,消息队列承担着重要的角色,例如作为统一数据上报的入口,这些数据包括应用程序的消息、服务级的日志流水以及数据库中的业务数据等,因此消息队列包含了完整业务流程数据,为下游的实时数仓以及离线数仓提供数据原材料,以及目前非常火爆的流式计算,通常利用 Flink、Spark Streamming 等计算平台与消息队列结合进行实时计算。
相比队列场景,在流场景中,消息系统需要具备更高的吞吐以及顺序消费等能力。
那么现代业务和基础设施要求消息系统应该具备哪些能力?
选择分布式中间件,首先需要考虑高可靠、高一致、高可用、高性能这些核心能力。
目前的消息系统很难同时满足以上四高要求,这也是分布式系统一大难题,一般根据业务特性取一个折中的方式。例如传统的 RabbitMQ 保证了高可靠、高一致、高可用,但满足不了高性能场景;Kafka 保证了高性能、高可用,但是满足不了高可靠、高一致的金融场景,即使可以通过配置勉强应用,但是整个性能和延迟断崖式下降,参考性能测试报告。
消息系统最基础的能力是提供发布订阅的服务,根据业务场景的不同会有不同的诉求。
在队列场景和流场景中,其实还有很多交叉能力,例如顺序消息、海量积压也存在于队列场景,这里只是为了对比将其区分开来。
完善的运营能力对于消息系统落地也非常重要,包含几个层面:
消息系统与周边生态对接的能力也是需要考虑。在队列场景中,更多的考虑是系统能否兼容更多的协议,例如 HTTP 协议、AMQP 协议、MQTT 协议等;在流场景中,更多的考虑是系统能否原生对接大数据生态,以及周边存储系统能否快速将数据同步到消息系统中,或者双向同步。
上面花了较大的篇幅介绍了消息系统的业务场景以及应该具备的能力,下面是 Apache Pulsar 的一个简单功能图,Pulsar 基本满足上述提到的能力,这里并不打算介绍 Pulsar 原理以及详细功能特点,可以进入 Apache Pulsar 官网了解详情。接下来我们看看新一代分布式消息队列Apache Pulsar能够解决哪些场景。
目前大部分企业中都存在两套消息系统,一个是用于在线业务场景的 RabbitMQ 或者 RokcetMQ,另一个是用于大数据日志场景的 Kafka。其根本原因是这些系统不能同时满足两种场景。这对企业来说,无论是学习成或者运维成本,还是资源成本都会增加。
Apache Pulsar 能够将这两个场景进行统一,其核心存储层Apache BookKeeper为 Pulsar 提供了企业级稳定的 IO 质量,具备高性能、强一致性、读写隔离、灵活 SLA 等特性,这里有详细的性能测试报告。其计算存储分离架构和分片存储模式能够解决 Kafka 系统中所面临的痛点,例如扩容带来的数据再平衡以及海量 Topic 等问题。有了存储层的基础,服务层统一相对容易。Pulsar 原生提供了多租户能力,统一的消费模型可以满足不同场景的要求。
腾讯计费(Midas)是一个典型的案例,腾讯计费基于 Pulsar 构建了日百亿级规模的消息总线,覆盖了核心交易流程、实时对账、实时监控等业务。
随着对数据的实时性要求越来越高,很多企业都在构建实时数仓,例如一款新产品上线,运营人员需要根据实时效果数据来及时调整运营策略,以及在大屏数据实时展示中,需要实时展示时刻变化的数据。Apache Pulsar 适合作为实时数据收集的入口,并提供了丰富的 Pulsar Source 工具将周边的存储数据接入进来。同时 Pulsar 抽象了协议层,提供多种协议接入,例如 Kafka 协议、AMQP 协议等。Pulsar 基于 Topic 级别的 Schema 管理结合 Pulsar Flink Connector 可以非常方便地进行实时流计算。
另外 Apache Pulsar 还有一个非常好的特性,即允许将历史数据卸载到更低廉的存储系统中,比如 HDFS、S3 等,并且与存储在 BookKeeper中的实时数据形成统一的存储视图,对外提供统一的 API,结合 Flink 实现批流融合计算、构建实时数仓。
BIGO 是一个典型的案例,BIGO 团队基于 Pulsar 和 Flink 构建了日千亿级规模的实时数仓,覆盖了实时指标计算、模型训练、ABTest 实时验证等业务。
在大数据业务场景中,实时数仓和离线数仓可能共存,比如在基于 HIVE 的数据分析场景中,离线数仓中使用最频繁。从上面的模式来看,目前还无法将实时数仓和离线数仓的数据进行统一存储。Apache Pulsar 目前正在对接数据湖生态,通过层级存储将Pulsar Topic 历史数据以数据湖的格式存储,这样基于数据湖的生态可以更好地与原有的大数据生态进行结合,用户可根据实际需求灵活选择。
据 IoT Analytics 报告,2020 年全球物联网连接数达到 117 亿,预计 2025年将达到 309 亿,面对 IoT 场景或者边缘计算场景,高质量的数据管道是一个关键服务,需具备海量设备接入、高性能低延迟、顺序消费等能力。Apache Pulsar 正好都能满足这些要求,比如 MQTT on Pulsar (MoP),海量 Topic 以及多种消费模式满足顺序消费场景。
除此之外,Pulsar Functions 非常适合边缘计算中的数据处理层场景,例如 Actor Cloud 利用 Pulsar Functions 实现了数据处理规则管理引擎。
Apache Pulsar 还有很多实用的功能,例如跨地域复制能力能够提供在线业务场景下集群级别灾备,满足金融级别的可用性和可靠性以及大数据场景下多地域数据汇聚场景;Pulsar Functions 提供轻量级数据路由和转换能力,满足简单的 ETL 场景等。
一切技术的诞生都是为了解决实际问题,Apache Pulsar 的诞生弥补了同类消息系统很多不足的地方,同时它也是第一个实现计算存储分离架构的消息系统,如果您正在对消息系统进行方案选型,Apache Pulsar 是一个不错的选择。