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

深入学习Zookeeper的知识体系

目录

 1、介绍

1.1、CAP 理论

1.2、BASE 理论

1.3、一致性协议ZAB

1、介绍

2、角色

3、ZXID和myid

4、 历史队列

5、协议模式

6、崩溃恢复模式

7、脑裂问题

2、zookeeper

2.1、开源项目

2.2、功能

2.3、选举机制

3、数据模型

3.1、介绍

3.2、znode分类

4、监听通知机制

4.1、介绍

4.2、流程

5、会话(Session)

6、zookeeper分布式锁

6.1、获取锁

6.2、释放锁

6.3、对比


前言

        Zookeeper 是一个开源的分布式协调服务框架,由 Apache 基金会维护。它主要用于管理大规模分布式系统中的配置数据、命名、同步和提供组服务等。

        Zookeeper 的设计目的是为了简化分布式应用的开发,确保在跨多个服务器或节点中共享数据的一致性和可靠性。

        Zookeeper 是 Dubbo 中的核心组件,主要用作服务的注册和发现。关于更多dubbo知识:可参考:深入探讨dubbo组件的实践-CSDN博客


1、介绍

        CAP 理论和 BASE 理论是分布式系统设计中的两个重要概念,帮助开发者理解系统在可用性、一致性和分区容忍性方面的权衡。

1.1、CAP 理论

        一个分布式系统必然会存在一个问题:因为分区容忍性(partition tolerance)的存在,就必定要求我们需要在系统可用性(availability)和数据一致性(consistency)中做出权衡 。

这就是著名的 CAP 定理。

