当前位置: 首页 > news >正文

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 <…...

「算法」滑动窗口

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

Windows11(非WSL)安装Installing llama-cpp-python with GPU Support

直接安装&#xff0c;只支持CPU。想支持GPU&#xff0c;麻烦一些。 1. 安装CUDA Toolkit (NVIDIA CUDA Toolkit (available at https://developer.nvidia.com/cuda-downloads) 2. 安装如下物件&#xff1a; gitpythoncmakeVisual Studio Community (make sure you install t…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...