基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(上)
#作者:闫乾苓
文章目录
- 概念和架构
- 概述
- 主要特点
- 消息传递
- 核心概念
- Pulsar 的消息模型
- Pulsar 的消息存储与分发
- Pulsar 的高级特性
- 架构
- Broker
- BookKeeper
- ZooKeeper
概念和架构
概述
Pulsar 是一个多租户、高性能的服务器到服务器消息传递解决方案。Pulsar 最初由雅虎开发,目前由Apache 软件基金会管理。
主要特点
- 原生支持 Pulsar 实例中的多个集群,并可跨集群实现消息的无缝地理复制。
- 发布和端到端延迟非常低。
- 无缝扩展到超过一百万个主题。
- 一个简单的客户端 API,具有Java、Go、Python和C ++的绑定。
- 主题的多种订阅类型(独占、共享和故障转移)。
- Apache BookKeeper提供持久消息存储,保证消息传递。无服务器轻量级计算框架Pulsar Functions提供流原生数据处理能力。
- 基于 Pulsar Functions 构建的无服务器连接器框架Pulsar IO可以更轻松地将数据移入和移出 Apache Pulsar。
- 当数据老化时,分层存储会将数据从热/温存储卸载到冷/长期存储(例如 S3 和 GCS)。
消息传递
Pulsar 基于发布-订阅模式(通常缩写为 pub-sub)。在此模式下,生产者向主题发布消息;消费者 订阅这些主题,处理传入的消息,并在处理完成后向代理发送确认。
订阅创建后,Pulsar会保留所有消息,即使消费者断开连接也是如此。只有当消费者确认所有消息均已成功处理时,保留的消息才会被丢弃。
如果某条消息消费失败,你希望该消息再次被消费,你可以启用消息重投机制,请求broker重新发送该消息。
核心概念
消息
消息是 Pulsar 的基本“单位”。下表列出了消息的组成部分
成分 | 描述 |
---|---|
值/数据有效载荷 | 消息携带的数据。 |
键 | 消息可以选择用键进行标记,这对于主题压缩等操作很有用。 |
特性 | 用户定义属性的可选键/值映射。 |
生产者名称 | 生成消息的生产者的名称。如果未指定生产者名称,则使用默认名称。 |
主题名称 | 发布消息的主题的名称。 |
架构版本 | 生成消息的模式的版本号。 |
序列 ID | 每条 Pulsar 消息都属于其主题上的一个有序序列。消息的序列 ID 最初由其生产者分配,指示其在该序列中的顺序,也可以自定义。 |
序列 ID | 可用于消息去重。如果brokerDeduplicationEnabled设置为true,则每条消息的序列 ID 在主题(非分区)或分区的生产者中都是唯一的。 |
消息 ID | 消息持久化存储后,bookies 会立即为其分配消息 ID。消息 ID 指示消息在账本中的特定位置,并且在 Pulsar 集群中是唯一的。 |
发布时间 | 消息发布的时间戳。该时间戳由生产者自动应用。 |
活动时间 | 应用程序附加到消息的可选时间戳。例如,应用程序会在消息处理时附加时间戳。如果事件时间未设置任何内容,则值为0。 |
消息默认大小为 5MB。您可以通过以下配置来设置消息的最大大小
在broker.conf文件中
# The max size of a message (in bytes).
maxMessageSize=5242880
在bookkeeper.conf文件中
# The max size of the netty frame (in bytes). Any messages received larger than this value are rejected. The default value is 5 MB.
nettyMaxFrameSizeBytes=5253120
主题(Topic)
主题是消息传递的基本单元,生产者将消息发送到主题,消费者从主题中消费消息。
Pulsar 支持两种类型的主题:
- 持久化主题(Persistent Topic):消息存储在持久化存储中(如 Apache BookKeeper),确保消息不会丢失。
- 非持久化主题(Non-Persistent Topic):消息不存储在持久化存储中,适合对可靠性要求较低但性能要求高的场景。
生产者(Producer)
- 生产者是负责向主题发布消息的客户端。
- 生产者可以选择同步或异步的方式发送消息。
Pulsar 支持消息批处理(Batching)和压缩(Compression),以提高消息传输效率。
消费者(Consumer)
-
消费者是从主题中读取消息的客户端。
-
消费者可以以多种模式订阅主题:
- 独占模式(Exclusive):只有一个消费者可以消费消息。
- 共享模式(Shared):多个消费者共享消息,每个消息只被一个消费者消费。
- 故障转移模式(Failover):主消费者消费消息,如果主消费者失败,则备用消费者接管。
- 键共享模式(Key_Shared):根据消息的键(Key)分配给不同的消费者。
订阅(Subscription)
订阅定义了消费者如何从主题中消费消息。
Pulsar 支持两种订阅类型:
- 独占订阅(Exclusive Subscription):只有一个消费者可以消费消息。
- 共享订阅(Shared Subscription):多个消费者可以同时消费消息。
- 故障转移订阅(Failover Subscription):主消费者消费消息,备用消费者在主消费者失败时接管。
Pulsar 的消息模型
Pulsar 提供了两种主要的消息模型:
队列模型(Queue Model)
- 在队列模型中,消息被多个消费者共享,每个消息只被一个消费者消费。
- 这种模型适用于负载均衡的场景,例如任务分发。
流模型(Stream Model) - 在流模型中,每个消费者独立消费消息流,所有消费者都能接收到完整的消息流。
- 这种模型适用于需要广播消息的场景,例如实时数据分析。
Pulsar 的消息存储与分发
分布式架构
Pulsar 的架构分为两层:
- Broker 层:负责接收和分发消息。
- BookKeeper 层:负责持久化存储消息。
这种分离设计使得 Pulsar 能够扩展到大规模集群,同时保证高性能和高可靠性。
消息分片(Segmentation)
Pulsar 将主题划分为多个分片(Segment),每个分片由 BookKeeper 中的不同节点存储。
这种分片机制提高了存储效率和容错能力。
消息保留与过期
Pulsar 支持灵活的消息保留策略:
- 基于时间的保留:消息在指定时间后自动删除。
- 基于大小的保留:当主题的总消息大小超过限制时,旧消息会被删除。
这些策略可以通过配置进行调整。
Pulsar 的高级特性
消息确认(Acknowledgment)
消费者在成功处理消息后,会向 Pulsar 发送确认(Ack)。
如果消费者未能确认消息,Pulsar 会重新传递该消息。
消息去重(Deduplication)
Pulsar 支持消息去重功能,确保即使生产者重复发送消息,消费者也不会收到重复的消息。
延迟消息(Delayed Messages)
Pulsar 支持延迟消息功能,允许生产者指定消息的投递时间。
例如,可以设置消息在 10 秒后才被消费者接收。
消息压缩(Compression)
Pulsar 支持多种压缩算法(如 LZ4、Zlib 等),以减少消息在网络中的传输开销。
消息 TTL(Time-to-Live)
Pulsar 支持为消息设置 TTL,超时未被消费的消息会被自动丢弃。
架构
Apache Pulsar 是一个分布式发布/订阅消息系统,其架构设计非常独特且高效,结合了传统消息队列和流处理系统的优点。Pulsar 的架构分为两层:Broker 层 和 BookKeeper层,并通过多租户、跨地域复制等特性支持大规模分布式部署。
Pulsar 的架构可以概括为以下三个核心组件:
Broker
Broker 的职责
- 消息接收与分发:
- 生产者将消息发送到 Broker,Broker 将消息写入 BookKeeper。
- 消费者从 Broker 请求消息,Broker 从 BookKeeper 中读取消息并返回。
- 主题管理:
- 创建、删除和管理主题。
- 支持分区主题(Partitioned Topic),即将一个主题划分为多个分区以提高吞吐量。
- 订阅管理:
- 管理消费者的订阅模式(如独占、共享、故障转移等)。
- 跟踪消费者的消费进度(Cursor)。
Broker 的高可用性
- 多个 Broker 节点组成一个集群,通过负载均衡器分配流量。
- 如果某个 Broker 节点失效,其他节点会接管其工作,确保服务不中断。
BookKeeper
BookKeeper 的职责
- 消息持久化:
- 每条消息被存储为一个日志条目(Ledger Entry)。
- 每个主题的消息被分割成多个日志(Ledger),以便于管理和扩展。
- 数据分片与副本:
- 每个 Ledger 被分成多个片段(Segment),分布存储在不同的 BookKeeper 节点上。
- 每个 Segment 默认有三个副本,分布在不同的物理节点上,确保数据的高可用性。
- 数据一致性:
- 使用 Quorum 机制(例如 2/3 副本写入成功)保证数据的一致性和可靠性。
BookKeeper 的性能优化
- 读写分离:
- 写操作由 Leader 节点负责,读操作可以从任意副本节点执行。
- 缓存机制:
- BookKeeper 节点会缓存最近的数据,减少磁盘 I/O 开销。
ZooKeeper
ZooKeeper 的职责
- 元数据管理:
- 存储主题、分区、订阅、消费者组等元数据。
- 记录每个消费者的消费偏移量(Offset)。
- 集群协调:
- 管理 Broker 和 BookKeeper 节点的状态。
- 实现分布式锁和选举机制。
ZooKeeper 的高可用性
- 使用多个 ZooKeeper 节点组成一个集群(Ensemble),通过 ZAB 协议实现一致性。
- 如果某个 ZooKeeper 节点失效,其他节点会接管其工作。
相关文章:

