启程Pulsar:深入剖析高速启动引擎,揭秘消息中间件巨兽的诞生

文章目录

  • 一、简析
  • 二、何时、如何触发启动
  • 三、Broker启动流程
  • 四、总结

一、简析

Broker的启动流程框架基本如下

  1. 触发启动
  2. 初始化
    • 读取配置、检测、赋值
  3. 启动
    1. Bookie启动
    2. Broker启动
      1. 启动Netty
      2. 启动后台监控任务

二、何时、如何触发启动

Broker的启动基本都是靠维护人员主动触发的,入口是Broker提供的脚本 bin/pulsarbin/pulsar-daemon。常见的启动指令有 bin/pulsar standalonebin/pulsar brokerbin/pulsar-daemon start broker等,今天就从bin/pulsar broker流程进行探讨。先来看看bin/pulsar的脚本逻辑

pulsar_help() {cat <<EOF
//在这里可以看到pulsar支持的操作,当然也可以通过bin/pulsar  help 指令进行查看
Usage: pulsar <command>
where command is one of://启动Broker服务broker              Run a broker server//启动bookie服务bookie              Run a bookie serverzookeeper           Run a zookeeper serverconfiguration-store Run a configuration-store serverdiscovery           Run a discovery serverproxy               Run a pulsar proxywebsocket           Run a web socket proxy serverfunctions-worker    Run a functions worker serversql-worker          Run a sql worker serversql                 Run sql CLIstandalone          Run a broker server with local bookies and local zookeeperautorecovery        Run an autorecovery service....
}//如果执行的是bin/pulsar broker则会走到这里,可以清楚的看到最终会调用PulsarBrokerStarter类进行启动
if [ $COMMAND == "broker" ]; thenPULSAR_LOG_FILE=${PULSAR_LOG_FILE:-"pulsar-broker.log"}exec $JAVA $LOG4J2_SHUTDOWN_HOOK_DISABLED $OPTS -Dpulsar.log.file=$PULSAR_LOG_FILE org.apache.pulsar.PulsarBrokerStarter --broker-conf $PULSAR_BROKER_CONF $@
elif [ $COMMAND == "bookie" ]; thenPULSAR_LOG_FILE=${PULSAR_LOG_FILE:-"bookkeeper.log"}exec $JAVA $OPTS -Dpulsar.log.file=$PULSAR_LOG_FILE org.apache.bookkeeper.server.Main --conf $PULSAR_BOOKKEEPER_CONF $@

三、Broker启动流程

通过脚本能够看到是通过PulsarBrokerStarter进行启动,因此现在就直接从它的main方法进行跟踪吧

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里的初始化和启动两条链路都值得看,首先跟踪下初始化Broker的链路

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到初始化的过程中分别做了 配置加载、初始化Broker、初始化Bookkeeper以及AutoRecoveryMain服务等。接下来就就看服务启动链路。

可以看到启动入口很简洁,就是启动上面初始化好的Broker、Bookkeeper、AutoRecoveryMain,这里先看Broker的启动流程也就是276行

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到这个方法非常大,里面内容非常丰富,一起来详细看看

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

简单总结下这个方法,它主要创建了以下几个对象

  • CoordinationServiceImpl对象,用于协调Broker选主

  • BrokerService对象,这个是启动Broker对象的核心

  • LoadManager对象,用于管理Broker对象的负载均衡

  • SchemaStorage对象,负责处理读写schema的请求

  • OffloadPoliciesImpl,负责分层存储操作

  • 并启动WebService服务,负责对外提供http服务

  • WorkerService服务,负责处理function计算操作

这里面的BrokerService是最核心的,在这里进去看下它创建的逻辑

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此方法主要做了下面几件事

  • 创建Netty服务端,用于处理生产者/消费者/代理的TCP请求
  • 创建定期检测服务
    • 不活跃的检测
    • 消息过期检测
    • 压缩检测
    • 消费者检测
  • 初始化五个Map容器
    • 维护Topic对象
    • 维护集群副本复制的客户端
    • 维护连接当前Broker的管理流
    • 维护Topic归属信息
    • 维护多层级的Topic信息?
  • 启动DelayedDeliveryTrackerLoader跟踪延迟消息
  • 启动Broker拦截器BrokerEntryMetadataInterceptors
  • 启动限额管理对象BundlesQuotas

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 启动Netty服务端(此时Pulsar服务具备处理所有客户端请求能力)
  • 启动定期检测服务
    • 不活跃的检测
    • 消息过期检测
    • 压缩检测
    • 消费者检测
    • 消息积压检测

四、总结