1.一致性(Consistency)

        所有节点在同一时间看到的数据是一致的。

        即在所有副本更新成功后,任何后续的读操作都能得到最新的数据。

    2.可用性(Availability)

            系统能够在任何时候响应请求,无论是读取还是写入操作。

            即使部分节点不可用,系统依然可以提供服务。

      3.分区容忍性(Partition Tolerance)

              系统在网络分区的情况下,仍然能够正常工作。

              即使某些节点之间的通信失败,系统仍能继续运行。

        CAP 理论的关键点

                在网络分区发生时,你必须在一致性和可用性之间做出选择。通常,强调可用性的系统在网络分区情况下可能返回旧数据,而强调一致性的系统可能会拒绝服务请求以保持数据一致性。

          综述

                  根据 CAP 理论,分布式系统最多只能满足两个特性,不能同时满足三个特性。举例来说,如果一个系统需要保证一致性和分区容忍性,则在部分节点宕机时,可能无法提供服务(可用性下降)。

            1.2、BASE 理论

            定义:BASE 是一种用于描述分布式系统的理论,特别是相对于柔性一致性的设计理念。

            BASE 是以下三个特性的缩写:

            1.基本可用(Basically Available)

                      系统确保在一定条件下始终可用。

                      尽管可能存在部分数据的不一致,但系统会在一定时间内提供服务。

              2.软状态(Soft state)

                      系统的状态可能在某个时间点不一致

                      由于数据的更新延迟,系统允许一定的时间内数据保持不一致,而不是强制要求所有节点在每次操作后都达到一致。

              3.最终一致性(Eventually consistent)

                      系统将保证最终在没有新的更新的情况下,所有节点的数据会在某个时间点达到一致性

                      也就是说,经过一段时间后,所有的副本都将会一致。

              关于cap理论和base理论的区别,如下图所示:

              1.3、一致性协议ZAB

              1、介绍

                      ZooKeeper 在解决分布式数据一致性问题时并没有直接使用 Paxos ,而是专门定制了一致性协议叫做 ZAB(ZooKeeper Automic Broadcast) 原子广播协议,该协议能够很好地支持 崩溃恢复 。

              如下所示:

              2、角色

                      ZAB 中三个主要的角色,Leader 领导者、Follower跟随者、Observer观察者 。

                1.Leader 

                        集群中 唯一的写请求处理者 ,能够发起投票(投票也是为了进行写请求)。

                  2.Follower

                          能够接收客户端的请求,如果是读请求则可以自己处理,如果是写请求则要转发给 Leader 。在选举过程中会参与投票,有选举权和被选举权 。

                  3.Observer 

                          就是没有选举权和被选举权的 Follower 。

                          ZAB协议两种模式:消息广播模式和崩溃恢复模式。

                  3、ZXID和myid

                  1、zxid

                          ZooKeeper 采用全局递增的事务 id 来标识,所有 proposal(提议)在被提出的时候加上了ZooKeeper Transaction Id 。

                          ZXID是64位的Long类型,这是保证事务的顺序一致性的关键。

                          ZXID中高32位表示纪元epoch,低32位表示事务标识xid。

                  你可以认为zxid越大说明存储数据越新,如下图所示:

                  高32位(epoch)低32位(事务id)

                          每个leader都会具有不同的epoch值,表示一个纪元/朝代,用来标识 leader周期。每个新的选举开启时都会生成一个新的epoch,从1开始,每次选出新的Leader,epoch递增1,并会将该值更新到所有的zkServer的zxid的epoch。

                          xid是一个依次递增的事务编号。数值越大说明数据越新,可以简单理解为递增的事务id。

                          每次epoch变化,都将低32位的序号重置,这样保证了zxid的全局递增性。

                  2、myid

                          每个ZooKeeper服务器,都需要在数据文件夹下创建一个名为myid的文件,该文件包含整个ZooKeeper集群唯一的id(整数)。例如,某ZooKeeper集群包含三台服务器,hostname分别为zoo1、zoo2和zoo3,其myid分别为1、2和3,则在配置文件中其id与hostname必须一一对应,如下所示。在该配置文件中,server.后面的数据即为myid

                  texserver.1=zoo1:2888:3888
                  server.2=zoo2:2888:3888
                  server.3=zoo3:2888:3888
                  

                  4、 历史队列

                  每一个follower节点都会有一个先进先出(FIFO)的队列用来存放收到的事务请求,保证执行事务的顺序。所以:

                  • 可靠提交由ZAB的事务一致性协议保证
                  • 全局有序由TCP协议保证
                  • 因果有序由follower的历史队列(history queue)保证

                  5、协议模式

                  ZAB协议两种模式:消息广播模式和崩溃恢复模式。

                  如下图所示:

                  1、广播模式

                  如下图所示:

                  1. leader从客户端收到一个写请求
                  2. leader生成一个新的事务并为这个事务生成一个唯一的ZXID
                  3. leader将这个事务发送给所有的follows节点,将带有 zxid 的消息作为一个提案(proposal)分发给所有 follower。
                  4. follower节点将收到的事务请求加入到历史队列(history queue)中,当 follower 接收到 proposal,先将 proposal 写到硬盘,写硬盘成功后再向 leader 回一个 ACK
                  5. 当leader收到大多数follower(超过一半)的ack消息,leader会向follower发送commit请求(leader自身也要提交这个事务)
                  6. 当follower收到commit请求时,会判断该事务的ZXID是不是比历史队列中的任何事务的ZXID都小,如果是则提交事务,如果不是则等待比它更小的事务的commit(保证顺序性)
                  7. Leader将处理结果返回给客户端

                  关于过半写成功策略

                          Leader节点接收到写请求后,这个Leader会将写请求广播给各个Server,各个Server会将该写请求加入历史队列,并向Leader发送ACK信息,当Leader收到一半以上的ACK消息后,说明该写操作可以执行。

                          Leader会向各个server发送commit消息,各个server收到消息后执行commit操作。

                  这里要注意以下几点:

                  1.Leader并不需要得到Observer的ACK,即Observer无投票权。

                    2.Leader不需要得到所有Follower的ACK,只要收到过半的ACK即可,同时Leader本身对自己有一个ACK

                    3.Observer虽然无投票权,但仍须同步Leader的数据从而在处理读请求时可以返回尽可能新的数据

                            而对于读请求,Leader/Follower/Observer都可直接处理读请求,从本地内存中读取数据并返回给客户端即可。由于处理读请求不需要各个服务器之间的交互,因此Follower/Observer越多,整体可处理的读请求量越大,也即读性能越好。

                    6、崩溃恢复模式

                    恢复模式大致可以分为四个阶段:选举、发现、同步、广播。

                    如下图所示:

                    1、选举阶段(Leader election):

                            当leader崩溃后,集群进入选举阶段(下面会将如何选举Leader),开始选举出潜在的准 leader,然后进入下一个阶段。

                      2、发现阶段(Discovery):

                              用于在从节点中发现最新的ZXID和事务日志。准Leader接收所有Follower发来各自的最新epoch值。

                              Leader从中选出最大的epoch,基于此值加1,生成新的epoch分发给各个Follower。

                              各个Follower收到全新的epoch后,返回ACK给Leader,带上各自最大的ZXID和历史提议日志。Leader选出最大的ZXID,并更新自身历史日志,此时Leader就用拥有了最新的提议历史。(注意:每次epoch变化时,ZXID的第32位从0开始计数)。

                      3、同步阶段(Synchronization):

                              主要是利用 leader 前一阶段获得的最新提议历史,同步给集群中所有的Follower。只有当超过半数Follower同步成功,这个准Leader才能成为正式的Leader。

                              这之后,follower 只会接收 zxid 比自己的 lastZxid 大的提议。

                      4、广播阶段(Broadcast):

                              集群恢复到广播模式,开始接受客户端的写请求。

                      7、脑裂问题

                              通俗的说,就是比如当你的 cluster 里面有两个节点,它们都知道在这个 cluster 里需要选举出一个 master。但是如果它们之间的通信出了问题,那么两个结点都会觉得现在没有 master,所以每个都把自己选举成 master,于是 cluster 里面就会有两个 master。

                              ZAB为解决脑裂问题,要求集群内的节点数量为2N+1, 当网络分裂后,始终有一个集群的节点数量过半数,而另一个集群节点数量小于N+1(即小于半数), 因为选主需要过半数节点同意,所以任何情况下集群中都不可能出现大于一个leader的情况。

                              因此,有了过半机制,对于一个Zookeeper集群,要么没有Leader,要没只有1个Leader,这样就避免了脑裂问题。


                      2、zookeeper

                              从设计模式角度来看,zk是一个基于观察者设计模式的框架,它负责管理跟存储大家都关心的数据,然后接受观察者的注册,数据反生变化zk会通知在zk上注册的观察者做出反应。

                      如下图所示:

                      如上所示,zookeeper有以下几个特点:

                      1、集群

                      Zookeeper是一个领导者(Leader),多个跟随者(Follower)组成的集群。

                        2、高可用性

                        集群中只要有半数以上节点存活,Zookeeper集群就能正常服务。

                        3、全局数据一致

                        每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。

                        4、更新请求顺序进行

                        来自同一个Client的更新请求按其发送顺序依次执行。

                        5、数据更新原子性

                        一次数据更新要么成功,要么失败。

                        6、实时性

                        在一定时间范围内,Client能读到最新数据。

                        总结

                                Zookeeper是一个分布式协调系统,满足CP性,跟SpringCloud中的Eureka满足AP不一样。

                        2.1、开源项目

                        许多著名的开源项目用到了 ZooKeeper,比如:

                        1. Kafka : ZooKeeper 主要为 Kafka 提供 Broker 和 Topic 的注册以及多个 Partition 的负载均衡等功能。
                        2. Hbase : ZooKeeper 为 Hbase 提供确保整个集群只有一个 Master 以及保存和提供 regionserver 状态信息(是否在线)等功能。
                        3. Hadoop : ZooKeeper 为 Namenode 提供高可用支持。
                        4. Dubbo:阿里巴巴集团开源的分布式服务框架,它使用 ZooKeeper 来作为其命名服务,维护全局的服务地址列表。

                        2.2、功能

                        1.1、配置管理

                          Zookeeper 可以集中管理分布式应用程序的配置数据,提供快速且一致的配置服务。

                          1.2、服务注册与发现

                          Zookeeper 允许服务提供者在启动时向 Zookeeper 注册自身,消费者可以通过 Zookeeper 查询可用服务。

                          1.3、命名服务

                          Zookeeper 提供了一个分布式命名服务,允许应用组件如服务、任务、配置等进行命名和查找。

                          1.4、分布式同步

                          Zookeeper 可以帮助多个节点之间实现同步和协调,避免由于竞争条件导致的数据不一致。

                          1.5、集群管理

                          Zookeeper 可以用于管理集群中的节点状态,支持心跳检测等功能,保证集群的稳定性和可靠性。

                          2.3、选举机制

                              Leader 选举可以分为两个不同的阶段,第一个是 Leader 宕机需要重新选举,第二则是系统的 Leader 初始化选举。

                          下面是zkserver的几种状态:

                          • LOOKING 不确定Leader状态。该状态下的服务器认为当前集群中没有Leader,会发起Leader选举。
                          • FOLLOWING 跟随者状态。表明当前服务器角色是Follower,并且它知道Leader是谁。
                          • LEADING 领导者状态。表明当前服务器角色是Leader,它会维护与Follower间的心跳。
                          • OBSERVING 观察者状态。表明当前服务器角色是Observer,与Folower唯一的不同在于不参与选举,也不参与集群写操作时的投票。

                          如下图所示:

                          关于选举leader的过程示意图如下所示:

                          总结:

                                  会先根据server的投票内容(myid,zxid)进行投票,进行选举时候,zxid比较,再比较myid。较大的获选,后续加入的server直接追随已有的leader节点。

                          在选举过程中,server会进行looking--->following--->leading或者其他状态改变。

                          举例:

                                  假设集群三台服务器,Leader(server2)挂掉了,只剩下server1和server3。 server1 给自己投票为(1,99),然后广播给其他 serverserver3 首先也会给自己投票(3,95),然后也广播给其他 server

                              server1 和 server3 此时会收到彼此的投票信息,和一开始选举一样,他们也会比较自己的投票和收到的投票(zxid 大的优先,如果相同那么就 myid 大的优先)。

                                  这个时候 server1 收到了 server3 的投票发现没自己的合适故不变,server3 收到 server1 的投票结果后发现比自己的合适于是更改投票为(1,99)然后广播出去,最后 server1 收到了发现自己的投票已经超过半数就把自己设为 Leaderserver3 也随之变为 Follower


                          3、数据模型

                          3.1、介绍

                          如下图所示:

                                  采用层次化的多叉树形结构,每个节点上都可以存储数据,这些数据可以是数字、字符串或者是二级制序列。并且,每个节点还可以拥有 N 个子节点,最上层是根节点以/来代表。

                                  每个数据节点被称为 znode,它是 ZooKeeper 中数据的最小单元。并且,每个 znode 都一个唯一的路径标识。

                                  由于ZooKeeper 主要是用来协调服务的,而不是用来存储业务数据的,这种特性使得 Zookeeper 不能用于存放大量的数据,每个节点的存放数据上限为1M

                          在zookeeper客户端使用get命令可以查看znode的内容和状态信息:

                          bash[zk: localhost:2181(CONNECTED) 2] get /zk01
                          updateed02
                          cZxid = 0x600000023
                          ctime = Mon Mar 01 21:20:26 CST 2021
                          mZxid = 0xb0000000d
                          mtime = Fri Mar 05 17:15:53 CST 2021
                          pZxid = 0xb00000018
                          cversion = 5
                          dataVersion = 7
                          aclVersion = 0
                          ephemeralOwner = 0x0
                          dataLength = 10
                          numChildren = 3
                          

                          下面每个 znode 状态信息究竟代表的如下图所示:

                          3.2、znode分类

                          有四种类型:

                          持久化目录节点 persistent:

                                  客户端与zookeeper断开连接后,该节点依旧存在。

                            持久化顺序编号目录节点 persistent_sequential

                                    客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号。

                            临时目录节点 ephemeral:

                                    客户端与zookeeper断开连接后,该节点被删除。

                            临时顺序编号目录节点 ephemeral_sequential

                                    客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号。


                            4、监听通知机制

                            4.1、介绍

                                    当客户端在Zookeeper上某个节点绑定监听事件后,如果该事件被触发,Zookeeper会通过回调函数的方式通知客户端,但是客户端只会收到一次通知。

                                    如果后续这个节点再次发生变化,那么之前设置 Watcher 的客户端不会再次收到消息(Watcher是一次性的操作),可以通过循环监听去达到永久监听效果。

                            4.2、流程

                            ZooKeeper 的 Watcher 机制,总的来说可以分为三个过程:

                            1. 客户端注册 Watcher,注册 watcher 有 3 种方式,getData、exists、getChildren。
                            2. 服务器处理 Watcher 。
                            3. 客户端回调 Watcher 客户端。

                            监听通知机制的流程如下:

                                    下面是一个简单的 Java 程序,演示如何使用 Zookeeper 创建一个 Znode,并对该 Znode 添加一个监听器,以便响应节点的数据变化。

                            import org.apache.zookeeper.*;
                            import org.apache.zookeeper.data.Stat;import java.io.IOException;public class ZookeeperWatchExample implements Watcher {private static final String ZNODE_PATH = "/my_node";private ZooKeeper zookeeper;public ZookeeperWatchExample() throws IOException {// 连接到 Zookeeper 服务this.zookeeper = new ZooKeeper("localhost:2181", 3000, this);}public void createNode() throws KeeperException, InterruptedException {// 检查节点是否存在Stat stat = zookeeper.exists(ZNODE_PATH, false);if (stat == null) {// 创建节点,并设置初始数据zookeeper.create(ZNODE_PATH, "Initial data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}}public void watchNode() throws KeeperException, InterruptedException {// 设置监听器,监控节点的变化zookeeper.getData(ZNODE_PATH, true, null);}@Overridepublic void process(WatchedEvent event) {if (event.getType() == Event.EventType.NodeDataChanged) {System.out.println("Node data has changed!");try {// 重新添加监听,以保持持续监控byte[] newData = zookeeper.getData(ZNODE_PATH, true, null);System.out.println("New data: " + new String(newData));} catch (Exception e) {e.printStackTrace();}}}public static void main(String[] args) {try {ZookeeperWatchExample example = new ZookeeperWatchExample();example.createNode();example.watchNode();// 模拟在其他地方更新节点(在实际使用中,这可以是其他程序或线程)Thread.sleep(5000);example.zookeeper.setData(ZNODE_PATH, "Updated data".getBytes(), -1);// 保持程序运行,等待事件Thread.sleep(10000);} catch (Exception e) {e.printStackTrace();}}
                            }
                            

                                process 方法是由 Zookeeper 自动调用的。当你注册一个 Watcher 时,Zookeeper 将监视与特定 Znode 相关的事件(例如节点数据变化、节点创建和删除等)。

                                    当这些事件发生时,Zookeeper 会自动触发相应的 Watcher 实现中的 process 方法。

                            总结:

                                    基于 Zookeeper上创建的节点,可以对这些节点绑定监听事件,比如可以监听节点数据变更、节点删除、子节点状态变更等事件,通过这个事件机制,可以基于 Zookeeper 实现分布式锁、集群管理等多种功能。


                            5、会话(Session)

                                    客户端与 Zookeeper 服务器之间的连接被称为会话。会话由跟踪的心跳确保活性,并维护 Znode 的持久性与临时性。

                            持续更新


                            6、zookeeper分布式锁

                                    分布式锁是雅虎研究员设计Zookeeper的初衷。利用Zookeeper的临时顺序节点,可以轻松实现分布式锁。

                            如下图所示:

                            6.1、获取锁

                                    首先,在Zookeeper当中创建一个持久节点ParentLock。当第一个客户端想要获得锁时,需要在ParentLock这个节点下面创建一个临时顺序节点 Lock1。

                                    之后,Client1查找ParentLock下面所有的临时顺序节点并排序,判断自己所创建的节点Lock1是不是顺序最靠前的一个。如果是第一个节点,则成功获得锁。

                                    这时候,如果再有一个客户端 Client2 前来获取锁,则在ParentLock下载再创建一个临时顺序节点Lock2。

                                    Client2查找ParentLock下面所有的临时顺序节点并排序,判断自己所创建的节点Lock2是不是顺序最靠前的一个,结果发现节点Lock2并不是最小的。

                                    于是,Client2向排序仅比它靠前的节点Lock1注册Watcher,用于监听Lock1节点是否存在。这意味着Client2抢锁失败,进入了等待状态。

                                    这时候,如果又有一个客户端Client3前来获取锁,则在ParentLock下载再创建一个临时顺序节点Lock3。

                                    Client3查找ParentLock下面所有的临时顺序节点并排序,判断自己所创建的节点Lock3是不是顺序最靠前的一个,结果同样发现节点Lock3并不是最小的。

                                    于是,Client3向排序仅比它靠前的节点Lock2注册Watcher,用于监听Lock2节点是否存在。这意味着Client3同样抢锁失败,进入了等待状态。

                                    这样一来,Client1得到了锁,Client2监听了Lock1,Client3监听了Lock2。这恰恰形成了一个等待队列,很像是Java当中ReentrantLock所依赖的AQS(AbstractQueuedSynchronizer)。

                            6.2、释放锁

                            释放锁分为两种情况:

                            1.任务完成,客户端显示释放

                            当任务完成时,Client1会显示调用删除节点Lock1的指令。

                            2.任务执行过程中,客户端崩溃

                                    获得锁的Client1在任务执行过程中,如果Duang的一声崩溃,则会断开与Zookeeper服务端的链接。根据临时节点的特性,相关联的节点Lock1会随之自动删除。

                                    由于Client2一直监听着Lock1的存在状态,当Lock1节点被删除,Client2会立刻收到通知。这时候Client2会再次查询ParentLock下面的所有节点,确认自己创建的节点Lock2是不是目前最小的节点。如果是最小,则Client2顺理成章获得了锁。

                                    同理,如果Client2也因为任务完成或者节点崩溃而删除了节点Lock2,那么Client3就会接到通知。

                            最终,Client3成功得到了锁。

                            6.3、对比


                            总结:

                                    通过将服务提供者的信息注册到 Zookeeper,Dubbo 能够动态地找到和调用所需服务,使得整个服务架构更具弹性和扩展性。

                                    Zookeeper 的高可用性和一致性,有助于增强分布式系统的稳定性和可靠性。


                            参考文章:

                            1、史上最全的Zookeeper原理详解(万字长文)_zk原理-CSDN博客

                            相关文章:

                            深入学习Zookeeper的知识体系

                            目录 1、介绍 1.1、CAP 理论 1.2、BASE 理论 1.3、一致性协议ZAB 1、介绍 2、角色 3、ZXID和myid 4、 历史队列 5、协议模式 6、崩溃恢复模式 7、脑裂问题 2、zookeeper 2.1、开源项目 2.2、功能 2.3、选举机制 3、数据模型 3.1、介绍 3.2、znode分类 4、监听…...

                            电商平台一站式安全防护架构设计与落地实践

                            引言:安全即业务,防御即增长 国际权威机构 Forrester 最新报告指出,2024 年全球电商平台因安全防护不足导致的直接营收损失高达 $180 亿,而采用一体化防护方案的头部企业客户留存率提升 32%。本文基于 10 万 节点防护实战数据&a…...

                            【Pandas】pandas DataFrame cummin

                            Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...

                            奇妙小博客

                            import matplotlib.pyplot as plt# 定义顶点坐标 A [0, 0] B [6, 1] C [4, 6] P [4, 3]# 绘制三角形 ABC plt.plot([A[0], B[0], C[0], A[0]], [A[1], B[1], C[1], A[1]], b-, labelTriangle ABC) # 绘制点 P plt.scatter(P[0], P[1], colorr, labelPoint P(4,3))# 标注顶点…...

                            嵌入式学习笔记 - HAL_ADC_ConfigChannel函数解析

                            贴函数原型: 一 首先配置规则通道序列 其实所有的配置函数都是在对寄存器进行操作,要想看懂Hal库底层函数驱动就先把寄存器如何配置看懂,以下是配置规则通道寄存器的介绍,以ADC_SQR3为例,也就是通道序列1到序列6&…...

                            Java反射详细介绍

                            的反射(Reflection)是一种强大的机制,允许程序在运行时动态获取类的信息、操作类的成员(属性、方法、构造器),甚至修改类的行为。它是框架开发(如 Spring、MyBatis)、单元测试工具&a…...

                            2025年土木建筑与水利工程国际会议(ICCHE 2025)

                            2025 International Conference on Civil and Hydraulic Engineering (ICCHE 2025) (一)会议信息 会议简称:ICCHE 2025 大会地点:中国银川 投稿邮箱:icchesub-paper.com 收录检索:提交Ei Compendex,CPCI,C…...

                            适应性神经树:当深度学习遇上决策树的“生长法则”

                            1st author: Ryutaro Tanno video: Video from London ML meetup paper: Adaptive Neural Trees ICML 2019 code: rtanno21609/AdaptiveNeuralTrees: Adaptive Neural Trees 背景 在机器学习领域,神经网络(NNs)凭借其强大的表示学习能力&…...

                            IBM BAW(原BPM升级版)使用教程第十四讲

                            续前篇! 一、流程设计中的编程 在 IBM Business Automation Workflow (BAW) 中,编程部分涵盖了多种技术、工具和策略,帮助用户定制和扩展流程。BAW 主要通过脚本、集成、服务和自定义代码来实现流程的灵活性和定制化。下面将详细讲解 BAW …...

                            【计算机网络 第8版】谢希仁编著 第四章网络层 题型总结3 SDN OpenFlow

                            SDN OpenFlow题型 这题其实,认真看书P196-197的例子也不难理解。我个人认为所谓防自学设计主要就是你没看懂这张图的时候就是天书,你知道怎么读这张图的时候就很简单。不过我相信这个用心一点应该也都是能懂的。 题目 4.66-4.69 4-66 我最大的一个问题…...

                            【React中函数组件和类组件区别】

                            在 React 中,函数组件和类组件是两种构建组件的方式,它们在多个方面存在区别,以下详细介绍: 1. 语法和定义 类组件:使用 ES6 的类(class)语法定义,继承自 React.Component。需要通过 this.props 来访问传递给组件的属性(props),并且通常要实现 render 方法返回 JSX…...

                            多线程代码案例-1 单例模式

                            单例模式 单例模式是开发中常见的设计模式。 设计模式,是我们在编写代码时候的一种软性的规定,也就是说,我们遵守了设计模式,代码的下限就有了一定的保证。设计模式有很多种,在不同的语言中,也有不同的设计…...

                            langChain存储文档片段,并进行相似性检索

                            https://python.langchain.ac.cn/docs/how_to/document_loader_pdf/#vector-search-over-pdfs 这段代码展示了如何使用LangChain框架中的InMemoryVectorStore和OpenAIEmbeddings来存储文档片段,并基于提供的查询进行相似性搜索。下面是对每一行代码的详细解释&…...

                            MQTT协议技术详解:深入理解物联网通信基础

                            MQTT协议技术详解:深入理解物联网通信基础 1. MQTT协议概述 MQTT (Message Queuing Telemetry Transport) 是一种轻量级的发布/订阅消息传输协议,专为资源受限设备和低带宽、高延迟或不可靠网络环境设计。作为物联网通信的核心协议之一,MQTT…...

                            python中的进程锁与线程锁

                            在Python中,线程和进程使用锁的机制有所不同,需分别通过threading和multiprocessing模块实现。以下是具体用法及注意事项: 一、线程锁(Thread Lock) 基本用法 线程锁用于多线程环境下保护共享资源,防止数据…...

                            导出导入Excel文件(详解-基于EasyExcel)

                            前言: 近期由于工作的需要,根据需求需要导出导入Excel模板。于是自学了一下下,在此记录并分享!! EasyExcel: 首先我要在这里非常感谢阿里的大佬们!封装这么好用的Excel相关的API,真…...

                            仿正点原子驱动BMP280气压传感器实例

                            文章目录 前言 一、寄存器头文件定义 二、设备树文件中添加节点 三、驱动文件编写 四、编写驱动测试文件并编译测试 总结 前言 本文驱动开发仿照正点原子的iic驱动实现,同时附上bmp280的数据手册,可访问下面的链接: BMP280_Bosch(博世…...

                            Java 反射机制(Reflection)

                            一、理论说明 1. 反射的定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Jav…...

                            每日Prompt:发光线条解剖图

                            提示词 一幅数字插画,描绘了一个 [SUBJECT],其结构由一组发光、干净且纯净的蓝色线条勾勒而成。画面设定在深色背景之上,以突出 [SUBJECT] 的形态与特征。某个特定部位,如 [PART],通过红色光晕加以强调,以…...

                            从新手到高手:全面解析 AI 时代的「魔法咒语」——Prompt

                            引言:AI 时代的「语言炼金术」 在人工智能技术突飞猛进的今天,我们正在经历一场堪比工业革命的生产力变革。从聊天机器人到图像生成,从数据分析到自动化写作,AI 模型正在重塑人类与信息交互的方式。而在这一切背后,隐…...

                            【SpringBoot】集成kafka之生产者、消费者、幂等性处理和消息积压

                            目录 配置文件 application.properties启动类 ApplicationKafka 配置Message 消息实体类MessageRepository 消息处理消息积压监控服务Kafka消息消费者服务Kafka消息生产者服务API控制器提供测试接口关键特性说明生产环境建议 配置文件 application.properties # 应用配置 serv…...

                            [SAP] 通过事务码Tcode获取程序名

                            如何通过事务码查找对应的程序名? 方法一:直接运行事务码,跳转至功能详情页面,点击【系统】|【状态】即可获取对应事务码的程序名 从上面可以了解到自定义的事务码"ZMM01"对应的程序名为"ZYT36_ZMM001_01"&a…...

                            蓝桥杯12届国B 纯质数

                            题目描述 如果一个正整数只有 1 和它本身两个约数,则称为一个质数(又称素数)。 前几个质数是:2,3,5,7,11,13,17,19,23,29,31,37,⋅⋅⋅ 。 如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如&#xff1…...

                            国产大模型「五强争霸」,决战AGI!

                            来源 | 新智元 DeepSeek的横空出世,已经彻底改变了全球的AI局势。 从此,不仅中美大模型竞争格局改变,国产大模型的产业版图,也被一举打破! 纵观中国基础大模型的市场,可以看到,如今的基础大模…...

                            C++修炼:继承

                            Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…...

                            Mysql新增

                            插入一个记录需要的时间由下列因素组成&#xff0c;其中的数字表示大约比例&#xff1a; 连接&#xff1a;(3)发送查询给服务器&#xff1a;(2)分析查询&#xff1a;(2)插入记录&#xff1a;&#xff08;1x记录大小&#xff09;插入索引&#xff1a;&#xff08;1x索引&#x…...

                            华秋2025电子设计与制造技术研讨会(华东站)成功举办!

                            “探索科技前沿&#xff0c;共筑创新未来”——华秋“2025电子设计与制造技术研讨会第一站&#xff1a;华东站”在江苏苏州圆满落幕。 随着电子信息产业的持续增长和数字化经济的加速转型&#xff0c;数字化电子供应链的作用愈发显著。本届研讨聚焦EDA设计、DFM软件分析、多层…...

                            [学习] RTKLib详解:qzslex.c、rcvraw.c与solution.c

                            RTKLib详解&#xff1a;qzslex.c、rcvraw.c与solution.c 本文是 RTKLlib详解 系列文章的一篇&#xff0c;目前该系列文章还在持续总结写作中&#xff0c;以发表的如下&#xff0c;有兴趣的可以翻阅。 [学习] RTKlib详解&#xff1a;功能、工具与源码结构解析 [学习]RTKLib详解…...

                            【Ubuntu】neovim Lazyvim安装与卸载

                            安装neovim # 下载 AppImage wget https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.appimage# 添加执行权限 chmod ux nvim-linux-x86_64.appimage# 移动到系统路径&#xff0c;重命名为 nvim sudo mv nvim-linux-x86_64.appimage /usr/local/b…...

                            数据结构(一) 绪论

                            一. 时间复杂度: (1)定义: 时间复杂度是衡量算法执行时间随输入规模(通常用n表示)增长的变化趋势的指标,时间复杂度用O符号表示 用于描述算法在最坏情况下或平均情况下的时间需求 时间复杂度关注的是操作次数的增长率&#xff0c;而非具体执行时间 常见的时间复杂度由小到大依次…...

                            数据库事务并发问题

                            目录 脏读 幻读 不可重复读 三者的区别 脏读、幻读和不可重复读是在数据库并发操作中可能出现的问题&#xff0c;以下是对它们的详细介绍&#xff1a; 脏读 定义&#xff1a;指一个事务读取了另一个未提交事务修改的数据。示例&#xff1a;事务 A 修改了一条数据&#xf…...

                            Android之横向滑动列表

                            文章目录 前言一、效果图二、使用步骤1.xml布局2.代码3.HomeHxBean3.adapter4.item布局5.两个drawable 总结 前言 横向滑动列表有多种实现方式&#xff0c;也可以用tablayout&#xff0c;也可以用recyclerview&#xff0c;今天主要介绍recyclerview。 一、效果图 二、使用步骤…...

                            系统稳定性之上线三板斧

                            &#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》&#xff08;基础篇&#xff09;、&#xff08;进阶篇&#xff09;、&#xff08;架构篇&#xff09;清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…...

                            aardio - godking.vlistEx.listbar + win.ui.tabs 实现多标签多页面切换

                            方法一&#xff1a; import win.ui; import godking.vlistEx.listbar; import fonts.fontAwesome; /*DSG{{*/ mainForm win.form(text"vlistEx - table adapter";right895;bottom503) mainForm.add({ custom{cls"custom";text"自定义控件";lef…...

                            鸿蒙 核心与非核心装饰器

                            HarmonyOS NEXT 版本中完整的 ArkTS 装饰器分类整理&#xff08;含核心与非核心装饰器&#xff0c;已剔除废弃特性&#xff09; 一、核心装饰器&#xff08;Essential Decorators&#xff09; 1. 组件基础 装饰器功能Entry应用入口组件&#xff0c;每个模块必须且仅有一个&am…...

                            TypeScript 知识框架

                            一、TypeScript 基础 1. 类型系统 基本类型: number, string, boolean, null, undefined, symbol, bigint 引用类型: object, array, function, class 特殊类型: any, unknown, void, never 类型推断与类型注解 类型断言 (as 语法和 <Type> 语法) 2. 接口与类型别名 接口…...

                            web-ui开源程序是建立在浏览器使用的基础上,旨在使 AI 代理可以访问网站

                            ​一、软件介绍 文末提供程序和源码下载 web-ui开源程序是建立在浏览器使用的基础上&#xff0c;旨在使 AI 代理可以访问网站。WebUI&#xff1a;基于 Gradio 构建&#xff0c;支持大部分 browser-use 功能。此 UI 设计为用户友好型&#xff0c;并支持与浏览器代理轻松交互。扩…...

                            【ns3】TCP三次握手源码解析

                            文章目录 TCP三次握手过程三次握手源码 TCP三次握手过程 三次握手源码 下面是ns3里三次握手整体过程的源码&#xff0c;和上面图解一一对应&#xff1a; TCP socket的状态枚举&#xff1a; 整体过程&#xff1a; 客户端首先connect&#xff1a;tcp-socket-base::connect调用Do…...

                            【YOLO模型】参数全面解读

                            使用YOLO模型时&#xff0c;需要调节各种参数&#xff0c;网络文章和官方文档有点不方便&#xff0c;整理了下面的内容备用&#xff1a; 获取最全最新的参数列表: Ultralytics官方文档: 这是获取YOLOv11&#xff08;以及YOLOv8等&#xff09;最权威、最详细参数信息的地方。通…...

                            跨境电商定价革命:亚马逊“逆向提价“策略背后的价值重构逻辑

                            导言&#xff1a;打破价格魔咒的销量奇迹 2024年Q3亚马逊平台上演商业悖论&#xff1a;在TOP5000卖家中&#xff0c;12%实施5%-15%温和提价的商户&#xff0c;41%实现单量30.4%的季度增长。这一现象颠覆"低价即流量"的电商铁律&#xff0c;揭开新消费时代"价值定…...

                            Kafka、RabbitMQ、RocketMQ的区别

                            以下是 RabbitMQ、RocketMQ、Kafka 的核心区别对比&#xff1a; 一、架构设计差异 ‌Kafka‌ 基于分布式日志的发布-订阅模型&#xff0c;通过分区&#xff08;Partition&#xff09;实现水平扩展&#xff0c;依赖 ZooKeeper 管理集群消费者通过消费者组&#xff08;Consumer G…...

                            win10 局域网内聊天

                            在 Windows 10 的局域网 中&#xff0c;如果你想实现 多个用户之间的聊天功能&#xff0c;可以选择以下几种方案&#xff0c;取决于你需要的是&#xff1a; • ✅ 命令行纯文字聊天&#xff08;如 Linux talk&#xff09; • ✅ 图形界面聊天室 • ✅ 局域网广播消息 • ✅ 多人…...

                            【前端三剑客】Ajax技术实现前端开发

                            目录 一、原生AJAX 1.1AJAX 简介 1.2XML 简介 1.3AJAX 的特点 1.3.1AJAX 的优点 1.3.2AJAX 的缺点 1.4AJAX 的使用 1.4.1核心对象 1.4.2使用步骤 1.4.3解决IE 缓存问题 1.4.4AJAX 请求状态 二、jQuery 中的AJAX 2.1 get 请求 2.2 post 请求 三、跨域 3.1同源策略…...

                            论文学习_Trex: Learning Execution Semantics from Micro-Traces for Binary Similarity

                            摘要&#xff1a;检测语义相似的函数在漏洞发现、恶意软件分析及取证等安全领域至关重要&#xff0c;但该任务面临实现差异大、跨架构、多编译优化及混淆等挑战。现有方法多依赖语法特征&#xff0c;难以捕捉函数的执行语义。对此&#xff0c;TREX 提出了一种基于迁移学习的框架…...

                            数据压缩的概念和优缺点

                            一、数据压缩的概念 数据压缩是通过特定算法&#xff08;压缩算法&#xff09;对数据进行重新编码&#xff0c;以减少数据存储空间或传输带宽的技术。其核心目标是在不丢失关键信息&#xff08;或允许一定程度信息损失&#xff09;的前提下&#xff0c;降低数据量&#xff0c;…...

                            spaCy基础入门

                            spaCy 概览说明 spaCy 是一个现代、快速、工业级 NLP 工具库&#xff0c;专门为实际工程应用设计&#xff0c;提供&#xff1a; • 分词&#xff08;Tokenization&#xff09; • 词性标注&#xff08;POS Tagging&#xff09; • 命名实体识别&#xff08;NER&#xff09; •…...

                            vue3项目创建-配置-elementPlus导入-路由自动导入

                            目录 方法一&#xff1a;create-vue 方法二 &#xff1a;Vite Vue Vite.config.ts配置 引入element-plus 安装 如何在项目中使用 Element Plus 完整引入 按需导入 vue3vite中自动配置路由的神器&#xff1a;vite-plugin-pages 1. 安装 2、修改vite.config.js中配置…...

                            2025年的电脑能装win7吗_2025年组装电脑装win7详细图文教程

                            2025年的电脑能装win7吗&#xff1f;2025年的电脑可以安装Win7&#xff0c;但存在一些限制和挑战。2025年的电脑基本上是14代和15代处理器&#xff0c;需要特定的条件和步骤才能安装win7&#xff0c;并且只能采用独立显卡&#xff0c;因为没有集成显卡驱动。另外注意目前2025年…...

                            windowsC++操作ADB

                            文章目录 一、ADB基础1. 工作原理2. 安装与配置 二、常用ADB指令分类1. 设备连接与管理2. 文件传输3. 应用管理4. 设备交互5. 系统信息6. 日志与调试7. 网络与端口转发 三、高级用法1. 多设备管理2. 无线ADB连接3. 批量执行命令4. ADB脚本示例 四、常见问题与解决方案五、注意事…...

                            Springboot实现重试机制

                            背景 研发工作中时常遇到要和其他服务对接&#xff0c;依赖对方能力的情况&#xff0c;最恶心的是对方提供的服务不稳定&#xff0c;时灵时不灵的&#xff0c;进而影响到自己功能的稳定性。万一发生了这种事&#xff0c;做为研发&#xff0c;咱该怎么办&#xff1f;通过容错直接…...