你管这破玩意叫Pulsar

简介: 你管这破玩意叫Pulsar

这两年pulsar发展比较快,有好多大公司引入了pulsar,相关的资料和课程也多了,今天一起来了解一下pulsar这款中间件。

下图是几款消息中间件的历史:

微信图片_20221212203037.png

2012年pulsar在Yahoo内部开发,2016年开源并捐献给Apache,2018成为Apache顶级项目。

1架构

pulsar的架构图如下:

总结一下,pulsar有下面的几个特性。

1.1 计算存储分离

pulsar采用计算和存储相分离的架构,Broker集群负责把producer发出的消息发送给consumer,同时承担负载均衡的作用。

Pulsar用 Apache BookKeeper作为持久化存储,Broker持有BookKeeper client,把未确认的消息发送到BookKeeper进行保存。

BookKeeper是一个分布式的WAL(Write Ahead Log)系统,pulsar使用BookKeeper有下面几个便利:

  • 可以为Topic创建多个ledgers

Ledger是一个只追加的数据结构,并且只有一个writer,这个writer负责多个BookKeeper存储节点(就是Bookies)的写入。Ledger的条目会被复制到多个bookies。

  • Broker可以创建、关闭和删除Ledger,也可以追加内容到Ledger。
  • Ledger被关闭后,只能以只读状态打开,除非要明确地写数据或者是因为writer挂掉导致的关闭。
  • Ledger只能有writer这一个进程写入,这样写入不会有冲突,所以写入效率很高。如果writer挂了,Ledger会启动恢复进程来确定Ledger最终状态和最后提交的日志,保证之后所有Ledger进程读取到相同的内容。
  • 除了保存消息数据外,还会保存cursors,也就是消费端订阅消费的位置。这样所有cursors消费完一个Ledger的消息后这个Ledger就可以被删除,这样可以实现ledgers的定期翻滚从头写。

1.2 节点对等

从架构图可以看出,broker节点不保存数据,所有broker节点都是对等的。如果一个broker宕机了,不会丢失任何数据,只需要把它服务的topic迁移到一个新的broker上就行。

Broker的topic拥有多个逻辑分区,同时每个分区又有多个segment,writer写数据时,首先会选择Bookies,比如图中的segment1,选择了Bookie1、Bookie2、Bookie4,然后并发地写下去。这样这三个节点并没有主从关系,协调完全依赖于writer,因此它们也是对等的。

1.3 扩展和扩容

在遇到双十一等大流量的场景时,必须增加consumer,这时因为Broker不存储任何数据,可以方便的增加broker。broker集群会有一个或多个broker做消息负载均衡,当新的broker加入后,流量会自动从压力大的broker上迁移过来。

对于BookKeeper,如果对存储要求变高,比如之前存储2个副本,现在需要存储4个副本,这时可以单独扩展bookies而不用考虑broker。因为节点对等,之前节点的segment又堆放整齐,加入新节点并不用搬移数据。writer会感知新的节点并优先选择使用。

1.4 容错机制

对于broker,因为不保存任何数据,如果节点宕机了,就相当于客户端断开,重新连接其他的broker就可以了。

对于BookKeeper,因为保存了多份副本,并且这些副本都是对等的,没有主从关系,所以当一个节点宕机后,不用立即恢复,后台有一个线程会检查宕机节点的数据备份进行恢复。

2 BookKeeper简介

从上一节的讲解看出,Apache Bookkeeper是一个易扩展、高可用、运维简单的分布式存储系统。这节再看一下Bookkeeper的其他三个特性。

2.1 客户端数量

我们知道,在Kafka中,客户端只能从leader节点读取数据。但在BookKeeper中,客户端可以从任何一个bookie副本读取数据,这有三个好处:

  • 增加了读高可用
  • 把客户端流量平均分配到了不同的bookie
  • 可以通过增加客户端数量来提高读取效率

客户端和服务器通信采用Netty实现异步I/O。网络I/O使用单个TCP连接进行多路复用,这就以很少的资源消耗实现了非常高的吞吐量。

2.3 I/O隔离

为什么要做I/O隔离?在大多数消息系统中,如果consumer处理慢,可能会导致消息积压。这迫使存储系统从持久存储介质中读取数据。当存储系统I/O组件共享写入、追尾读、追赶读的单一路径时,就会出现I/O抖动及页面缓存的换入换出。

写入和追尾读对可预测的低延迟有较高要求,而追赶读则对吞吐量的要求比较高,分离这三个路径很重要。

