Pulsar-架构与设计
Pulsar架构与设计
- 一、背景和起源
- 二、框架概述
- 1.设计特点
- 2.框架适用场景
- 三、架构图
- 1.Broker
- 2.持久化存储(Persistent storage)
- 3.Pulsar元数据(Metadata store)
- 四、功能特性
- 1.消息顺序性
- 2.消息回溯
- 3.消息去重
- 4.消息重投递
- 5.消息重试
- 6.消息TTL
- 7.延迟队列
- 8.重试队列
- 9.死信队列
- 10.消息语义
- 五、设计原理
- 1.消息去重
- 2.消息重试
- 3.延迟队列
- 4.消费订阅模式
- 4.1 独享模式
- 4.2 灾备模式
- 4.3 共享模式
- 4.4 Key共享模式
- 5.生产访问模式
- 5.1 共享模式
- 5.2 独占模式
- 5.3 独占屏蔽模式
- 5.4 等待独占模式
- 总结
- 参考链接
一、背景和起源
随着云原生的兴起,对消息中间件的伸缩性和多租户隔离有了更高的要求。现有的消息中间件不支持多租户的隔离,但是有一定伸缩性,需要一定的迁移工具支持和手工操作。
Pulsar是下一代云原生分布式消息平台,采用存储和计算分离架构设计,支持弹性伸缩,支持多租户、持久化存储、多机房跨区域数据复制。
二、框架概述
1.设计特点
- 下一代云原生分布式消息流平台
- 单实例支持多集群,支持跨机房在集群间消息复制
- 极低的发布延迟和端到端延迟
- 支持超过百万的消息主题。
- 支持多种消息订阅模式(独占、共享和故障转移)
- 由BookKeeper 提供的持久化消息存储机制保证消息传递
- 由轻量级的 serverless 计算框架 Pulsar Functions 实现流原生的数据处理。
- 基于 Pulsar Functions 的 Server less connector 框架 Pulsar IO 使得数据更易移入、移出
Apache Pulsar。 - 支持冷热数据分级存储
2.框架适用场景
- 适用于多租户、云服务场景
- 适用于业务波动比较大、需要弹性伸缩场景
三、架构图
一个Pulsar实例有多个Pulsar Cluster组成,Pulsar Cluster之间可以进行消息复制。
Pulsar Cluster整体架构和组成如下,其中Broker为无状态服务,用于发布和消费消息,BookKeeper用于存储。
- Broker集群:用于处理producer发出的消息;将消息存储到BookKeeper集群;将消息分配给consumer;处理集群协调任务。
- BookKeeper集群:用于消息持久化存储。
- Zookeeper集群:用于处理多个Pulsar集群之间的协调任务。
1.Broker
主要包含以下部分:
- HTTP服务器:主要是提供系统管理接口、topic查找接口
- Dispatcher:异步TCP服务器,用于数据传输
- Managed Ledger:用于缓存从BookKeeper读取的消息
Broker是无状态服务的计算节点;可以通过增加Broker来增加系统的吞吐量;某个Broker节点负载过高,可以将负载迁移到其他Broker节点。
2.持久化存储(Persistent storage)
Pulsar采用BookKeeper作为持久化存储组件。其中Bookie为数据的存储节点,采用分片机制。Bookie支持扩缩容,在扩容过程中不需要将已持久化数据迁移到新存储节点。
3.Pulsar元数据(Metadata store)
Pulsar元数据和BookKeeper元数据可以共享一个Zookeeper集群,也可以使用不同集群。Pulsar使用Zookeeper来进行元数据存储、集群配置和协调。
四、功能特性
1.消息顺序性
可以支持分区顺序性,生产者通过指定的key将消息发送到固定分区,消息订阅模式需要选择独享模式、灾备模式、key共享模式。
2.消息回溯
pulsar默认删除已经被所有Consumer确认消费完成消息,可以通过配置保留已经被消费完成的消息。
3.消息去重
通过服务器设置可以保证消息不会重复持久化存储,保证存储的幂等。
4.消息重投递
消息投递失败,会进行重新投递
5.消息重试
消息消费失败后消息会重新消费
6.消息TTL
支持消息生存期
7.延迟队列
支持任意时间延迟的消息
8.重试队列
重试队列是消费失败后,消息会重新投递到此队列,重试队列按照消费组进行设置的。
9.死信队列
重试次数达到一定次数后,会将消息投递此队列
10.消息语义
支持Exactly Once消息语义,消息确定被写入一次。producer保存发送失败消息再次发送,服务端保证重试多条消息只存储一次。
五、设计原理
1.消息去重
消息去重是指即使消息被Producer多次投递到Broker,也只会被持久化一次。Pulsar可以通过Broker配置开启消息去重功能,不需要应该代码去保证。
实现原理:
- Producer每个消息都有一个递增的唯一SequenceId
- Broker针对每个Producer保存已经接受到的最大SequenceId和已经持久化的最大SequenceId
- Broker接收的消息中SequenceId大于以上SequenceId,则正常处理;如果小于或者等于则为重复消息,直接返回Ack确认
2.消息重试
如果消费组中设置消息主题可以重试,则会(以主题和消费组为度)创建重试队列和死信队列;其中重试队列名称格式为--RETRY;死信队列名称格式为--DLQ;
整体流程为:
- 消费失败后,会将消息作为延迟消息重新投递到重试队列,利用延迟消息特性使Consumer延后一段时间重新消费
- 如果重新投递到重试队列超过一定次数,则会把消息投递到死信队列
3.延迟队列
Broker针对topic每个分区,按照subscription维度维护了DelayedDeliveryTracker优先级队列,队列中以消息的延迟投递时间进行升序排列。
- 延迟消息投递到Broker后,不用特殊处理直接持久化
- 消费时,优先检测DelayedDeliveryTracker是否有消息需要消费(延迟投递时间已到);如有则消费;如果没有则消费正常队列消息
- 消费正常队列消息,如果消息为延迟消息,则需要把消息索引存入到DelayedDeliveryTracker优先级队列
注意:只有在共享模式和key共享模式才支持延迟队列
4.消费订阅模式
pulsar总共有四种消费订阅模式:独享模式、灾备模式、共享模式和Key共享模式;
4.1 独享模式
此模式下,一个topic的某个消费组中只有一个消费者;即使topic进行了分区,所有分区也是共享同一个消费者。
此模式可以保证全局消息顺序性。
4.2 灾备模式
此模式下,一个topic可以对应多个消费者,但是只有master consumer可以消费,当master出现异常会由其他消费者进行消费。如果topic进行了分区,则每个分区都会对应一个master消费者和多个备用消费者。
此模式可以保证分区消息顺序性。
此模式下分区topic和master消费者之间分配图:
4.3 共享模式
此模式一个分区对应多个消费者,每个消费者处理分区中的一部分数据,消费者数量可以大于分区数量。此模式下可以通过增加消费者来提高消费速度。
4.4 Key共享模式
此模式一个分区对应多个消费者,每个消费者处理分区中的一部分数据,具有相同Key的消息会分派给相同Consumer处理。此模式下可以通过增加消费者来提高消费速度。
5.生产访问模式
pulsar总共有四种生产访问模式:共享模式、独占模式、独占屏蔽模式、等待独占模式;
5.1 共享模式
一个Topic可以有多个生产者
5.2 独占模式
一个Topic只能有一个生产者,新生产者连接到topic会直接报错
5.3 独占屏蔽模式
一个Topic只能有一个生产者,新生产者连接Topic,原有的生产者会被断开连接
5.4 等待独占模式
一个Topic只能有一个生产者,新的生产者连接topic会被挂起,直到生产者获取独占访问权。
总结
作为下一代云原生消息队列,Pulsar采用存储和计算分离的架构设计,具有很好的弹性伸缩能力。Pulsar单个实例可以部署多个Pulsar集群,支持多租户、持久化存储、多机房跨区域数据复制。本文主要是介绍一下Pulsar的架构和特性,后续还会对Pulsar进行近一步研读。
参考链接
1.Pulsar简介
2.Pulsar架构
3.Pulsar生产消费
相关文章:

