探秘 RocketMQ 的 DLedgerServer:MemberState 的技术解析与深度剖析
在 RocketMQ 构建高可靠、强一致性消息系统的架构中,DLedgerServer 扮演着举足轻重的角色,而 MemberState 作为 DLedgerServer 内部用于描述节点状态的核心类,更是整个分布式日志模块稳定运行的关键。深入理解 MemberState 的设计理念、功能特性和工作原理,有助于我们揭开 RocketMQ 高可用背后的技术奥秘。本文将从多个维度对 DLedgerServer 中的 MemberState 进行详细介绍与剖析。
一、MemberState 的基础概念与重要性
MemberState 是 DLedgerServer 用于记录和管理节点状态的核心数据结构,它贯穿于 DLedger 协议的选举、日志同步、故障恢复等各个环节。在基于 Raft 协议的 DLedger 集群中,每个节点都有自己的 MemberState 实例,该实例保存着节点在集群中的角色、选举周期、日志同步进度等关键信息。这些信息的准确维护和及时更新,是保证集群正常运行、实现高可用和数据一致性的基础。无论是节点的选举过程,还是消息的复制与提交,MemberState 都在其中发挥着承上启下的作用,协调着节点之间的协作与交互。
二、MemberState 的核心属性
//deleger 框架的核心配置信息public final DLedgerConfig dLedgerConfig;//一个可重入的锁private final ReentrantLock defaultLock = new ReentrantLock();//server成员的分组信息,一组是有多个Serverprivate final String group;//Server成员自己的idprivate final String selfId;//一组Server里面其他Server的节点信息private final String peers;//server节点当前的角色信息 默认角色是CANDIDATE(候选人)//一开始都是这个CANDIDATE角色 还没有开始选举 等选举完成//就会有LEADER或者FOLLOWER 这两种角色了private volatile Role role = CANDIDATE;//当前server节点所属的分组中learder节点的idprivate volatile String leaderId;//当前term条目private volatile long currTerm = 0;//当前投票给谁当leaderprivate volatile String currVoteFor;//leader结尾的索引 默认是-1private volatile long ledgerEndIndex = -1;//leader结尾的 默认是-1private volatile long ledgerEndTerm = -1;//Server分组中已知道的最大的条目 默认也是-1private long knownMaxTermInGroup = -1;//当前server分组里其他peer节点的信息private Map<String, String> peerMap = new HashMap<>();//当前server分组里peer节点是否存活的映射数据信息private Map<String, Boolean> peersLiveTable = new ConcurrentHashMap<>();//传输者的概念private volatile String transferee;//当前用于获取leader节点的terms条目 默认是-1private volatile long termToTakeLeadership = -1;
核心属性
-
role:该属性用于标识节点在集群中的角色,常见的取值包括Leader、Follower和Candidate。Leader角色的节点负责接收客户端的写请求,并将日志复制到其他Follower节点;Follower节点处于被动状态,接收并存储Leader节点同步过来的日志,响应Leader的心跳和投票请求;Candidate角色则在选举过程中出现,节点在发起选举时会转变为Candidate,尝试获取集群中其他节点的投票以成为新的Leader。例如,在一个新启动的 DLedger 集群中,所有节点初始角色均为Follower,随着选举流程的推进,部分节点会转变为Candidate,最终选举出一个Leader节点
-
currTerm:表示当前的选举周期。在 Raft 协议中,term是一个重要的概念,它用于标识不同的选举阶段,每个term内只会有一个Leader。当节点发起选举时,会将自己的term值加 1,并向其他节点发送投票请求。其他节点在处理投票请求时,会优先考虑term值更高的节点。例如,在一次选举过程中,如果有两个Candidate节点同时发起投票请求,拥有更高term值的节点将更有可能获得其他节点的投票。
-
currVoteFor:记录当前节点在本次选举周期中投票给了哪个节点。该属性确保了每个节点在一个term内只能投一票,并且在选举过程中可以追踪投票的流向。当节点接收到投票请求时,会根据自身的term和voteFor属性来决定是否投票给请求节点。如果请求节点的term大于当前节点的term,且当前节点尚未投票(voteFor为null),则当前节点会将票投给请求节点,并更新voteFor属性。
三、MemberState 的状态转换逻辑
3.1 从 Follower 到 Candidate 的转换
当Follower节点在一定时间内(选举超时时间)没有收到Leader节点的心跳消息时,它会认为Leader可能已经宕机,此时Follower节点会触发选举流程,将自身的MemberState中的role属性从Follower转变为Candidate,同时将term值加 1,并向集群中的其他节点发送投票请求。在发送投票请求时,会携带自身的term、ledgerEndIndex和ledgerEndTerm等信息,以便其他节点进行投票决策。例如,节点 A 作为Follower,在选举超时后,将自己的role设置为Candidate,term从当前的 3 变为 4,并向节点 B、C、D 发送投票请求,请求内容包括 “我是节点 A,term为 4,ledgerEndIndex为 50,ledgerEndTerm为 3,请求投票”。
3.2 从 Candidate 到 Leader 或 Follower 的转换
-
成为 Leader:当Candidate节点在一个选举周期内获得超过半数节点的投票时,它将赢得选举,成为Leader节点。此时,Candidate节点会更新自身MemberState的role为Leader,并开始向其他Follower节点发送心跳消息和日志复制请求。例如,在一个包含 5 个节点的集群中,节点 A 作为Candidate,收到了节点 B、C 的投票,加上自身的一票,共获得 3 票(超过半数),则节点 A 成功当选为Leader,将role设置为Leader,并向节点 B、C、D 发送心跳消息以维持领导地位。
-
重新成为 Follower:如果Candidate节点在选举过程中发现其他节点的term值比自己更高,或者在等待投票的过程中收到了Leader节点的心跳消息,它会意识到已经有其他节点成为了Leader,此时Candidate节点会将自身的role重新设置为Follower,并更新term为更高的term值,以与新的Leader保持一致。例如,节点 A 作为Candidate正在等待投票,此时收到了节点 B(term为 5)发送的心跳消息,而节点 A 的term为 4,那么节点 A 会将自己的role改为Follower,term更新为 5,继续作为Follower接收Leader节点 B 的消息。
3.3 从 Leader 到 Follower 的转换
当Leader节点出现故障,如网络中断、宕机等情况,导致无法正常向Follower节点发送心跳消息和日志复制请求时,Follower节点会在选举超时后发起新一轮选举。如果在新一轮选举中,其他节点当选为新的Leader,原Leader节点在恢复正常后,会发现集群中已经有了新的Leader(通过收到新Leader的心跳消息或投票请求得知),此时原Leader节点会将自身的role从Leader转换为Follower,并更新term和其他相关属性,以适应新的集群状态。
四、MemberState 与 DLedgerServer 其他组件的协同工作
MemberState 与 DLedgerServer 的选举组件、远程通信组件、日志存储组件等密切协作,共同保障 DLedger 集群的正常运行。在选举过程中,选举组件依赖MemberState的属性来判断节点的选举资格和投票决策;远程通信组件在发送和接收消息时,会携带MemberState的相关信息,如节点角色、term等,以便其他节点进行处理;日志存储组件在写入和读取日志时,会与MemberState中的lastLogIndex和lastLogTerm进行交互,确保日志的一致性和完整性。例如,在日志复制过程中,Leader节点的远程通信组件会将MemberState中的ledgerEndIndex和ledgerEndTerm等信息封装到日志复制请求中,发送给Follower节点;Follower节点接收到请求后,会根据自身MemberState的相关属性进行校验,然后将日志写入日志存储组件,并更新自身MemberState的ledgerEndIndex和ledgerEndTerm。
MemberState 作为 RocketMQ 中 DLedgerServer 的核心状态管理类,通过对节点角色、选举周期、日志同步等关键信息的精准维护和高效管理,在集群的选举、日志同步、故障恢复等各个环节中发挥着不可或缺的作用。深入理解 MemberState 的设计和工作原理,不仅有助于我们掌握 RocketMQ 高可用和强一致性的实现机制,还能为在实际应用中优化和调试 DLedger 集群提供有力的支持。随着分布式系统技术的不断发展,相信 MemberState 的设计理念和实现方式也将不断演进和完善,为构建更加可靠、高效的消息系统奠定坚实的基础。
相关文章:
探秘 RocketMQ 的 DLedgerServer:MemberState 的技术解析与深度剖析
在 RocketMQ 构建高可靠、强一致性消息系统的架构中,DLedgerServer 扮演着举足轻重的角色,而 MemberState 作为 DLedgerServer 内部用于描述节点状态的核心类,更是整个分布式日志模块稳定运行的关键。深入理解 MemberState 的设计理念、功能特…...
【计算机网络】HTTP中GET和POST的区别是什么?
从以下几个方面去说明: 1.定义 2.参数传递方式 3.安全性 4.幂等性 1.定义: GET: 获取资源,通常请求数据而不改变服务器的状态。POST: 提交数据到服务器,通常会改变服务器的状态或副作用(如创建或更新资源…...
C++负载均衡远程调用学习之Agent代理模块基础构建
目录 1.课程复习 2.Lars-lbAgentV0.1-udpserver启动 3.Lars-lbAgentV0.1-dns-reporter-client-thread启动 4.Lars-lbAgentV0.1-dns-client实现 5.Lars-lbAgentV0.1-dns-client编译错误修正 6.Lars-lbAgentV0.1-reporter_client实现 1.课程复习 ### 11.2 完成Lars Reactor…...
游戏开发的TypeScript(4)TypeScript 的一些内置函数
在 TypeScript 中,内置函数分为两类:JavaScript 原生函数(TypeScript 继承)和TypeScript 特有函数(类型系统相关)。以下是详细分类介绍: 一、JavaScript 原生函数 TypeScript 继承了所有 Java…...
软考 系统架构设计师系列知识点之杂项集萃(52)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(51) 第82题 以下关于系统性能的叙述中,不正确的是()。 A. 常见的Web服务器性能评估方法有基准测试、压力测试和可靠性测试 B. 评价Web服务器的主…...
大连理工大学选修课——图形学:第五章 二维变换及二维观察
第五章 二维变换及二维观察 二维变换 基本几何变换 图形的几何变换是指对图形的几何信息经过平移、比例、旋转等变换后产生新的图形。 基本几何变换都是相对于坐标原点和坐标轴进行的几何变换。 平移变换 推导: x ′ x T x y ′ y T y xxT_x\\ yyT_y x′xT…...
观察者模式(Observer Pattern)详解
文章目录 1. 什么是观察者模式?2. 为什么需要观察者模式?3. 观察者模式的核心概念4. 观察者模式的结构5. 观察者模式的基本实现简单的气象站示例6. 观察者模式的进阶实现推模型 vs 拉模型6.1 推模型(Push Model)6.2 拉模型(Pull Model)7. 观察者模式的复杂实现7.1 在线商…...
复刻低成本机械臂 SO-ARM100 标定篇
视频讲解: 复刻低成本机械臂 SO-ARM100 标定篇 组装完机械臂后,要进行初始标定,参考github的markdown lerobot/examples/10_use_so100.md at main huggingface/lerobot 只有从臂,所以arms里面只填follower即可 python lerobot…...
idea创建springboot工程-指定阿里云地址创建工程报错
idea创建springboot工程-指定阿里云地址创建工程报错 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】࿱…...
OpenStack HA高可用集群Train版-0集群环境准备
OpenStack HA高可用集群Train版-0集群环境准备 目录 主机配置1.主机名2.网卡配置网卡UUID配置主机名解析配置免密登录防火墙相关配置时间同步配置 二、基础软件安装数据库构建数据库集群设置心跳检测clustercheck准备脚本创建心跳检测用户,(任意控制节点)检测配置文件每个控制节…...
Python3与Dubbo3.1通讯解决方案(dubbo-python)
【文章非VIP可读,如果发现阅读限制为系统自动修改阅读权限,请留言我改回】 概述 最近AI项目需要java与python通讯,两边都是比较新的版本。因此需要双方进行通讯,在这里记录一下所采用的方案和关键点。 JAVA调用Python python通…...
深入探索 Java 区块链技术:从核心原理到企业级实践
一、Java 与区块链的天然契合 1.1 区块链技术的核心特征 区块链作为一种分布式账本技术,其核心特征包括: 去中心化:通过 P2P 网络实现节点自治,消除对中央机构的依赖。不可篡改性:利用哈希链和共识机制确保数据一旦…...
NV214NV217美光闪存固态NV218NV225
NV214NV217美光闪存固态NV218NV225 在当今数据驱动的时代,固态硬盘(SSD)的性能直接决定了计算系统的效率上限。美光科技作为全球存储解决方案的领军者,其NV系列产品凭借尖端技术持续刷新行业标准。本文将围绕NV214、NV217、NV218、…...
第三方组件库:element-uiiviewVant
第三方组件库:element-ui 使用方法: 1.引入样式 <!-- 引入element-ui样式 --><link rel"stylesheet" type"text/css" href"http://unpkg.com/view-design/dist/styles/iview.css">2.引入vue <!-- 引入Vue …...
Qt实现 hello world + 内存泄漏(5)
文章目录 实现hello world的两种方式通过图形化的方式通过纯代码的方式1. 新老头文件的说明2.堆或栈上创建对象的选择3.QString的说明 内存泄漏问题 实现hello world的两种方式 通过图形化的方式 通过图形化的方式,在界面上创建出一个控件,显示出hello …...
13:图像处理—畸变矫正详解
1.制作标定板和描述文件 (用PS软件打印) * 0.00375 mark 点间距 , 不是 点的直径//倒数第二个就是描述文件 gen_caltab(7,7,0.00375,0.5,caltab_30mm.descr,30-30.ps) * 1 比 1 打印 。Photoshop 格式 2.把标定板调正 调正的目的是为了…...
Prompt compress 技术探究-LLMLingua
Prompt summary:是通过精心设计的提示词(prompt)引导大型语言模型(如 GPT-4)生成特定风格或结构的摘要。其目标不仅是压缩信息,还包括满足特定的格式要求、风格偏好或任务需求,所以和一般的文本…...
Python|Pyppeteer实现自动登录小红书(32)
前言 本文是该专栏的第32篇,结合优质项目案例持续分享Pyppeteer的干货知识,记得关注。 本文中,笔者以小红书为例,基于Pyppeteer实现自动登录“小红书”。 需要注意的是,对Pyppeteer不太熟悉的同学,可往前翻阅本专栏前面介绍的Pyppeteer知识点,本专栏将带你了解并熟练使…...
Milvus(13):自定义分析器、过滤器
1 自定义分析器 1.1 标准标记符 Milvus 中的standard 令牌分割器根据空格和标点符号分割文本,适用于大多数语言。要配置使用standard 令牌转换器的分析器,请在analyzer_params 中将tokenizer 设置为standard 。 analyzer_params {"tokenizer&quo…...
调试Cortex-M85 MCU启动汇编和链接命令文件 - 解题一则
调试Cortex-M85 MCU启动汇编和链接命令文件 - 解题一则 苏勇 Andrew, 2025-05 最近在Keil中调试一款新的Cortex-M85内核MCU的SDK代码时,从原有其它芯片的工程中引入了汇编语言编写的启动代码和配套的sct文件,结果总是报错,清理到最后&#…...
SpringMVC——第五章:视图View
一、SpringMVC中视图的实现原理 1.Spring MVC视图支持可配置 在Spring MVC中,视图View是支持定制的,例如我们之前在 springmvc.xml 文件中进行了如下的配置: <!--视图解析器--> <bean id"thymeleafViewResolver" class…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.4 数据重复与去重(IDENTITY COLUMN/UNIQUE约束)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL数据分析实战:数据质量分析之数据重复与去重(IDENTITY COLUMN/UNIQUE约束)3.4 数据重复与去重3.4.1 数据重复的影响与识别3.4.…...
数据分析之药物-基因-代谢物
记录一下最近的数据分析过程: 假如我有一个Dataframe,有两列[Drug, Gene],我想构造一个矩阵,行名为Drug,列名为Gene,值为0或者1,其中0表示药物的靶点是该基因,0表示不是靶点。 &am…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.2 缺失值检测与处理(NULL值填充/删除策略)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 缺失值检测与处理全攻略:NULL值填充与删除策略实战3.2 缺失值检测与处理3.2.1 缺失值类型与业务影响3.2.1.1 缺失值的三种形态3.2.1.2 业务影响分级 3.2.2 缺失值…...
科普简洁版:同态加密——密码学的未来瑰宝
文章目录 一、同态加密的基本概念1.1 什么是同态加密1.2 同态加密的数学本质1.3 同态加密的类型 二、主要同态加密方案详解2.1 ElGamal加密2.2 Paillier加密2.3 Gentry的完全同态加密方案2.4 BGV方案2.5 BFV方案2.6 CKKS方案 三、同态加密的关键技术3.1 噪声管理技术3.2 多项式…...
时序分解 | Matlab基于WOA-MVMD鲸鱼算法优化多元变分模态分解
时序分解 | Matlab基于WOA-MVMD鲸鱼算法优化多元变分模态分解 目录 时序分解 | Matlab基于WOA-MVMD鲸鱼算法优化多元变分模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 WOA-MVMD鲸鱼算法优化多元变分模态分解时间序列信号分解 可直接运行 分解效果好 适合作为创…...
模型部署与提供服务
工具准备 FastApi (提供接口服务) LLamafactory(模型测试) AutoDL-SSH(隧道工具) 结构目录 app ├── api.sh ├── lawbot_infer.py ├── main.py ├── models.py ├── prompts │ ├── chat.jinja2 │ ├── prediction.jinja2 │…...
【Linux】深入理解程序地址空间
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、什么是程序地址空间 二、深入理解程序地址空间 1. 引例 2. 理解地址转化 3. 再谈程序地址空间 4. 补充知识 总结 前言 在现代操作系…...
基于AWS Marketplace的快速解决方案:从选型到部署实战
1. 引言:为什么选择AWS Marketplace? 在数字化转型的背景下,企业需要快速获取成熟的软件工具和服务以降低开发成本。AWS Marketplace 作为亚马逊云科技的官方应用商店,提供超过万款预配置的第三方和AWS原生解决方案,涵…...
Android 常用输入控件
一 控件名称 TextView二 示例代码 <?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.a…...
ubuntu修改时区和设置24小时格式时间
这里写目录标题 一、修改时区二、设置24小时格式时间endl 一、修改时区 使用timedatectl命令更改当前时区为东八区[rootubuntu24-16:~]# timedatectl list-timezones | grep -i shanghai Asia/Shanghai [rootubuntu24-16:~]# timedatectl set-timezone Asia/Shanghai [rootubu…...
Android之Button、ImageButton、ChipGroup用法
一 控件名称及UI代码 Button、ImageButton、ChipGroup <?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app=&qu…...
【中间件】brpc_基础_用户态线程中断
bthread之用户态线程中断 源码 1 简介 interrupt_pthread 核心功能是 通过信号机制中断阻塞的 pthread 线程,以实现线程的协作式中断。 2 核心功能与设计 2.1 信号选择与注册 信号选择:使用 SIGURG 作为中断信号。 原因:SIGURG 通常用于…...
MATLAB中tabulate函数——先验概率的简单估计
load fisheriris X meas(:,1:2); Y species; labels unique(Y); tabulate(Y)ValueCountPercentsetosa5033.33%versicolor5033.33%virginica5033.33%...
修复笔记:SkyReels-V2 项目中的 torch.load 警告
#工作记录 一、问题描述 在运行项目时,出现以下警告: FutureWarning: You are using torch.load with weights_onlyFalse (the current default value), which uses the default pickle module implicitly. It is possible to construct malicious pic…...
[特殊字符] 人工智能大模型之开源大语言模型汇总(国内外开源项目模型汇总) [特殊字符]
Large Language Model (LLM) 即大规模语言模型,是一种基于深度学习的自然语言处理模型,它能够学习到自然语言的语法和语义,从而可以生成人类可读的文本。 所谓 "语言模型",就是只用来处理语言文字(或者符号…...
自监督学习(Self-supervised Learning)李宏毅
目录 Self-supervised Learning简介: BERT : How to use BERT case1:sequence to class 语言积极性OR消极性判断 case2:sequence to sequence句子中的词语词性标注 case3:sequence2 to class两个句子是不是一个为前提一个为…...
数字化时代下,软件测试中的渗透测试是如何保障安全的?
在如今数字化与信息化的时代,软件测试中存在渗透测试,其位置十分重要,它借助模拟恶意攻击的方式,去发现软件系统所存在的漏洞以及安全问题,这是保障软件安全的关键环节,接下来我会对它的各个方面进行详细介…...
内容中台的AI中枢是什么?
智能算法与知识图谱融合引擎 现代内容中台的核心竞争力在于智能算法与知识图谱的深度融合,这种技术组合构建了动态演化的认知网络。通过将机器学习模型与领域知识图谱进行耦合,系统不仅能识别文本、图像、视频等多模态数据的关联特征,还能实…...
PostgreSQL 的 REINDEX 命令
PostgreSQL 的 REINDEX 命令 REINDEX 是 PostgreSQL 中用于重建索引的重要命令,它可以解决索引损坏、索引膨胀或性能下降等问题。 一 REINDEX 基本语法 -- 重建单个索引 REINDEX [ ( option [, ...] ) ] { INDEX | TABLE | SCHEMA } [ CONCURRENTLY ] name REIND…...
GNOME扩展:Bing壁纸
难点 网络请求(Soup) 下载文件(Soup) 读写设置(Gio.Settings) 源码 import GLib from "gi://GLib"; import Gio from gi://Gio; import St from gi://St; import Soup from gi://Soup;import { Extension } from resource:///org/gnome/shell/extensions/extens…...
BUUCTF——Fake XML cookbook
BUUCTF——Fake XML cookbook 进入靶场 只有一个登录框 先弱口令万能密码试一下吧 弱口令和万能密码都失败了 找其他突破口 F12看看 发现xml代码 function doLogin(){var username $("#username").val();var password $("#password").val();if(user…...
【数据结构】线性表--链表
【数据结构】线性表--链表 一.前情回顾二.链表的概念三.链表的实现1.链表结点的结构:2.申请新结点函数:3.尾插函数:4.头插函数:5.尾删函数:6.头删函数:7.在指定结点之前插入:8.在指定结点之后插…...
2022年第十三届蓝桥杯省赛B组Java题解
2022年第十三届蓝桥杯省赛B组Java题解 个人心得: 2022年蓝桥杯省赛Java B组共包含10道题目,其中填空题2道(A、B),编程题8道(C-J)。题目覆盖数论、字符串处理、动态规划、数据结构等核心知识点…...
【操作系统】死锁
1. 定义 死锁是指两个或多个进程(或线程)在执行过程中,因争夺资源而造成的一种僵局,每个进程都无限期地等待其他进程释放它们所持有的资源。在这种情况下,没有任何进程能够继续执行,除非有外部干预。 2. …...
Ubuntu22.04及以上版本buildroot SIGSTKSZ 报错问题
本文提供一种解决 Buildroot SIGSTKSZ 报错途径 解决途径来源参考:Buildroot error when building with Ubuntu 21.10 其出现原因在于 GNU C Library 2.34 release announcement: Add _SC_MINSIGSTKSZ and _SC_SIGSTKSZ. When _DYNAMIC_STACK_SIZE_SOU…...
postgresql数据库基本操作
1. 连接 PostgreSQL 数据库 首先,使用 psql 命令行工具连接到数据库。如果是本地连接,命令格式如下: psql -U postgres -d <数据库名称> -h <主机地址>其中: -U postgres:表示以 postgres 用户身份登录…...
【运维】构建基于Python的自动化运维平台:用Flask和Celery打造高效管理工具
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着企业IT基础设施的复杂性不断增加,手动运维已无法满足高效管理的需求。本文详细介绍如何基于Python构建一个自动化运维平台,利用Flask…...
ES6入门---第三单元 模块三:async、await
async function fn(){ //表示异步:这个函数里面有异步任务 let result await xxx //表示后面结果需要等待 } 读取文件里数据实例: const fs require(fs);//简单封装 fs封装成一个promise const readFile function (fileName){return…...
洛谷 P2866 [USACO06NOV] Bad Hair Day S
题目描述 农夫约翰有 N 头奶牛正在过乱头发节。 每一头牛都站在同一排面朝右,它们被从左到右依次编号为 1,2,⋯,N。编号为 i 的牛身高为 hi。第 N 头牛在最前面,而第 1 头牛在最后面。 对于第 i 头牛前面的第 j 头牛,如果 hi>hi1…...