在BookKeeper中,bookie使用三条独立的I/O路径,分别用于写入、追尾读、追赶读。如下图:

微信图片_20221212203201.png

参考[1]

3 多租户

Pulsar可以使用多租户来管理大集群。Pulsar的租户可以跨集群分布,每个租户都可以有单独的认证和授权机制。租户也是存储配额、消息TTL和隔离策略的管理单元。

Pulsar的多租户性质主要体现在topic的URL中,其结构如下:

persistent://tenant/namespace/topic

可以看到,租户是topic的最基本单位。

假如一个公司有三个部门,tenant1、tenant2、tenant3,可以分配三个租户,这三个租户互不干扰,如下图:

微信图片_20221212203226.png


如果消息平台不支持租户,那部门之间想要隔离,就要给每个部门部署一套集群,运维成本非常高。

4 消息模型

4.1 消息结构

首先看一下Pulsar的消息结构,如下图:

微信图片_20221212203249.png

消息流由多个独立的segment组成,(这里的segment就是上面讲的ledger),segment又包含独立的entry,entry又由独立的message组成。这里的message就是consumer发来的消息。

可以看到,一个message的id组成包括Ledger-id,entry-id,batch-index,partition-index。

需要注意两点:

  • segment和entry都是BookKeeper里面的概念。
  • pulsar作为消息平台时,一个message就是一个entry。当pulsar作为流平台时,为了提高吞吐量,会开启batch,这样多个message组成一个entry。

4.2 创建过程

消息的创建过程如下图:

微信图片_20221212203316.png

消息创建后主要经历下面几步:

  1. 选择一个partition
  2. 发送到管理这个partition的broker
  3. broker将消息并发的发送给N个bookie,这个N是可以配置的。broker持有BookKeeper的客户端,也就是writer,writer收到写请求后,会并发的写入N个bookie。上图中N=3。
  4. bookie写完消息后会给broker一个回复,broker收到指定数量的确认消息后就会认为写BookKeeper成功。这个数量是这个配置的,比如M,M越大,写BookKeeper延迟越大,数据一致性越高。因此这个配置要对一致性和延迟到进行。

5 消费模型

5.1 概要

Pulsar的消费模型如下图:

微信图片_20221212203338.png

producer将消息发送给topic,topic下有多个partition,partition下面又有多个broker。

broker负责接收消息并把消息分配给给consumer,并把消息写到BookKeeper。

broker还具有限流功能,可以根据限流阈值对producer的消息进行限流。

consumer并不能直接从broker中获取消息,consumer和broker之间有一个Subscription,Consumer通过Subscription获取消息。

5.2 subscription

subscription有四种类型:

  • 独占模式(Exclusive):同一个topic只能有一个消费者,如果多个消费者,就会出错。
  • 灾备模式(Failover):同一个topic可以有多个消费者,但是只能有一个消费者消费,其他消费者作为故障转移备用,如果当前消费者出了故障,就从备用消费者中选择一个进行消费。如下图:

微信图片_20221212203402.png

  • 共享模式(Shared):同一个topic可以由多个消费者订阅和消费。消息通过round robin轮询机制分发给不同的消费者,并且每个消息仅会被分发给一个消费者。当消费者断开,发送给它的没有被消费的消息还会被重新分发给其它存活的消费者。如下图:

微信图片_20221212203430.png

  • Key_Shared:消息和消费者都会绑定一个key,消息只会发送给绑定同一个key的消费者。如果有新消费者建立连接或者有消费者断开连接,就需要更新一些消息的key。如下图:

微信图片_20221212203451.png

跟Shared模式相比,Key_Shared的好处是既可以让消费者并发地消费消息,又能保证同一Key下的消息顺序。

5.3 Cursor

当多个consumer订阅同一个topic时,Subscription为每一个consumer分配一个Cursor,这样多个Consumer之间就不会相互影响了。如下图:

微信图片_20221212203512.png

Subscription会维护一个消息的ACK状态,consumer处理完消息后,会给broker返回ACK,表示消息已经处理完成。如果broker一直没有收到ACK,就会把消息发送到其他consumer。

如果客户端想要重新消费Cursor以前的消息,Cursor是支持reset的,reset之后,Cursor就回退回去了,这时consumer可以从新的Cursor位置进行消费。

Cursor的位置是会实时写入BookKeeper的,这必定会有一定的性能损耗。因此,Pulsar提供了一种非持久化的Subscription(Non-durable Exclusive)。Pulsar的Reader接口内嵌了Non—durable Exclusive Cursor,它读取消息不会返回ACK。

