分布式算法(五):初识ZAB协议
文章目录
- 一、什么是Zookeeper
- 二、ZAB与Zookeeper的关系
- 为什么Zookeeper不直接使用Paxos
- 三、ZAB简介
- 1.名词解释
- 提案(Proposal)
- 事务(Transaction)
- 原子广播(Atomic Broadcast)
- 2.集群角色
- 领导者(Leader)
- 跟随者(Follower)
- 观察者(Observer)
- 3.成员状态
- 4.运行阶段
- (1)Leader Election(领导者选举阶段)
- (2)Discovery(发现阶段)
- (3)Synchronization(同步阶段)
- (4)Broadcast(广播阶段)
- Commit(提交阶段)
- Observer Handling(观察者处理)
- 5.事务标识符
- 作用
- 示例
一、什么是Zookeeper
Zookeeper 是一种分布式协调服务,它帮助分布式系统中的进程或服务之间进行协作。通过提供一套简单的原语和 API,Zookeeper 使得开发者可以更容易地实现复杂的协调任务,如:
- 配置管理:应用程序可以在 Zookeeper 中存储配置信息,并且可以在配置发生变化时得到通知。
- 命名服务:为分布式系统中的组件提供一个统一的名字空间,类似 DNS 之于互联网。
- 分布式同步:提供机制以确保多个节点之间的操作能够按照一定的顺序执行。
- 组成员管理:跟踪集群中成员的状态,检测成员的加入和离开。
- 领导选举:在一组服务器中选出一个领导者来协调某些活动。
Zookeeper 的核心概念包括:
- Znodes(节点):类似于文件系统中的文件和目录,数据被组织成树状结构。
- Ephemeral nodes(临时节点):这类节点在创建它们的客户端断开连接后会被自动删除。
- Watchers(监视器):允许客户端等待特定事件的发生,例如节点数据的变化或子节点的增删。
- ACLs(访问控制列表):用于控制哪些客户端可以对 znodes 执行什么类型的访问。
关于Zookeeper的简单介绍可以看我的另一篇blog:https://blog.csdn.net/Tracycoder/article/details/142792750
二、ZAB与Zookeeper的关系
ZAB(Zookeeper Atomic Broadcast)协议是 Zookeeper 的核心技术,它通过实现领导者选举、原子广播和事务日志同步,确保了分布式系统中数据的一致性和可靠性,并且能够在节点故障时维持服务的连续性和高可用性。ZAB 保证所有服务器按照全局一致的顺序处理更新操作,提供顺序一致性,同时支持一定的容错能力,使得 Zookeeper 能够有效地协调分布式应用程序中的各个组件。
虽然ZAB是在特定的应用场景下设计的(ZooKeeper),但它确实借鉴并实现了Paxos的核心思想——特别是关于如何通过多数派投票机制达成一致。因此,可以说ZAB是基于Paxos多数派思想的共识算法。
为什么Zookeeper不直接使用Paxos
Zookeeper 选择不直接使用 Paxos 协议,而是开发了自己的 ZAB协议,主要是因为 Paxos 虽然在理论上提供了强大的一致性保证,但在实际应用中实现和理解都非常复杂,尤其是在构建高效的分布式系统时。以下是 Zookeeper 不直接采用 Paxos 的一些主要原因:
-
Paxos 的复杂性:Paxos 协议虽然解决了分布式共识问题,但其算法本身非常抽象且难以理解和实现。对于大多数开发者来说,正确地实现 Paxos 是一个挑战,这可能导致实现上的错误,影响系统的稳定性和可靠性。
-
性能考虑:Paxos 在处理某些类型的故障或网络分区时可能会导致性能下降。例如,在领导者选举过程中,Paxos 可能需要多次通信轮次才能达成一致,这在高负载或网络延迟较高的情况下会显著降低性能。
-
特定需求:Zookeeper 需要一种能够支持顺序一致性、快速恢复以及高效领导者选举的协议。虽然 Paxos 提供了一致性,但它并不直接支持这些特性。因此,Zookeeper 团队设计了 ZAB,它更专注于满足 Zookeeper 的具体需求,如高效的领导者选举和事务日志同步。
-
简化操作:ZAB 协议简化了许多操作,比如通过引入一个持久的领导者来减少决策过程中的复杂性,并确保所有更新都按全局一致的顺序执行。此外,ZAB 还实现了原子广播功能,这对于 Zookeeper 所需的分布式协调服务非常重要。
-
容错机制:ZAB 设计了更为直观的容错机制,可以在部分节点失效的情况下继续运作,同时允许失效节点重新加入集群后快速同步状态,这比直接应用 Paxos 更加高效和实用。
三、ZAB简介
1.名词解释
在 ZAB(Zookeeper Atomic Broadcast)协议中,提案(Proposal)、事务(Transaction)和原子广播(Atomic Broadcast)是三个核心概念。
提案(Proposal)
提案是指由 Zookeeper 集群中的领导者发起的一个变更提议。每个提案包含了客户端请求的具体操作(如创建节点、删除节点等),以及一个唯一的序列号,用来确保所有提案按照全局一致的顺序被处理。
事务(Transaction)
在 ZAB 的上下文中,事务指的是对 Zookeeper 状态的一次或多次更改的集合。一次事务可以包含多个操作(例如创建多个 znode 或修改现有 znode 的数据),但这些操作被视为一个不可分割的整体。
事务具有原子性,即事务中的所有操作要么全部成功执行,要么完全不执行。这保证了即使在网络故障或其他异常情况下,系统的状态仍然保持一致。
原子广播(Atomic Broadcast)
原子广播是 ZAB 协议的核心功能之一,它确保了所有集群成员以相同的顺序接收并应用相同的消息(即提案)。这意味着一旦一个消息被广播给所有成员,那么这个消息最终会被所有正常工作的成员接收到,并且不会有任何成员接收到部分消息或不同版本的消息。
原子性 指Follower要么全部批准,要么全部拒绝。
2.集群角色
在 ZAB(Zookeeper Atomic Broadcast)协议中,集群中的每个节点(也称为服务器或成员)都可以扮演不同的角色。这些角色对于确保集群的正常运作、数据一致性和高可用性至关重要。以下是 ZAB 协议中常见的集群角色:
领导者(Leader)
- 职责:
- 负责接收来自客户端的所有写请求,并将这些请求转化为提案(Proposal),然后广播给所有跟随者。
- 管理提案的提交过程,确保所有跟随者按照全局一致的顺序处理提案。
跟随者(Follower)
- 职责:
- 接收来自领导者的提案,并对提案进行投票确认。
- 如果大多数跟随者同意了某个提案,则该提案会被提交并应用到本地状态机上。
- 跟随者也会转发读请求给领导者处理,但可以直接响应只读请求(在某些配置下)。
观察者(Observer)
- 职责:
- 类似于跟随者,观察者也会接收来自领导者的提案,并同步其状态。
- 然而,观察者不会参与投票过程,因此它们的存在不影响法定人数(Quorum)的计算。
- 主要用于扩展 Zookeeper 集群的读取能力,减轻领导者和跟随者的负载。
3.成员状态
ZAB(ZooKeeper Atomic Broadcast)协议是ZooKeeper用来实现分布式一致性的一个关键组件。它确保所有服务器能够就一系列更新达成一致,即使在某些服务器故障的情况下也是如此。ZAB协议定义了几个成员状态:
ELECTION:
- 当集群中的领导者(Leader)宕机或与大多数Follower失去联系时,ZooKeeper进入ELECTION状态。
- 在这个状态下,每个服务器都认为自己可能是新的领导者,并尝试选举一个新的领导者。
- 一旦选出了新的领导者,所有参与者将从ELECTION状态转移到FOLLOWING或LEADING状态。
LEADING:
- 只有一个服务器可以处于LEADING状态,即当前的领导者。
- 领导者负责协调所有的写操作,确保它们被正确地广播到所有的Follower。
- 领导者还负责发起和协调新的选举过程,如果它检测到自己不再是多数派的一员。
FOLLOWING:
- 大部分服务器会处于FOLLOWING状态,作为跟随者(Follower)。
- 跟随者接收来自客户端的读请求并直接处理它们(因为ZooKeeper的数据模型是可复制的),而对于写请求,则转发给领导者。
- 它们也接收来自领导者的提议(Proposal)并且应用这些提议以保持数据的一致性。
OBSERVING:
- 这个状态是在加入新成员或重新连接断开成员时使用的一种特殊状态。
- 观察者(Observer)不参与选举,但它们会像跟随者一样接收和处理来自客户端的请求以及来自领导者的提议。
- 观察者帮助分担读取负载而不影响写入路径的一致性决策。
4.运行阶段
ZAB(Zookeeper Atomic Broadcast)协议的运行过程可以分为几个关键阶段,这些阶段确保了集群中数据的一致性和高可用性。以下是 ZAB 协议的主要运行阶段:
(1)Leader Election(领导者选举阶段)
- 触发条件:当 Zookeeper 集群启动时或当前领导者失效时。
- 过程:
- 所有服务器尝试成为领导者,通过一个协商过程来决定哪个服务器将成为新的领导者。
- 每个服务器会广播自己的提议,并收集其他服务器的投票。
- 如果一个服务器获得了超过半数的票数(即法定人数),它就成为新的领导者。
- 新的领导者将同步其状态与最完整的事务日志副本保持一致。
(2)Discovery(发现阶段)
- 描述:新选出来的领导者进入此阶段,以确保所有跟随者都知道谁是新的领导者,并且所有跟随者都同意领导者的最新状态。
- 过程:
- 领导者向所有跟随者发送心跳消息,确认它们的状态。
- 跟随者回复它们最后处理的事务 ID,以便领导者了解每个跟随者的状态。
- 领导者根据跟随者的反馈确定需要发送给每个跟随者的最小事务集,以使它们的状态与自己同步。
(3)Synchronization(同步阶段)
- 描述:在这个阶段,领导者确保所有跟随者的状态与其自身一致。
- 过程:
- 领导者发送必要的缺失事务给跟随者,以更新它们的状态。
- 跟随者应用这些事务并确认完成。
- 当大多数跟随者(法定人数)确认后,领导者认为集群已经同步完成。
(4)Broadcast(广播阶段)
- 描述:一旦集群同步完成,领导者开始正常接收和处理客户端请求。
- 过程:
- 领导者接收来自客户端的写请求,将其转化为提案(Proposal),并广播给所有跟随者。
- 跟随者对收到的提案进行投票确认。
- 如果大多数跟随者同意,则该提案被提交,所有成员按照相同的顺序应用这个提案。
- 对于读请求,跟随者可以直接响应,而不需要经过领导者(在某些配置下)。
ZAB协议中的消息广播类似于两阶段提交(2PC)的过程, 因为它同样依赖于一个领导者来协调所有跟随者的行动,并通过两个主要阶段确保数据的一致性:首先,领导者将提议的消息广播给所有跟随者并等待它们的确认(类似于2PC的准备阶段);一旦收到大多数跟随者的确认,领导者就会通知所有节点应用该消息,从而完成广播(类似于2PC的提交阶段)。这种机制保证了即使在部分节点故障的情况下,系统仍能维持一致性和可用性。
但是,ZAB采用了一种更简单的两阶段过程: 提议阶段和提交阶段。领导者一旦收到大多数跟随者的确认,就可以立即通知所有节点应用提议。而2PC需要额外的准备阶段来询问每个参与者是否可以执行操作,这增加了延迟。消息广播还移除了第二阶段的中断逻辑,所有的Follower要么批准每一个Proposal,要么抛弃Leader服务器。
Commit(提交阶段)
- 描述:当一个提案获得法定人数的认可后,它就会被提交。
- 过程:
- 领导者通知所有跟随者提交该提案。
- 每个跟随者将提案应用于本地状态机,并更新其状态。
- 提交完成后,提案所代表的操作正式生效。
Observer Handling(观察者处理)
- 描述:观察者不参与投票,但仍然需要保持最新的状态。
- 过程:
- 观察者从领导者那里接收提案并应用到本地状态机上。
- 它们可以响应只读请求,但不会影响法定人数的计算。
5.事务标识符
ZAB(ZooKeeper Atomic Broadcast)协议中的事务标识符 zxid
是一个非常重要的概念,它用于唯一标识每个事务,并确保事务的顺序性。zxid
是一个64位的数字,由两部分组成:
-
EPOCH (32位):表示领导者的周期或者任期。每当选举出一个新的领导者时,EPOCH会增加。这有助于区分不同领导者的提议,即使它们在不同的任期内提出了相同的本地序列号。
-
COUNT (32位):是领导者提出的事务在其任期内的递增计数器。每次领导者提出新的提议时,COUNT都会增加。这意味着在同一任期内,COUNT可以用来对提议进行排序。
作用
- 唯一性:由于
zxid
结合了EPOCH和COUNT,因此它可以保证每个事务在整个集群中都是唯一的。 - 全局有序:通过
zxid
,可以确保所有服务器上的事务按照相同的顺序被应用,这对于维护数据的一致性和正确性至关重要。 - 故障恢复:当一个新的领导者被选出来之后,它可以通过比较zxid来确定哪些事务已经被确认,哪些还没有,从而能够安全地继续处理未完成的事务。
示例
假设我们有一个初始的zxid
为0x0000000100000001,这里前32位是EPOCH(0x00000001),后32位是COUNT(0x00000001)。如果这个领导者发起了两个事务,那么第二个事务的zxid
将会是0x0000000100000002。如果此时发生了领导者变更,新的领导者的EPOCH将变为0x00000002,而它的第一个事务的zxid
可能是0x0000000200000001。
相关文章:
分布式算法(五):初识ZAB协议
文章目录 一、什么是Zookeeper二、ZAB与Zookeeper的关系为什么Zookeeper不直接使用Paxos 三、ZAB简介1.名词解释提案(Proposal)事务(Transaction)原子广播(Atomic Broadcast) 2.集群角色领导者(…...
用Python操作字节流中的Excel工作簿
Python能够轻松地从字节流中加载文件,在不依赖于外部存储的情况下直接对其进行读取、修改等复杂操作,并最终将更改后的文档保存回字节串中。这种能力不仅极大地提高了数据处理的灵活性,还确保了数据的安全性和完整性,尤其是在网络…...
PHP-Casbin v4.0.0 发布,支持 ACL、RBAC、ABAC 等模型的访问控制框架
PHP-Casbin 是一个用 PHP 语言打造的轻量级开源访问控制框架,支持 ACL、RBAC、ABAC 多种模型。它采用了元模型的设计思想,支持多种经典的访问控制方案,如基于角色的访问控制 RBAC、基于属性的访问控制 ABAC 等。 更新内容: http…...
MIT S081 Lab 2 System Calls
Lab链接 一 实现trace功能 1 题目要求 In this assignment you will add a system call tracing feature that may help you when debugging later labs. You’ll create a new trace system call that will control tracing. It should take one argument, an integer “ma…...
Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库
Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库 目录 Oracle Dataguard(主库为 Oracle 11g 单节点)配置详解(2):配置主数据库一、配置…...
(leetcode算法题)10. 正则表达式匹配
10. 正则表达式匹配 - 力扣(LeetCode) 此题的要求一个字符串 s 和一个字符规律 p之间支持 . 和 * 的正则表达式匹配 . 匹配任意单个字符 * 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串…...
Hive性能调优考量
Hive作为大数据领域常见的数据仓库组件,在设计和开发阶段需要注意效率。影响Hive效率的不仅仅是数据量过大,数据倾斜、job(小文件过多)或者磁盘I/O过多、MapReduce分配不合理等因素都会对Hive的效率有影响。对Hive的调优可以从架构…...
2024-12-29-sklearn学习(26)模型选择与评估-交叉验证:评估估算器的表现 今夜偏知春气暖,虫声新透绿窗纱。
文章目录 sklearn学习(26) 模型选择与评估-交叉验证:评估估算器的表现26.1 计算交叉验证的指标26.1.1 cross_validate 函数和多度量评估26.1.2 通过交叉验证获取预测 26.2 交叉验证迭代器26.2.1 交叉验证迭代器–循环遍历数据26.2.1.1 K 折26.2.1.2 重复 K-折交叉验…...
Spring Boot + MinIO 实现分段、断点续传,让文件传输更高效
一、引言 在当今的互联网应用中,文件上传是一个常见的功能需求。然而,传统的文件上传方式在面对大文件或不稳定的网络环境时,可能会出现性能瓶颈和上传失败的问题。 传统文件上传,就像是用一辆小推车搬运大型家具,一…...
获取用户详细信息-ThreadLocal优化
Thread全局接口可用,不用再重复编写。所以为了代码的复用,使用Thread。把之前的内容(函数的参数和map与username)注释掉,换为Thread传过来的内容(map与username)。 因为Thread需要在拦截器里面…...
R语言6种将字符转成数字的方法,写在新年来临之际
咱们临床研究中,拿到数据后首先要对数据进行清洗,把数据变成咱们想要的格式,才能进行下一步分析,其中数据中的字符转成数字是个重要的内容,因为字符中常含有特殊符号,不利于分析,转成数字后才能…...
Go语言方法和接收器类型详解
Go语言方法和接收器类型详解 1. 方法接收器类型 1.1 值接收器 值接收器方法不会改变接收器的状态,因为Go语言会在调用时复制接收器的值。因此,任何对接收器成员变量的修改都只会影响副本,而不会影响原始结构体实例。 type Person struct …...
Linux常用命令总结
目录 查询java服务的pid查询pid上的进程占用的端口方法 1:使用 lsof 查询端口方法 2:使用 netstat 查询端口方法 3:使用 ss 命令查询端口 system相关命令 查询java服务的pid JPS查询pid上的进程占用的端口 要根据进程 ID(PID&am…...
Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录
Linux总结之CentOS Stream 9安装mysql8.0实操安装成功记录 由于网上很多的mysql8.0安装教程都是老版本或者安装过程记录有问题,导致经常安装到一半需要删除重新安装。所以将成功的实操安装过程记录一下,方面后面查阅,大家还有问题的可以在此讨…...
ROS2软件架构全面解析-学习如何设计通信中间件框架
前言 ROS(Robot Operating System) 2 是一个用于开发机器人应用的软件平台,也称为机器人软件开发工具包 (SDK)。 ROS2是ROS1的迭代升级版本 ,最主要的升级点是引入DDS(Data Distribution Service)为基础的…...
基于微信小程序的校园自助打印系统
博主介绍:java高级开发,从事互联网行业六年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实…...
Linux命令——3.网络与用户
文章目录 一、网络1.网络测试与诊断2.网络接口配置3.无线网络配置4.防火墙与网络管理6.防火墙管理1)firewalld命令2)iptables命令 二、用户和群组1.管理员模式2.用户账户管理1)useradd创建2)usermod修改3)userdel 删除…...
2、redis的持久化
redis的持久化 在redist当中,高可用的技术包括持久化,主从复制,哨兵模式,集群。 持久化是最简单的高可用的方法,作用就是备份数据。即将数据保存到硬盘,防止进程退出导致数据丢失。 redis持久化方式&…...
建造者模式 Builder Pattern
在创建一个对象的时候,构造器参数有点多,而且有些参数还是可选的,再者还有不少同类型的,那就更应该使用 builder 模式了。 使用 Builder 模式的初衷是 把易变性(mutability)移动到Builder类,而…...
制作一个类似ChatGPT的AI对话网站,模型能力使用ChatGPT
要快速搭建一个类似ChatGPT的AI对话网站,并且使用类似ChatGPT的模型能力,可以考虑以下技术和工具: ### 1. **使用现有的AI模型平台** - **OpenAI API**: 如果你希望使用类似于ChatGPT的能力,OpenAI提供了强大的API服务(…...
LinuxC高级day2
1.在家目录下创建目录文件,dir a.dir下创建dir1和dir2 b.把当前目录下的所有文件拷贝到dir1中, c.把当前目录下的所有脚本文件拷贝到dir2中 d.把dir2打包并压缩为dir2.tar.xz e.再把dir2.tar.xz移动到dir1中 f.解压dir1中的压缩包 g.使用tree工具&#x…...
Word格式修改
经常修改格式,留下这篇汇总 Word的累加符号上下标变右标指定目录:word如何取消封面或者目录下方的页码,页码从正文开始加参考文献:【Word】怎样给论文添加引用参考文献删空白页: word中无法删除空白页怎么办ÿ…...
深度学习-稀疏卷积
步骤: 1、构建输入输出哈希表; 输入哈希表的键为激活点的索引,值为激活点的坐标;输出哈希表的键为激活点对应的输出点的索引,值为输出点的坐标。 2、构建规则书; 规则书的每一行包含4个值,分别是…...
Microsoft Visual Studio中的/MT, /MTd,/MD,/MDd分别是什么意思?
1. /MT,/MTd,/MD,/MDd的含义 /MT,/MTd,/MD,/MDd是 Microsoft Visual C 编译器的运行时库链接选项。它们决定了程序如何链接 C 运行时库(CRT)。具体含义如下: /MT&#x…...
交换机关于环路、接口绑定、链路聚合的相关知识
文章目录 1、对交换机SW-1进行配置,仅允许Host-1通过Ethernet0/0/1接口与Host-3和Host-4通信,Host-2无法与其他主机通信。2、关闭生成树协议,验证环路造成的影响3、关闭生成树协议通过链路聚合实现两条链路正常通信并提高链路可靠性。 内容包…...
5.微服务灰度发布落地实践(rocketmq增强)
文章目录 前言发送端灰度增强订阅端灰度增强 前言 上一篇分析了,在灰度发布实现中为什么要对消息队列灰度发布进行增强。本篇主要介绍如何实现rocketmq 灰度发布的增强. 发送端灰度增强 订阅端灰度增强...
32单片机从入门到精通之开发环境——库文件(六)
每个人都有自己的追求和梦想,但要实现这些梦想并不容易。在追逐梦想的路上,我们会遇到各种困难和挫折,甚至会感到无助和失望。然而,正是这些困难和挫折让我们更加坚韧和坚定地追求自己的目标。不要害怕失败,失败只是暂…...
大电流和大电压采样电路
大电压采样电路: 需要串联多个电阻进行分压,从而一级一级降低电压,防止电阻损坏或者短路直接打穿MCU。 为什么需要加电压跟随器:进行阻抗的隔离,防止MCU的IO阻抗对分压产生影响: 大电流检测电路ÿ…...
用户态和内核态?
目录 一、定义与特点 二、功能与权限差异 三、安全性与稳定性 四、系统调用与交互 五、参考 用户态和内核态是操作系统中的两种基本运行状态,它们各自具有不同的特点和权限,共同构成了操作系统的运行基础。以下是对用户态和内核态的详细解释&#x…...
Qt天气预报系统设计界面布局第四部分左边
Qt天气预报系统设计 1、第四部分左边的第一部分1.1添加控件1.2修改控件名字 2、第四部分左边的第二部分2.1添加控件2.2修改控件名字 3、第四部分左边的第三部分3.1添加控件3.2修改控件名字 4、对整个widget04l调整 1、第四部分左边的第一部分 1.1添加控件 拖入一个widget&…...
【Spring MVC 常用注解】注解驱动开发的魔法
在 Spring MVC 中,注解可以说是开发者的“魔法棒”,通过简单的注解配置,开发者能够实现请求处理、参数绑定、响应返回等复杂功能,真正做到“少写代码多干活”。 我们接下来就来一起看看 Spring MVC 中常用的注解,它们的…...
FFmpeg 4.3 音视频-多路H265监控录放C++开发二十一.4,SDP协议分析
SDP在4566 中有详细描述。 SDP 全称是 Session Description Protocol, 翻译过来就是描述会话的协议。 主要用于两个会话实体之间的媒体协商。 什么叫会话呢,比如一次网络电话、一次电话会议、一次视频聊天,这些都可以称之为一次会话。 那为什…...
STM32 高级 WIFi案例1:测试AT指令
需求描述 测试AT指令是否能够正常控制ESP32的wifi,比如重启、读取设备信息等。 思路: stm32通过串口usart2向ESP32发布命令。ESP32通过串口1返回信息。 配置: 第一步:对ESP32芯片烧录可以读取stm32命令的固件(fac…...
Mono里运行C#脚本18—mono_image_load_names
前面已经分析完成加载CLR的流表,接着下来就是使用前面分析的数据,更进一步来处理了。下面就是通过函数mono_image_load_names获得程序集的名称和模块名称。 在CLI定义的文档里,表Assembly : 0x20: Assembly表结构信息,以下是该表各列的简要说明: HashAlgId: 这是一个4字…...
Java和Python区别: 应用领域与性能抉择的深度解析
文章目录 1. 引言2. 语言特性对比:灵活性与严谨性的碰撞3. 应用场景分析:专注任务的工具选择3.1 数据库交互:Java 的优势所在3.2 图像识别与计算:Python 的专长3.3 Web 开发 4. 高并发请求处理:架构设计与硬件选择4.1 …...
SQL Server详细使用教程(包含启动SQL server服务、建立数据库、建表的详细操作) 非常适合初学者
SQL Server详细使用教程(包含启动SQL server服务、建立数据库、建表的详细操作) 非常适合初学者 文章目录 目录 前言 一、启动SQL server服务的三种方法 1.不启动SQL server服务的影响 2.方法一:利用cmd启动SQL server服务 3.方法二:利用SQL Serv…...
基于Docker+模拟器的Appium自动化测试(二)
模拟器的设置 打开“夜神模拟器”的系统设置,切换到“手机与网络”页,选中网络设置下的“开启网络连接”和“开启网络桥接模式”复选框,而后选择“静态IP”单选框,在IP地址中输入“192.168.0.105”,网关等内容不再赘述…...
CSS系列(47)-- Animation Timeline详解
前端技术探索系列:CSS Animation Timeline详解 ⏱️ 致读者:探索动画时间线的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS Animation Timeline,这个强大的动画控制特性。 基础概念 🚀 时间线定义 …...
1、pycharm、python下载与安装
1、去官网下载pycharm 官网:https://www.jetbrains.com/pycharm/download/?sectionwindows 2、在等待期间,去下载python 进入官网地址:https://www.python.org/downloads/windows/ 3、安装pycharm 桌面会出现快捷方式 4、安装python…...
【翻译】优化加速像素着色器执行的方法
中文翻译 在回复我的 Twitter 私信时,我遇到了一个关于如何提高像素/片段着色器执行速度的问题。这是一个相当广泛的问题,具体取决于每个 GPU/平台和游戏内容的特性,但我在本帖中扩展了我“头脑风暴”式的回答,以便其他人也觉得有用。这不是一份详尽的清单,更像是一个高层…...
ZLib库使用详细教程 以及标准ZLib函数和QT自带压缩函数比较
1. 下载Zlib 官网下载地址如下:http://www.zlib.net/ 2. 利用cmake编译zlib 有两种方法可以打开cmake-gui winR输入cmd打开命令行,在命令行中输入cmake-gui可以直接打开应用界面找到你一开始安装cmake的文件夹,在bin子文件夹中双击cmake-…...
android stdudio环境: gradle一直安装失败
一、一直显示如下错误 The specified Gradle distribution file:/home/wangqingyuan/.gradle/wrapper/dists/gradle-8.6-bin/gradle-8.6-bin.zip does not exist. 经分析,是因为应用本身设置了gradle版本的地址为本地: 应用目录:gradle/gra…...
2024年12月31日Github流行趋势
项目名称:free-programming-books 项目地址url:https://github.com/EbookFoundation/free-programming-books项目语言:HTML历史star数:344575今日star数:432项目维护者:vhf, eshellman, davorpa, MHM5000, …...
音视频入门基础:MPEG2-TS专题(24)——FFmpeg源码中,显示TS流每个packet的pts、dts的实现
音视频入门基础:MPEG2-TS专题系列文章: 音视频入门基础:MPEG2-TS专题(1)——MPEG2-TS官方文档下载 音视频入门基础:MPEG2-TS专题(2)——使用FFmpeg命令生成ts文件 音视频入门基础…...
设计模式の状态策略责任链模式
文章目录 前言一、状态模式二、策略模式三、责任链模式 前言 本篇是关于设计模式中的状态模式、策略模式、以及责任链模式的学习笔记。 一、状态模式 状态模式是一种行为设计模式,核心思想在于,使某个对象在其内部状态改变时,改变该对象的行为…...
TI毫米波雷达原始数据解析之Lane数据交换
TI毫米波雷达原始数据解析之Lane数据交换 背景Lane 定义Lane 确认确认LVDS Lane 数量的Matlab 代码数据格式参考 背景 解析使用mmWave Studio 抓取的ADC Data Lane 定义 芯片与DCA100之间的数据使用LVDS接口传输,使用mmWave Studio 配置过程中有一个选项是LVDS L…...
Python-Pdf转Markdown
使用pdfminer.sixmarkdownify pdfminer.six可以提取Pdf文本内容markdownify可以将文本内容写markdown文件 安装 pip install pdfminer.six pip install markdownify实现 from pdfminer.high_level import extract_text from markdownify import markdownifydef pdf2markdo…...
win32汇编环境下,双击窗口程序内生成的listview列表控件的某行,并提取其内容的示例程序
;运行效果 ;双击后 ;上源码,仔细研究里面的几条备注就理解原理了 ;提取窗口程序内生成的listview列表控件的内容示例程序 ;抄下面源码,可以在radasm里面直接编译运行。主要的部分加了备注。 ;>>>>>>>>>>>>>>…...
对45家“AI+安全”产品/方案的分析
一. 关键洞察 “AI+安全”创新非常活跃,一片百家争鸣之势,赛道选择上,以事件分诊Incident Triage、 安全辅助Security Copilots、自动化Automation三者为主为主,这充分反映了当前安全运营的主要需求,在产品理念选择上以 AI 和 自动化为主,这确实又切合上了在关键…...
家用电器销售系统|Java|SSM|JSP|
【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…...