PulsarService是Pulsar服务启动的核心类,其内置了七大重要的对象如下图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • BrokerService: 核心是启动Netty,处理客户端的TCP连接,同时通过多个Map容器维护例如Topic信息、Topic归属信息等等,除此之外还启动一批定时线程定期检测(消息过期、压缩、客户端活跃等)
  • LoadManager: 负责处理Broker服务的负载均衡
  • WebService: 对外提供HTTP服务,例如管理流的操作(元数据)等
  • CoordinationService: 给Broker提供协调服务,例如Broker选主操作
  • SchemaStorage: 提供schema相关的一切服务,常见的就是schema的读写
  • OffloadPolicies: 提供分层存储,冷数据自动迁移到外部服务中
  • WorkerService: 管理Worker实例,用来执行Function计算任务

以上就是Pulsar启动流程所做的事情,其中Bookkeeper的启动以及其余的功能例如CoordinationService、SchemaStorage等等都值得单独新开一篇文章进行讲解,这里就不混在一起讲了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/54183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五大注入攻击网络安全类型介绍

1. SQL注入&#xff08;SQL Injection&#xff09; SQL注入流程 1.1. 概述 SQL注入是最常见的注入攻击类型之一&#xff0c;攻击者通过在输入字段中插入恶意的SQL代码来改变原本的SQL逻辑或执行额外的SQL语句&#xff0c;来操控数据库执行未授权的操作&#xff08;如拖库、获取…

极光参展2024年服贸会并荣获“年度出海领航企业”荣誉

近日&#xff0c;由商务部和北京市人民政府共同主办的2024年中国国际服务贸易交易会&#xff08;以下简称&#xff1a;服贸会&#xff09;圆满落下帷幕。领先的客户互动和营销科技服务商&#xff0c;极光&#xff08;Aurora Mobile&#xff0c;纳斯达克股票代码&#xff1a;JG&…

《JavaEE进阶》----15.<Spring Boot 日志>

本篇文章将记录我学习SpringBoot日志 1.日志文件的用途 2.SpringBoot日志文件的配置 3.用lombook依赖引入Slf4j注解&#xff0c;从而引入log对象。方便我们打印日志。 一、日志的作用 日志主要是为了发现问题、分析问题、定位问题。除此之外、日志还有许多其他的用途。 1.系统监…

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3568移植案例(下)

往期知识点记录&#xff1a; OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——轻量系统STM32F407芯片移植案例 OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——Combo解决方案之W800芯片移植案例 OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——小型系统STM32M…

leetcode:验证回文串

[题目链接] string func(string s)//先将大写转换成小写&#xff0c;并且去除空格等&#xff0c;只保留小写字母 {string tmp;string::iterator it s.begin();while (it ! s.end()){//大写字母if (*it < 90 && *it>65)//A-Z的ASCII码为65-90{tmp *it 32;//a-z…

蓝桥杯DS18B20程序源码

蓝桥杯DS18B20程序源码解析 蓝桥杯&#xff0c;作为一项全国瞩目的电子设计竞赛&#xff0c;其核心挑战在于参赛者需深度融合单片机编程与各类电子元件的应用能力。在众多项目中&#xff0c;涉及DS18B20数字温度传感器的程序源码尤为引人注目&#xff0c;它巧妙地将单片机技术…

【JAVA基础】实现Tomcat基本功能

文章目录 TCP/IP协议Socket编程ServletTomcat 在搜索了两三天之后&#xff0c;也是大概弄懂了Tomcat是个什么东西&#xff0c;我们在说Tomcat之前&#xff0c;先来了解一下下面这三个东西&#xff1a; TCP/IP协议 TCP/IP 是互联网通信的基础协议。TCP&#xff08;传输控制协议…

Java | Leetcode Java题解之第405题数字转换为十六进制数

题目&#xff1a; 题解&#xff1a; class Solution {public String toHex(int num) {if (num 0) {return "0";}StringBuffer sb new StringBuffer();for (int i 7; i > 0; i --) {int val (num >> (4 * i)) & 0xf;if (sb.length() > 0 || val …

开发后台管理系统-开发环境搭建

文章目录 需求设计环境搭建创建项目工程测试结果 安装Element Plus安装路由安装Vue Router配置Vue Router 测试 需求 开发一个后台管理系统 这里以CDN后台管理系统为例 设计 参照 CDN后台管理系统功能说明文档 环境搭建 确保已经安装了Node.js和npm 执行 npm install -g vu…

映射map