基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(上)
#作者:闫乾苓 文章目录 概念和架构概述主要特点消息传递核心概念Pulsar 的消息模型Pulsar 的消息存储与分发Pulsar 的高级特性架构BrokerBookKeeperZooKeeper 概念和架构 概述 Pulsar 是一个多租户、高性能的服务器到服务器消息传递解决方案。Pulsar 最初由雅虎开…...
车载网络TOP20核心概念科普
一、基础协议与总线技术 CAN总线 定义:控制器局域网,采用差分信号传输,速率最高1Mbps,适用于实时控制(如动力系统)。形象比喻:如同“神经系统”,负责传递关键控制信号。 LIN总线 定…...

使用JAVA对接Deepseek API实现首次访问和提问
一、标题 参考:https://www.cnblogs.com/saoge/p/18866776 使用JAVA对接Deepseek API实现首次访问和 提问:我有50万能做什么小本生意,举例3个! 二、代码 import java.io.BufferedReader; import java.io.InputStreamReader; import java.…...

【C语言】文件操作(续)
目录 复习: 一⽂件的顺序读写 例子: 前言: 在上篇文章中介绍了文件的类型,文件指针,流,操作的函数。 在本篇文章继续为大家带来文件细节分享,如 顺序读写等等。 复习: fopen是…...

