【Kafka专栏 08】ZooKeeper的Watch机制:不就是个“小喇叭”吗?
作者名称:夏之以寒
作者简介:专注于Java和大数据领域,致力于探索技术的边界,分享前沿的实践和洞见
文章专栏:夏之以寒-kafka专栏
专栏介绍:本专栏旨在以浅显易懂的方式介绍Kafka的基本概念、核心组件和使用场景,一步步构建起消息队列和流处理的知识体系,无论是对分布式系统感兴趣,还是准备在大数据领域迈出第一步,本专栏都提供所需的一切资源、指导,以及相关面试题,立刻免费订阅,开启Kafka学习之旅!
文章目录
- ZooKeeper的Watch机制:不就是个“小喇叭”吗?
- 01 引言
- 02 Watch机制的作用
- 2.1 实时感知节点变化
- 2.1.1 实时感知状态变化
- 2.1.2 触发相应的处理措施
- 2.1.3 减少轮询开销
- 2.1.4 支持复杂的分布式协同
- 2.1.5 容错和鲁棒性
- 2.1.6 扩展性和可伸缩性
- 2.2 触发回调处理
- 2.2.1 实时性
- 2.2.2 灵活性
- 2.2.3 可扩展性
- 2.2.4 可维护性
- 2.3 降低网络开销
- 03 Watch机制的实现原理
- 3.1 数据结构
- 3.2 一次性触发
- 3.3 异步发送通知
- 3.3.1 异步发送通知
- 3.3.2 提高并发处理能力**:
- 3.3.3 提高响应速度
- 3.3.4 顺序保证
- 04 Watch机制的使用场景
- 4.1 分布式配置管理
- 4.2 分布式锁
- 4.3 分布式协调
- 05 总结
ZooKeeper的Watch机制:不就是个“小喇叭”吗?
01 引言
ZooKeeper是一个分布式协调服务框架,用于维护配置信息、命名、提供分布式同步和提供组服务等。在ZooKeeper中,一个非常重要的功能就是Watch机制。Watch机制允许ZooKeeper客户端在某个ZNode(ZooKeeper中的数据节点)上注册一个监听器,当这个ZNode发生变化(如数据变更、子节点增减、节点删除等)时,ZooKeeper服务端会主动通知所有注册了该ZNode的Watch的客户端,告知它们ZNode的状态已经发生了变化。这种机制为分布式系统中的多个节点之间提供了实时感知对方状态变化的能力,从而保证了系统的协调性和一致性。
02 Watch机制的作用
2.1 实时感知节点变化
在分布式系统中,由于节点之间的通信和协作是异步的,因此如何实时感知到系统中其他节点的状态变化是一个关键问题。ZooKeeper的Watch机制正好解决了这个问题。通过注册Watch,客户端可以实时感知到它所关注的ZNode的状态变化,从而采取相应的处理措施。这种机制确保了分布式系统中各个节点之间的协同工作能够顺利进行。
以下是Watch机制如何确保分布式系统中各个节点之间协同工作能够顺利进行的详细解释:
2.1.1 实时感知状态变化
通过在ZNode上注册Watch,客户端能够实时地感知到该ZNode的状态变化。这种感知是实时的,因为一旦状态发生变化,服务端会立即发送通知给所有相关的客户端。
2.1.2 触发相应的处理措施
当客户端收到状态变化的通知后,它可以触发相应的处理措施。这些措施可能包括重新加载配置、执行某项任务、通知其他组件等。这种基于事件的响应方式使得客户端能够根据系统的实时状态来做出决策。
2.1.3 减少轮询开销
在没有Watch机制的情况下,客户端可能需要定期轮询ZooKeeper来获取ZNode的状态变化。这种方式不仅效率低下,而且会给ZooKeeper服务端带来额外的负载。而Watch机制允许客户端在状态发生变化时立即获得通知,从而避免了不必要的轮询开销。
2.1.4 支持复杂的分布式协同
通过在多个ZNode上注册Watch,客户端可以构建复杂的分布式协同逻辑。例如,一个分布式系统可能使用ZooKeeper来实现领导选举、分布式锁、服务发现等功能,而这些功能通常都需要实时感知其他节点的状态变化。
2.1.5 容错和鲁棒性
由于ZooKeeper客户端与服务端之间的连接是长连接的,且Watch机制是基于这种连接来实现的,因此它具有一定的容错能力。即使某个客户端暂时与ZooKeeper服务端失去了连接,只要连接恢复,它仍然可以重新注册Watch并继续接收状态变化的通知。
2.1.6 扩展性和可伸缩性
Watch机制是ZooKeeper分布式协调服务框架的一部分,它本身具有良好的扩展性和可伸缩性。随着分布式系统规模的扩大和节点数量的增加,ZooKeeper可以通过增加更多的服务器来提供更高性能的服务,而Watch机制仍然能够保持其高效性和实时性。
2.2 触发回调处理
当ZNode的状态发生变化时,ZooKeeper服务端会主动向注册了该ZNode的Watch的客户端发送通知。客户端在接收到通知后,可以触发相应的回调处理函数,执行相应的操作。这种回调处理机制使得客户端能够灵活地处理ZNode状态变化带来的各种情况,提高了系统的可扩展性和可维护性。
在ZooKeeper中,当ZNode(ZooKeeper中的数据节点)的状态发生变化时,ZooKeeper服务端会主动向之前注册了该ZNode的Watch的客户端发送通知。这种机制是ZooKeeper的核心特性之一,它允许客户端实时地感知到ZNode的状态变动,并据此触发相应的处理逻辑。
具体来说,当客户端对某个ZNode执行了读取操作(如getData
、getChildren
等)并设置了Watch时,ZooKeeper服务端会记住这个客户端与ZNode的关联关系。此后,一旦该ZNode的状态发生变化(例如数据内容被修改、子节点被添加或删除、节点本身被删除等),服务端就会触发事件,并将通知发送给所有之前注册了Watch的客户端。
客户端在接收到服务端发送的通知后,可以编写相应的回调处理函数(Callback Handler)来执行特定的操作。这些操作可能包括重新读取ZNode的最新状态、触发某个业务流程、更新本地缓存等。由于ZooKeeper的通知是事件驱动的,客户端可以根据实际需求灵活地处理这些事件,而无需持续轮询ZNode的状态。
这种回调处理机制为分布式系统带来了诸多好处:
2.2.1 实时性
客户端能够立即感知到ZNode的状态变化,从而迅速做出响应。这对于需要实时同步数据的分布式系统来说至关重要。
2.2.2 灵活性
客户端可以根据具体的业务逻辑来编写回调处理函数,处理各种可能的ZNode状态变化。这种灵活性使得ZooKeeper能够适用于各种不同的分布式应用场景。
2.2.3 可扩展性
由于客户端是根据通知来触发操作的,而不是通过轮询来检查状态变化,因此系统可以更加高效地利用资源。当分布式系统规模扩大时,ZooKeeper服务端可以通过增加节点来提供更高的处理能力,而客户端的回调处理机制仍然能够保持高效。
2.2.4 可维护性
通过明确的回调处理逻辑,客户端代码更加清晰、易于理解和维护。当系统出现故障或需要调整时,开发人员可以快速地定位问题并采取相应的措施。
2.3 降低网络开销
传统的轮询机制需要客户端不断地向服务端发送请求来查询ZNode的状态是否发生变化。这种方式不仅会增加网络开销,还会增加服务端的处理压力。而ZooKeeper的Watch机制采用了事件驱动的方式,当ZNode状态发生变化时,服务端会主动向客户端发送通知,从而降低了网络开销和服务端的处理压力。
在分布式系统中,传统的轮询机制是一种常见的方式来检查资源或状态的变化。然而,这种方式在涉及到ZooKeeper这样的分布式协调服务时,会显露出一些明显的缺点。具体来说,传统的轮询机制需要客户端不断地向服务端发送请求,以查询ZNode(ZooKeeper中的数据节点)的状态是否发生变化。
这种轮询方式存在几个主要问题:
- 网络开销:客户端需要频繁地向服务端发送请求,这会导致网络流量的显著增加。在大型分布式系统中,这种额外的网络流量可能会对网络带宽和稳定性造成压力。
- 服务端处理压力:服务端需要不断地处理来自客户端的轮询请求,这会占用大量的服务器资源,增加服务端的处理压力。特别是在高并发的场景下,服务端可能会因为处理过多的轮询请求而陷入瓶颈。
- 响应延迟:由于轮询是定期执行的,客户端并不能立即感知到ZNode状态的变化。这种延迟可能会导致客户端在接收到状态变化通知之前继续执行旧的逻辑,从而引发不必要的错误或不一致。
为了解决这些问题,ZooKeeper引入了Watch机制。与轮询机制不同,ZooKeeper的Watch机制采用了事件驱动的方式。具体来说,当客户端对某个ZNode执行了读取操作(如getData
、getChildren
等)并设置了Watch时,ZooKeeper服务端会记住这个客户端与ZNode的关联关系。此后,一旦该ZNode的状态发生变化(例如数据内容被修改、子节点被添加或删除、节点本身被删除等),服务端就会主动触发一个事件,并将这个事件通知给所有之前注册了Watch的客户端。
ZooKeeper的Watch机制具有以下优点:
- 降低网络开销:由于服务端会在ZNode状态发生变化时主动通知客户端,客户端无需频繁地向服务端发送轮询请求。这大大降低了网络流量,减轻了网络带宽和稳定性的压力。
- 减轻服务端处理压力:服务端只需要在ZNode状态发生变化时发送通知,而无需处理大量的轮询请求。这减轻了服务端的处理压力,使其能够更高效地处理其他任务。
- 实时性:由于客户端是基于服务端发送的通知来感知ZNode状态变化的,因此客户端能够立即获取到最新的状态信息,并据此执行相应的操作。这种实时性对于需要快速响应的分布式系统来说至关重要。
- 灵活性:客户端可以根据实际需求在特定的ZNode上注册Watch,并在接收到通知后执行相应的回调处理函数。这种灵活性使得ZooKeeper能够适应各种不同的分布式应用场景。
03 Watch机制的实现原理
3.1 数据结构
ZooKeeper的Watch机制确实采用了观察者模式(Observer Pattern)来实现。观察者模式是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,它的所有依赖者(观察者)都会自动收到通知并更新。
在ZooKeeper中,这个“主题对象”就是ZNode,而“观察者”则是那些注册了Watch的客户端。ZooKeeper服务端为每个ZNode维护了一个Watch列表,这个列表记录了所有对该ZNode感兴趣并注册了Watch的客户端信息。
当ZNode的状态发生变化时(如数据变更、子节点列表变更、节点被删除等),ZooKeeper服务端会触发相应的事件,并遍历与该ZNode相关联的Watch列表。对于列表中的每个客户端,服务端都会发送一个通知,告知其关注的ZNode的状态已经发生了变化。
值得注意的是,ZooKeeper的Watch机制是一次性的,也就是说,当Watch被触发后,它就会被自动移除,并且客户端需要再次注册新的Watch来继续监听ZNode的状态变化。这种设计是为了避免因为客户端没有及时响应通知而导致服务端持续发送通知,从而造成资源的浪费。
通过采用观察者模式,ZooKeeper的Watch机制实现了对ZNode状态变化的实时感知和通知,使得客户端能够快速地响应ZNode状态的变化,并据此执行相应的操作。这种机制为分布式系统提供了强大的协调功能,使得系统中的各个节点能够协同工作,实现数据的一致性、高可用性和容错性。
3.2 一次性触发
ZooKeeper的Watch机制确实是一次性触发的,这是一个非常重要的特性,需要在使用时特别注意。具体来说,当客户端在ZooKeeper中注册一个Watch以监听某个ZNode的状态变化时,这个Watch只在触发一次之后会被自动移除。换句话说,一旦ZNode的状态发生了变化,服务端会发送通知给所有注册了该ZNode的Watch的客户端,但这些Watch在通知发送完毕后就不会再监听该ZNode的状态了。
这种设计的原因主要有两个:
- 避免通知泛滥:如果Watch不是一次性的,那么当ZNode的状态持续变化时,客户端可能会收到大量的通知消息。这不仅会增加客户端的处理负担,还可能导致网络拥堵和服务端性能下降。通过使Watch一次性触发,ZooKeeper能够确保客户端只会在ZNode状态发生变化时收到一次通知,从而避免了通知泛滥的问题。
- 简化客户端逻辑:如果客户端需要持续监听ZNode的状态变化,它可以在收到Watch触发的通知后,重新注册一个新的Watch。这种机制使得客户端能够根据自己的需求灵活地控制监听行为,而无需担心因为ZNode状态持续变化而导致的额外开销。
因此,在使用ZooKeeper的Watch机制时,客户端需要注意在收到通知后重新注册Watch,以确保能够持续监听ZNode的状态变化。同时,由于Watch是一次性触发的,客户端还需要注意处理可能存在的状态竞争或数据不一致的情况,以确保分布式系统的一致性和稳定性。
3.3 异步发送通知
ZooKeeper服务端向客户端发送通知时,确实采用了异步的方式进行。这种异步发送通知的方式带来了多个显著的优势,包括提高系统的并发处理能力和响应速度。以下是关于ZooKeeper服务端异步发送通知的详细解释:
3.3.1 异步发送通知
- 当ZNode的状态发生变化时,ZooKeeper服务端会遍历与该ZNode相关联的Watch列表。
- 对于列表中的每个客户端,服务端会异步地发送一个通知,告知其关注的ZNode的状态已经发生了变化。
- 重要的是,服务端不会等待客户端的响应就继续处理其他请求。这种非阻塞的通信方式使得服务端能够高效地处理大量的并发请求。
3.3.2 提高并发处理能力**:
- 由于服务端采用异步方式发送通知,它不会因为等待客户端的响应而阻塞。因此,服务端能够同时处理多个ZNode的状态变化通知,以及来自其他客户端的读写请求。
- 这种并发处理能力使得ZooKeeper能够支持高并发的分布式系统,确保系统的高效运行。
3.3.3 提高响应速度
- 异步发送通知使得客户端能够更快地感知到ZNode的状态变化。一旦服务端检测到ZNode的状态发生变化,它会立即发送通知给客户端,而无需等待其他操作完成。
- 这种及时的通知机制使得客户端能够迅速作出响应,从而提高了整个系统的响应速度。
3.3.4 顺序保证
- 虽然通知是异步发送的,但ZooKeeper会提供一个顺序保证:即客户端在看到Watch事件之前,绝不会看到ZNode的实际变化。这确保了不同客户端看到的是一致性的顺序,避免了因为网络延迟或其他因素导致的数据不一致问题。
04 Watch机制的使用场景
4.1 分布式配置管理
在分布式系统中,配置信息的管理和维护是至关重要的一部分。为了确保各个节点能够使用一致的配置信息,这些配置信息通常会被存储在共享存储系统中,如ZooKeeper。ZooKeeper的Watch机制为分布式系统提供了一种高效的方式来监听和响应配置信息的变化。
具体来说,当客户端需要获取配置信息时,它可以从ZooKeeper中读取相应的ZNode数据。为了保持对配置信息变化的敏感,客户端可以在这个ZNode上注册一个Watch。这个Watch可以理解为一个监听器,当ZNode的数据发生变化时,ZooKeeper服务端会异步地向所有注册了该Watch的客户端发送一个通知。
当客户端接收到这个通知后,它知道配置信息已经发生了变化,并可以执行相应的操作来重新加载这些新的配置信息。这个过程通常涉及从ZooKeeper中重新读取ZNode数据,解析配置,并将新的配置应用到本地的业务逻辑中。
4.2 分布式锁
ZooKeeper的Watch机制还可以用于实现分布式锁。具体来说,客户端可以在ZooKeeper中创建一个临时顺序节点作为锁标识。当其他客户端尝试获取锁时,会检查该临时顺序节点是否存在。如果存在,则注册一个Watch到该节点上并等待锁释放;如果不存在,则成功获取锁并执行相应操作。当持有锁的客户端释放锁时(即删除临时顺序节点),ZooKeeper会通知等待队列中的下一个客户端获取锁。这种基于ZooKeeper的分布式锁机制具有高效、可靠和可伸缩性等优点。
4.3 分布式协调
除了上述两个场景外,ZooKeeper的Watch机制还可以用于实现分布式协调。例如,在分布式系统中,多个节点可能需要共同完成某个任务或协作处理某个事件。通过注册Watch到相关ZNode上并监听其状态变化,这些节点可以实时感知到任务或事件的进度和状态变化,并采取相应的处理措施以确保任务或事件的顺利完成。
05 总结
ZooKeeper的Watch机制为分布式系统提供了一种高效、可靠和可伸缩的实时感知节点状态变化的能力。通过注册Watch到相关ZNode上并监听其状态变化,客户端可以实时感知到系统中其他节点的状态变化并采取相应的处理措施以确保系统的协调性和一致性。在实际应用中,我们可以结合具体的业务场景和需求来灵活运用ZooKeeper的Watch机制以提高系统的性能和稳定性。
相关文章:
【Kafka专栏 08】ZooKeeper的Watch机制:不就是个“小喇叭”吗?
作者名称:夏之以寒 作者简介:专注于Java和大数据领域,致力于探索技术的边界,分享前沿的实践和洞见 文章专栏:夏之以寒-kafka专栏 专栏介绍:本专栏旨在以浅显易懂的方式介绍Kafka的基本概念、核心组件和使用…...