Hello,大家好&#xff0c;我是菜就多练&#xff0c;输不起就别玩&#xff0c;今天我们来讲映射。 由于近期有事&#xff0c;所以停更了一段时间&#xff0c;请大家谅解。 在 C 标准模板库&#xff08;STL&#xff09;中&#xff0c;map 是一种关联容器&#xff0c;它存储键值…

Android 12系统源码_窗口管理(八)WindowConfiguration的作用

前言 在Android系统中WindowConfiguration这个类用于管理与窗口相关的设置&#xff0c;该类存储了当前窗口的显示区域、屏幕的旋转方向、窗口模式等参数&#xff0c;应用程序通过该类提供的信息可以更好的适配不同的屏幕布局和窗口环境&#xff0c;以提高用户体验。 一、类定…

水库监测布点的核心要求与策略解析

在水库的安全监测体系中&#xff0c;监测点位的合理布置是确保数据准确性和监测效果的关键。涵盖了常规监测、形变监控、应力分析以及地质灾害预警等多个维度&#xff0c;其中&#xff0c;形变监测尤为关键&#xff0c;直接关乎大坝的安全状态。形变监测通过测斜仪相关的传感器…

Qt开发技巧(四)“tr“使用,时间类使用,Qt容器取值,类对象的删除,QPainter画家类,QString的转换,用好 QVariant类型

继续讲一些Qt技巧操作 1.非必要不用"tr" 如果程序运行场景确定是某一固定语言&#xff0c;就不需要用tr,"tr"之主要针对多语种翻译的&#xff0c;因为tr的本意是包含英文&#xff0c;然后翻译到其他语言比如中文&#xff0c;不要滥用tr&#xff0c;如果没有…

【渗透测试】——DVWA靶场搭建

&#x1f4d6; 前言&#xff1a;DVWA&#xff08;Damn Vulnerable Web Application&#xff09;是一个用于安全漏洞测试的 PHP/MySQL 网络应用&#xff0c;旨在为安全专业人士提供一个合法的环境&#xff0c;以测试他们的技能和工具&#xff0c;同时帮助 Web 开发者更好地理解 …

大棚分割数据集,40765对影像,16.9g数据量,0.8米高分二,纯手工标注(arcgis标注)的大规模农业大棚分割数据集。

数据集名称&#xff1a; &#xff09;“Greenhouse Segmentation Dataset (GSD)” 数据集规模&#xff1a; 包含40,765对用于大棚分割的影像数据&#xff0c;每对影像包括一张原始图像和相应的分割标签图。 数据量&#xff1a; 总数据量约为16.9GB&#xff0c;适合存储在现…

【数据仓库】数据仓库常见的数据模型——维度模型

文章部分图参考自&#xff1a;多维数据模型各种类型&#xff08;星型、雪花、星座、交叉连接&#xff09; - 知乎 (zhihu.com) 文章部分文字canla一篇文章搞懂数据仓库&#xff1a;四种常见数据模型&#xff08;维度模型、范式模型等&#xff09;-腾讯云开发者社区-腾讯云 (ten…

第14章 存储器的保护

第14章 存储器的保护 该章主要介绍了GDT、代码段、数据段、栈段等的访问保护机制。 存储器的保护功能可以禁止程序的非法内存访问。利用存储器的保护功能&#xff0c;也可以实现一些有价值的功能&#xff0c;比如虚拟内存管理。 代码清单14-1 该章节的代码主要实现的功能就…

详解Transformer位置编码Positional Encoding

提到 Transformer&#xff0c;大家就会联想到位置编码、注意力机制、编码器-解码器结构&#xff0c;本系列教程将探索 Transformer 的不同模块在故障诊断等信号分类任务中扮演什么样角色&#xff0c;到底哪些模块起作用&#xff1f; 前言 本期基于凯斯西储大学&#xff08;CWR…

Qt QSerialPort数据发送和接收DataComm

文章目录 Qt QSerialPort数据发送和接收DataComm2.添加 Qt Serial Port 模块3.实例源码 Qt QSerialPort数据发送和接收DataComm Qt 框架的Qt Serial Port 模块提供了访问串口的基本功能&#xff0c;包括串口通信参数配置和数据读写&#xff0c;使用 Qt Serial Port 模块就可以…

C# WinForm 中 DataGridView 实现单元格cell 能进编辑状态但是不能修改单元格的效果

在Windows Forms&#xff08;WinForms&#xff09;开发中&#xff0c;DataGridView 控件是一个功能强大的组件&#xff0c; 用于显示和管理表格数据。无论是展示大量数据&#xff0c;还是实现交互式的数据操作&#xff0c; DataGridView 都能提供多样的功能支持&#xff0c;比如…