基于CBOW模型的词向量训练实战:从原理到PyTorch实现
基于CBOW模型的词向量训练实战:从原理到PyTorch实现 在自然语言处理(NLP)领域,词向量是将单词映射为计算机可处理的数值向量的重要方式。通过词向量,单词之间的语义关系能够以数学形式表达,为后续的文本分…...

mac连接lniux服务器教学笔记
从你的检查结果看,容器内已经安装了 XFCE 桌面环境(xfce.desktop 和 xubuntu.desktop 的存在说明桌面环境已存在)。以下是针对 Docker 容器环境的远程桌面配置方案: 一、容器内快速配置远程桌面(XFCE VNC)…...
vue3 - keepAlive缓存组件
在Vue 3中,<keep-alive>组件用于缓存动态组件或路由组件的状态,避免重复渲染,提升性能。 我们新建两个组件,在每一个组件里面写一个input,在默认情况下当组件切换的时候,数据会被清空,但…...

阀门产业发展方向报告(石油化工阀门应用技术交流大会)
本文大部分内容来自中国通用机械工业协会副会长张宗列在“2024全国石油化工阀门应用技术交流大会”上发表的报告。 一、国外阀门产业发展 从全球阀门市场分布看,亚洲是最大的工业阀门市场,美洲是全球第二大工业阀门市场,欧洲位列第三。 从国…...

Windows Server 2025 安装AMD显卡驱动
运行显卡驱动安装程序,会提示出问题。但是此时资源已经解压 来到驱动路径 C:\AMD\AMD-Software-Installer\Packages\Drivers\Display\WT6A_INF 打开配置文件,把这两行替换掉 %ATI% ATI.Mfg, NTamd64.10.0...16299, NTamd64.10.0, NTamd64.6.0, NTamd64.…...

用 CodyBuddy 帮我写自动化运维脚本
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴”。 #CodeBuddy首席试玩官 背景 我个人是非常喜欢 Jenkins 自动化部署工具的,之前都是手写 Jenki…...
从单体到微服务:基于 ABP vNext 模块化设计的演进之路
🚀 从单体到微服务:基于 ABP vNext 模块化设计的演进之路 🧩 引言 在需求多变且性能压力日益增大的背景下,传统单体应用在部署、维护和扩展方面存在显著挑战。 ABP vNext 作为基于 ASP.NET Core 的框架,自带模块化设…...

