提起成熟的消息队列或消息引擎,毋庸置疑,大多数人的第一反应一定是 Kafka。
Kafka 能够彻底满足海量数据场景下高吞吐、高并发需求,在短短几年内,已经被阿里、腾讯、百度、字节跳动、Netflix、Twitter 等超一线大厂视为技术核心——可以说,Kafka 是目前大数据 Spark 实时流处理的标配。
Kafka 具有高吞吐量、低延迟、容错、持久性、可伸缩性,尤其是广为人知的高吞吐量,Kafka 每秒大约可以生产约 25 万消息(50 MB),每秒处理 55 万消息(110 MB)!Kafka 还有一个巨大的优势就是容错,它具备一个固有功能,可以自行应对集群中的节点故障。
在运维和实践过程中,Kafka 却也始终存在着一些棘手的问题。例如:
扩展性较差,剥离 Broker 意味着必须复制 topic 分区和副本,效率很低;
缺乏一致性,一旦 API 发生变化很有可能出现问题;
存储成本非常高,几乎没有人用Kafka长时间存储数据;
没有与租户完全隔离的本地多租户,需要自行配置解决方案
俯瞰技术生态,有没有一个平台,能够既拥有 Kafka 的优势,又规避它的缺陷,同时还融合了 MQ 的一系列特性呢?
有,那就是 Pulsar。
Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体。该系统源于 Yahoo,最初在 Yahoo 内部开发和部署,支持 Yahoo 应用服务平台 140 万个主题,日处理超过 1000 亿条消息。
Pulsar 于 2016 年由 Yahoo 开源并捐赠给 Apache 软件基金会进行孵化,2018 年成为 Apache 软件基金会顶级项目。
Pulsar 作为下一代云原生分布式消息流平台,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐以及低延时的高可扩展流数据存储特性,内置诸多其他系统商业版本才有的特性,是云原生时代解决实时消息流数据传输、存储和计算的最佳解决方案。
目前,Apache Pulsar 已经应用部署在国内外众多大型互联网公司和传统行业公司,案例分布在人工智能、金融、电信运营商、直播与短视频、物联网、零售与电子商务、在线教育等多个行业,如美国有线电视网络巨头 Comcast、Yahoo!、腾讯、中国电信、中国移动、BIGO、VIPKID 等。
目前 Apache Pulsar 项目原生核心贡献者已组成创业公司 StreamNative,进一步为 Apache Pulsar 提供更好的企业级服务支持与生态建设。
"Pulsar is a distributed pub-sub messaging platform with a very flexible messaging model and an intuitive client API."
Pulsar 是 pub-sub(发布者/订阅者)模式的分布式消息平台,拥有灵活的消息模型和直观的客户端 API。
Topic 是Pulsar的核心概念,表示一个“channel”,Producer 可以写入数据,Consumer 从中消费数据(与 Kafka 类似)。
Topic 名称的 URL 类似如下的结构:
{persistent|non-persistent}://tenant/namespace/topic
上图中 Property 即为租户,每个租户下可以有多个 Namespace,每个 Namespace 下有多个 Topic。
Namespace 是 Pulsar 中的操作单元,包括Topic是配置在Namespace级别的,包括多地域复制,消息过期策略等都是配置在Namespace上的。
Pulsar 提供了灵活的消息模型,支持三种订阅类型:
Exclusive subscription:排他的,只能有一个Consumer,接收一个Topic所有的消息
Shared subscription:共享的,可以同时存在多个Consumer,每个Consumer处理Topic中一部消息(Shared模型是不保证消息顺序的,Consumer数量可以超过分区的数量)
Failover subscription:Failover模式,同一时刻只有一个有效的Consumer,其余的Consumer作为备用节点,在Master Consumer不可用后进行替代(看起来适用于数据量小,且解决单点故障的场景)
为了解决吞吐等问题,Pulsar和Kafka一样,采用了分区(Partition)的机制。
Pulsar提供了一些策略来处理消息到Partition的路由(MessageRouter):
不同于别的MQ系统,Pulsar允许Consumer的数量超过分区的数量(对于RocketMQ,超过分区数的Consumer会分配不到分区而“空跑”)。
在Shared subscription的订阅模式下,Consumer数量可以大于分区的数量,每个Consumer处理每个Partition中的一部分消息,不保证消息的顺序。
Pulsar通过 BookKeeper 来存储消息,保证消息不会丢失(BookKeeper:A scalable, fault-tolerant, and low-latency storage service optimized for real-time workloads)。
Pulsar采用“存储和服务分离”的两层架构(这是Pulsar区别于其他MQ系统最重要的一点,也是所谓的“下一代消息系统”的核心):
Broker:提供发布和订阅的服务(Pulsar的组件)
Bookie:提供存储能力(BookKeeper的存储组件)
优势是Broker成为了stateless的组件,可以水平扩容(RocketMQ的Broker是包含存储的,是有状态的,Broker的扩容更像是“拆分”)。高可靠,一致性等通过BookKeeper去保证。
上图是Pulsar Cluster的架构:
采用 ZooKeeper 存储元数据,集群配置,作为coordination
local zk负责Pulsar Cluster内部的配置等
global zk则用于Pulsar Cluster之间的数据复制等
采用Bookie作为存储设备(大多数MQ系统都采用本地磁盘或者DB作为存储设备)
Broker负责负载均衡和消息的读取、写入等
Global replicators负责集群间的数据复制
多个Broker节点组成一个Pulsar Cluster;多个Pulsar Cluster组成一个Pulsar Instance。
Pulsar通过GEO-REPLICATION支持一个Instance内在不同的地域发送和消费消息。
上图中,Producer P1、P2、P3在不同的Cluster发送给Topic T1的消息,会在Cluster之间进行复制,Consumer C1、C2可以在自己所在的Cluster消费到所有的消息。
当消息被写入Pulsar时,首先消息被持久化在local cluster,之后异步的发送到其他cluster。在没有链接问题的情况下,通常复制的latency相近于网络的RTT。
Apache Pulsar 提供了统一的消费模型,支持 Stream(如 Kafka)和 Queue(如 RabbitMQ)两种消费模型, 支持 exclusive、failover 和 shared 三种消费模式。
同时,Pulsar 提供和 Kafka 兼容的 API,以及 Kafka-On-Pulsar(KoP) 组件来兼容 Kafka 的应用程序,KoP 在 Pulsar Broker 中解析 Kafka 协议,用户不用改动客户端的任何 Kafka 代码就能直接使用 Pulsar。
一句话,Plusar 是对 Kafka 的增强或升级。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章