6 broker代理

通过前面的讲解可以看到,consumer和producer只需要跟broker进行交互,而不用跟底层的BookKeeper交互,事实上,broker还有一层代理,consumer和producer直接跟代理进行交互。如下图:

微信图片_20221212203534.png

Zookeeper

Pulsar提供了System topic用来保存策略之类的元数据,尽量减少对Zookeeper的依赖。

Zookeeper也保存一些策略相关的元数据,还保存了broker和BookKeeper集群相关的配置元数据,比如服务发现相关的元数据。

8 总结

Pulsar是一款非常优秀的中间件,实现了计算和存储相分离,支持多租户,扩展和扩容、容错都是非常容易的。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
消息中间件 Java Linux
聊聊 Pulsar: 在 Linux 环境上搭建 Pulsar
聊聊 Pulsar: 在 Linux 环境上搭建 Pulsar
706 0
|
2月前
|
存储 人工智能 前端开发
Qoder + ADB Supabase :5分钟GET超火AI手办生图APP
本文介绍如何利用Qoder、阿里云ADB Supabase和通义千问图像编辑模型,快速搭建AI手办生图Flutter应用。无需传统后端,实现从前端生成到数据存储、AI服务集成的全链路敏捷开发,展现Vibe Coding的高效实践。
Qoder + ADB Supabase :5分钟GET超火AI手办生图APP
|
5月前
|
敏捷开发 数据可视化 BI
远程团队看板工具全指南:2025年最强推荐与实践策略
《远程团队看板工具:提升协作效率的利器》摘要 远程看板工具正成为现代团队协作的核心,通过可视化任务流、实时同步和进度追踪,有效解决远程办公中的信息不对称问题。本文系统介绍了看板工具的基本概念、核心功能(包括任务可视化、多人协作、时间管理等),并对比了Trello、Jira、Asana等主流产品的特点。针对选型策略,建议从团队规模、易用性、集成能力三个维度考量。文章还分享了任务拆解、每日站会等实用技巧,并解答了数据安全等常见问题。最后强调,合适的看板工具能显著提升远程团队的工作效率和凝聚力。
170 5
|
编解码 网络协议 Unix
SIP协议&开源SIP服务器搭建和客户端安装
1. SIP SIP 是一个应用层的控制协议,可以用来建立,修改,和终止多媒体会话,例如Internet电话 SIP在建立和维持终止多媒体会话协议上,支持五个方面: 1)   用户定位: 检查终端用户的位置,用于通讯。
17890 0
|
存储 消息中间件 设计模式
新一代消息中间件—Apache Pulsar
新一代消息中间件—Apache Pulsar
1555 111
|
12月前
|
存储 消息中间件 缓存
独特架构打造新一代消息队列Apache Pulsar
Apache Pulsar 是一个开源的分布式消息流平台,由雅虎开发并于 2016 年开源,2018 年成为 Apache 顶级项目。Pulsar 通过独特的架构提供多租户、持久化存储和批处理等高级功能,支持高吞吐量、低延迟的消息传递。其核心组件包括 Broker、Apache BookKeeper 和 Apache ZooKeeper,分别负责消息处理、持久化存储和集群管理。
450 1
|
9月前
|
SQL 存储 安全
MySQL:Prepared Statement 预处理语句
MySQL 预处理语句是一种高效、安全的执行 SQL 查询的方法。通过预编译 SQL 语句,可以显著提升查询性能,并有效防止 SQL 注入攻击。掌握预处理语句的使用方法,对于优化数据库操作和提高应用程序的安全性具有重要意义。希望本文能帮助你更好地理解和使用 MySQL 预处理语句。
432 7
|
API Go 调度
API请求执行流程_milvus源码解析
API请求执行流程_milvus源码解析
351 0
|
消息中间件 SpringCloudAlibaba Java
第十章 SpringCloud Alibaba 之 Nacos discovery
第十章 SpringCloud Alibaba 之 Nacos discovery
700 1
|
消息中间件 运维 容灾
理想汽车大规模 Apache RocketMQ 集群部署最佳实践
十年铸剑,Apache RocketMQ 的成长离不开全球接近 500 位开发者的积极参与贡献,相信在下个版本你就是 Apache RocketMQ 的贡献者,在社区不仅可以结识社区大牛,提升技术水平,也可以提升个人影响力,促进自身成长。
992 83
理想汽车大规模 Apache RocketMQ 集群部署最佳实践