USB集线器芯片革新之战:CH334U如何以工业级性能重新定义HUB控制器
一、当工业智能化遭遇接口瓶颈 在智能制造与边缘计算蓬勃发展的今天,工程师们正面临一个看似微小却至关重要的挑战——如何让USB集线器在极端工况下保持稳定?传统HUB控制器在-20℃以下频繁出现信号失真,产线突然断电导致的静电击穿更是让设备…...
C#学习7_面向对象:类、方法、修饰符
一、类 1class 1)定义类 访问修饰符class 类名{ 字段 构造函数:特殊的方法(用于初始化对象) 属性 方法... } eg: public class Person { // 字段 private string name; private int a…...

基于 Spring Boot 瑞吉外卖系统开发(十)
基于 Spring Boot 瑞吉外卖系统开发(十) 修改菜品 修改菜品是在原有的菜品信息的上对菜品信息进行更新,对此修改菜品信息之前需要将原有的菜品信息在修改界面进行展示,然后再对菜品信息进行修改。 修改菜品分为回显菜品信息和更…...

C++ 与 Lua 联合编程
在软件开发的广阔天地里,不同编程语言各有所长。C 以其卓越的性能、强大的功能和对硬件的直接操控能力,在系统开发、游戏引擎、服务器等底层领域占据重要地位,但c编写的程序需要编译,这往往是一个耗时操作,特别对于大型…...
中介者模式(Mediator Pattern)详解
文章目录 1. 中介者模式概述1.1 定义1.2 基本思想2. 中介者模式的结构3. 中介者模式的UML类图4. 中介者模式的工作原理5. Java实现示例5.1 基本实现示例5.2 飞机空中交通控制示例5.3 GUI应用中的中介者模式6. 中介者模式的优缺点6.1 优点6.2 缺点7. 中介者模式的适用场景8. 中介…...

Linux系统(OpenEuler22.03-LTS)部署FastGPT
在 openEuler 22.03 LTS 系统上通过 Docker Compose 安装 FastGPT 的步骤如下: 官方参考文档:https://doc.fastgpt.cn/docs/development/docker/ 1. 安装 Docker 和 Docker Compose 可以参考我之前离线安装Docker的文章:openEuler 22.03 LT…...

Kubernetes控制平面组件:Controller Manager 之 内置Controller详解
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...

结合Splash与Scrapy:高效爬取动态JavaScript网站
在当今的Web开发中,JavaScript的广泛应用使得许多网站的内容无法通过传统的请求-响应模式直接获取。为了解决这个问题,Scrapy开发者经常需要集成像Splash这样的JavaScript渲染引擎。本文将详细介绍Splash JS引擎的工作原理,并探讨如何将其与S…...

用于构建安全AI代理的开源防护系统
大家读完觉得有帮助记得及时关注!!! 大型语言模型(LLMs)已经从简单的聊天机器人演变为能够执行复杂任务的自主代理,例如编辑生产代码、编排工作流程以及基于不受信任的输入(如网页和电子邮件&am…...
算法与数据结构 - 常用图算法总结
在图论中,图算法非常重要,广泛应用于计算机科学、网络分析、社交网络、地理信息系统等领域。下面是一些常用的图算法,按不同功能和应用场景分类: 1. 图的遍历 图遍历算法用于遍历图中的节点和边。主要有两种常见的图遍历方法&am…...

克里金模型+多目标优化+多属性决策!Kriging+NSGAII+熵权TOPSIS!
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 克里金模型多目标优化多属性决策!KrigingNSGAII熵权TOPSIS!!matlab2023b语言运行! 1.克里金模型(Kriging Model)是一种基于空间统计学的插值方法…...

LLM 论文精读(三)Demystifying Long Chain-of-Thought Reasoning in LLMs
这是一篇2025年发表在arxiv中的LLM领域论文,主要描述了长思维链 Long Chain-of-Thought 对LLM的影响,以及其可能的生成机制。通过大量的消融实验证明了以下几点: 与shot CoT 相比,long CoT 的 SFT 可以扩展到更高的性能上限&…...

【Prompt工程—文生图】案例大全
目录 一、人物绘图 二、卡通头像 三、风景图 四、logo设计图 五、动物形象图 六、室内设计图 七、动漫风格 八、二次元图 九、日常场景图 十、古风神化图 十一、游戏场景图 十二、电影大片质感 本文主要介绍了12种不同类型的文生图技巧,通过加入不同的图像…...
本地可执行命令的智能体部署方案
本地可执行命令的智能体部署方案,目标是让大语言模型(LLM)在本地接收自然语言指令,并自动调用系统命令、脚本或应用程序,完成任务自动化。这类系统通常被称为 LLM Agent with Tool Use 或 本地 Agent 实体系统。 &…...

rust程序静态编译的两种方法总结
1. 概述 经过我的探索,总结了两种rust程序静态编译的方法,理论上两种方法都适用于windows、mac os和linux(mac os未验证),实测方法一性能比方法二好,现总结如下,希望能够帮到你. 2.方法一 2.1 添加配置文件 在项目的同级文件夹下新…...
验证码(笔记)
为什么要有验证码: 为什么验证码这么让人厌烦,每个网站还要使用它呢?换句话说,这些网站为什么要“故意为难”用户呢? 其实验证码主要是为了区分用户是计算机还是人。假设一个黑客知道了你的账号,根据账号可…...

【Linux系列】目录大小查看
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

2048游戏(含Python源码)
前言 相关参考游戏: 像素飞机大战(含Python源码)-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/147693018?spm1001.2014.3001.5501使用DeepSeek定制Python小游戏——以“俄罗斯方块”为例-CSDN博客https://blog.csdn.n…...
SwiftData 数据持久化解决方案
什么是 SwiftData? SwiftData 是苹果在 WWDC23 上推出的全新数据持久化框架,它构建在 Core Data 之上,但提供了更加 Swift 友好的 API。SwiftData 旨在简化数据模型的创建和管理,让开发者能够以更少的代码实现强大的数据持久化功…...