三极管的厄利效应(early effect)
詹姆斯M厄利(James M. Early)发现的现象,厄利效应(英语:Early effect),又译厄尔利效应,也称基区宽度调制效应,是指当双极性晶体管(BJT)的集电极-射极电压VCE改…...
Maven: 编码GBK的不可映射字符不能编译
使用mvn compile命令,出现错误: 编码GBK的不可映射字符不能编译。这是因为代码或注释中存在中文引起的,一般在ide中会自动处理编译时的字符集,就不会碰到这个错误。这个错误是在生成代码后,其中自动加上了中 文注释,手…...

《web应用技术》第十一次课后作业
1、验证过滤器进行权限验证的原理。 Filter过滤器:javaweb三大组件(Servlet,Filter,Listener)之一;过滤器可以把对资源的请求拦截下来,从而实现一些特殊功能;过滤器一般完成一些通用操作,比如登录校验等。 执行对应的…...
flutter中实现首行缩进两端对齐
刚开始进行搜索,发现很多都是让在每段开始的时候采用空格进行填充,但是采用这种形式之后,不知道为何首行直接溢出了,最后采用下面方法进行实现的。 RichText(text: TextSpan(children: [WidgetSpan(child: Container(width: 20, …...

Vitis HLS 学习笔记--Vitis Accelerated Libraries介绍
目录 1. 简介 2. 库的文件结构 3. 分类介绍 3.1 blas 3.2 codec 3.3 data_analytics 3.4 data_compression 3.5 data_mover 3.6 database 3.7 dsp 3.8 graph 3.9 hpc 3.10 motor_control 3.11 quantitative_finance 3.12 security 3.13 solver 3.14 utils 3…...

Vue3-滑动到最右验证功能
1、思路 1、在登录页面需要启动向右滑块验证 2、效果图 3、文章地址:滑动验证码的实现-vue-simple-verify 2、成分分析 1、由三块构成,分别是底部条、拖动条、拖动移动部分 2、底部条:整体容器,包括背景、边框和文字…...
深入理解MyBatis XML配置文件
MyBatis是一款优秀的持久层框架,简化了数据库操作的复杂性,提高了开发效率。在MyBatis中,XML配置文件扮演了重要角色,用于配置数据源、事务管理、SQL映射等内容。本文将详细介绍MyBatis的XML配置文件,帮助读者更好地理…...
006 CentOS 7.9 elasticsearch7.10.0安装及配置
文章目录 一、安装Elasticsearch 7.10.0二、安装Logstash 7.10.0三、配置防火墙和网络访问可能出现的错误配置 Elasticsearch官方网址: https://www.elastic.co Elasticsearch中文官网地址:https://www.elastic.co/cn/products/elasticsearch https://…...

蚂蚁分类信息系统二开仿么么街货源客模板微商货源网源码(带手机版)
源码介绍 网站采用蚂蚁分类信息系统二次开发,模板仿么么街货源客模板,微商货源网定制版。 模板设计风格简洁,分类信息采用列表形式发布,这种设计方式非常符合度娘 SEO 规则。收录效果是杠杠的。 这个网站风格目前是用来做货源推…...
综合数据分析及可视化实战
【实验目的】 1、掌握数据分析常用的几种扩展库: numpy、pandas、matplotlib。 2、理解数据分析的几种方法,即描述性数据分析,探索性数据分析 和验证性数据分析。 3、理解数据分析的基本步骤:数据准备、数据导入、数据预处理、数 据分析和数据可视化…...

N32G45XVL-STB之移植LVGL(8.4.0)
目录 概述 1 系统软硬件 1.1 软件版本信息 1.2 ST7796-LCD 1.3 MCU IO与LCD PIN对应关系 2 认识LVGL 2.1 LVGL官网 2.2 下载V8.4.0 3 移植LVGL 3.1 硬件驱动实现 3.2 添加LVGL库文件 3.3 移植和硬件相关的代码 3.3.1 驱动接口相关文件介绍 3.3.2 重新接口函数 3…...

SwaggerSpy:一款针对SwaggerHub的自动化OSINT安全工具
关于SwaggerSpy SwaggerSpy是一款针对SwaggerHub的自动化公开资源情报(OSINT)安全工具,该工具专为网络安全研究人员设计,旨在简化广大红队研究人员从SwaggerHub上收集已归档API信息的过程,而这些OSINT信息可以为安全人…...

Python酷库之旅-比翼双飞情侣库(05)
目录 一、xlrd库的由来 二、xlrd库优缺点 1、优点 1-1、支持多种Excel文件格式 1-2、高效性 1-3、开源性 1-4、简单易用 1-5、良好的兼容性 2、缺点 2-1、对.xlsx格式支持有限 2-2、功能相对单一 2-3、更新和维护频率低 2-4、依赖外部资源 三、xlrd库的版本说明 …...
numpy数组transpose方法的基本原理
背景:记录一下numpy数组维度顺序操作 一、具体示例 transpose方法用于交换数组的轴,改变数组的维度顺序。方法的参数是一个代表新轴顺序的元组。 假设你有一个三维数组,其形状是 (a, b, c),即有 a 个块,每个块中有 b…...

Docker Swarm集群部署管理
Docker Swarm集群管理 文章目录 Docker Swarm集群管理资源列表基础环境一、安装Docker二、部署Docker Swarm集群2.1、创建Docker Swarm集群2.2、添加Worker节点到Swarm集群2.3、查看Swarm集群中Node节点的详细状态信息 三、Docker Swarm管理3.1、案例概述3.2、Docker Swarm中的…...

碎片化知识如何被系统性地吸收?
一、方法论 碎片化知识指的是通过各种渠道快速获取的零散信息和知识点,这些信息由于其不完整性和孤立性,不易于记忆和应用。为了系统性地吸收碎片化知识,可以采用以下策略: 1. **构建知识框架**: - 在开始吸收之前&am…...

安鸾学院靶场——安全基础
文章目录 1、Burp抓包2、指纹识别3、压缩包解密4、Nginx整数溢出漏洞5、PHP代码基础6、linux基础命令7、Mysql数据库基础8、目录扫描9、端口扫描10、docker容器基础11、文件类型 1、Burp抓包 抓取http://47.100.220.113:8007/的返回包,可以拿到包含flag的txt文件。…...

ChatGPT:自然语言处理的新纪元与OpenAI的深度融合
随着人工智能技术的蓬勃发展,自然语言处理(NLP)领域取得了显著的进步。OpenAI作为这一领域的领军者,以其卓越的技术实力和创新能力,不断推动着NLP领域向前发展。其中ChatGPT作为OpenAI的重要成果更是在全球范围内引起了…...

AI引领项目管理新时代:效率与智能并驾齐驱
在数字化浪潮的推动下,项目管理领域正迎来一场由AI技术引领的革新。从自动化任务执行到智能决策支持,AI技术的应用正让项目管理变得更加高效、精准和智能化。本文将探讨项目管理人员及其实施团队如何运用AI技术,以及这些技术如何助力项目管理…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...