Pulsar-架构与设计
Pulsar架构与设计 一、背景和起源二、框架概述1.设计特点2.框架适用场景 三、架构图1.Broker2.持久化存储(Persistent storage)3.Pulsar元数据(Metadata store) 四、功能特性1.消息顺序性2.消息回溯3.消息去重4.消息重投递5.消息重…...
LeetCode每日一题589. N-ary Tree Preorder Traversal
文章目录 一、题目二、题解 一、题目 Given the root of an n-ary tree, return the preorder traversal of its nodes’ values. Nary-Tree input serialization is represented in their level order traversal. Each group of children is separated by the null value (S…...
html5移动端适配;检测浏览器信息函数
html5移动端适配 //动态改变font-size大小 (function changeFontSize() {let resizeEvt orientationchange in window ? orientationchange : resizeif (!isPC()) {let docEl document.documentElement;// recalc function () {let clientWidth docEl.clientWidth;docEl.…...
go依赖注入库samber/do使用
英语版本 介绍 以简单和高效而闻名的Go语言在其1.18版本中引入了泛型,这可以显着减少大量代码生成的需要,使该语言更加强大和灵活。如果您有兴趣, Go 泛型教程 是很好的学习资源。 通过使用 Go 的泛型,samber/do库为依赖注入 (…...

JMeter 配置元件之按条件读取CSV Data Set Config
实践环境 win10 JMeter 5.4.1 需求描述 需求是这样的,需要压测某个接口(取消分配接口),请求这个接口之前,需要先登录系统(物流WMS系统),并在登录后,选择并进入需要操作的仓库,然后请求接口,…...

MySQL跨服务器关联查询
1. 首先确认服务器的Federated引擎是否开启 show engines;修改数据库的配制文件my.ini,(我的my.ini的路径为:D:\ProgramData\MySQL\MySQL Server 5.7/my.ini),将federated添加到my.ini文件中 到MySQL的my.cnf配置文件中修改 在 [mysqld] 下方加入 federated 然后重…...

分库分表浅析
简介 对于任何系统而言,都会设计到数据库随着时间增长而累积越来越多的数据,系统也因为越来越多的需求变迁导致原有的设计不再满足现状,为了解决这些问题,分库分表就会走进视野,带着几个问题走入分库分表。 什么是分…...

java 宠物医院系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目
一、源码特点 java 宠物医院系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…...

XMall 开源商城 SQL注入漏洞复现(CVE-2024-24112)
0x01 产品简介 XMall 开源电商商城 是开发者Exrick的一款基于SOA架构的分布式电商购物商城 前后端分离 前台商城:Vue全家桶 后台管理:Dubbo/SSM/Elasticsearch/Redis/MySQL/ActiveMQ/Shiro/Zookeeper等。 0x02 漏洞概述 XMall 开源商城 /item/list、/item/listSearch、/sys/…...

Docker原理及概念相关
Docker最核心的组件 image:镜像,构建容器,也可以通过Dockerfile文本描述镜像的内容。 (我们将应用程序运行所需的环境,打包为镜像文件) Container:容器 (你的应用程序,就跑在容器中 ) 镜像仓库(dockerhub)(…...
Vim相关配置
记录一下有关vim的一些设置,以免电脑寄了不好重新配置 vscodevim 首先是vscode中的vim模式 在应用商店中搜索vim插件安装即可 然后在setting中添加以下有关vim 的配置 "vim.easymotion": true,"vim.surround": true,"vim.incsearch"…...

ARMv8-AArch64 的异常处理模型详解之异常处理详解(进入异常以及异常路由)
在上篇文章 ARMv8-AArch64 的异常处理模型详解之异常处理概述Handling exceptions中,作者对异常处理整体流程以及相关概念做了梳理。接下来,本文将详细介绍处理器在获取异常、异常处理以及异常返回等过程中都做了哪些工作。 ARMv8-AArch64 的异常处理模型…...

unity学习(19)——客户端与服务器合力完成注册功能(1)入门准备
逆向服务器用了三天的时间,但此时觉得一切都值,又可以继续学习了。 服务器中登录请求和注册请求由command变量进行区分,上一层的type变量都是login。 public void process(Session session, SocketModel model) {switch (model.Command){ca…...

论文精读--对比学习论文综述
InstDisc 提出了个体判别任务,而且利用这个代理任务与NCE Loss去做对比学习从而得到了不错的无监督表征学习的结果;同时提出了别的数据结构——Memory Bank来存储大量负样本;解决如何对特征进行动量式的更新 翻译: 有监督学习的…...

文章复现 | 差异分析和PPI网络构建
原文链接:差异分析和PPI网路图绘制教程 写在前面 在原文中,作者获得285个DEG,在此推文中共获得601个DEG。小杜的猜想是标准化的水段不同的原因吧,或是其他的原因。此外,惊奇的发现发表医学类的文章在附件中都不提供相…...

入门级10寸加固行业平板—EM-I10J
亿道信息以其坚固耐用的智能终端设备而闻名,近日发布了一款理想入门级 10 英寸加固平板电脑—I10J。 EM-I10J 这是一款 10 英寸的平板电脑,主要运行 Windows 10操作系统,带有硬化塑料外壳,具有 IP65 防水防尘功能和 MIL-STD 8…...

gem5 garnet 合成流量: packet注入流程
代码流程 下图就是全部. 剩下文字部分是细节补充,但是内容不变: bash调用python,用python配置好configuration, 一个cpu每个tick运行一次,requestport发出pkt. bash 启动 python文件并配置 ./build/NULL/gem5.debug configs/example/garnet_synth_traffic.py \--num-cpus…...

java实现排序算法(上)
排序算法 冒泡排序 时间和空间复杂度 要点 每轮冒泡不断地比较比较相邻的两个元素,如果它们是逆序的,则需要交换它们的位置下一轮冒泡,可以调整未排序的右边界,减少不必要比较 代码 public static int[] test(int[] array) {// 外层循环控制遍历次数for (int i 0; i <…...

「算法」滑动窗口
前言 算法需要多刷题积累经验,所以我行文重心在于分析解题思路,理论知识部分会相对简略一些 正文 滑动窗口属于双指针,这两个指针是同向前行,它们所夹的区间就称为“窗口” 啥时候用滑动窗口? 题目涉及到“子序列…...

Windows11(非WSL)安装Installing llama-cpp-python with GPU Support
直接安装,只支持CPU。想支持GPU,麻烦一些。 1. 安装CUDA Toolkit (NVIDIA CUDA Toolkit (available at https://developer.nvidia.com/cuda-downloads) 2. 安装如下物件: gitpythoncmakeVisual Studio Community (make sure you install t…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...