前言

SOFAJRaft 是一个基于 Raft 一致性算法的生产级高性能 Java 实现,支持 MULTI-RAFT-GROUP,适用于高负载低延迟的场景。SOFAJRaft 是从百度的 braft 移植而来,做了一些优化和改进,感谢百度 braft 团队开源了如此优秀的 C++ Raft 实现。

GitHub 地址:https://github.com/alipay/sofa-jraft

之前,我们有一篇介绍 SOFAJRaft 的文章,可在文末获得链接,延续这个内容,今天的演讲分为三部分,先简要介绍 Raft 算法,然后介绍 SOFAJRaft 的设计,最后说说它的优化。

 

Raft 共识算法

Raft 是一种共识算法,其特点是让多个参与者针对某一件事达成完全一致:一件事,一个结论。同时对已达成一致的结论,是不可推翻的。可以举一个银行账户的例子来解释共识算法:假如由一批服务器组成一个集群来维护银行账户系统,如果有一个 Client 向集群发出“存 100 元”的指令,那么当集群返回成功应答之后,Client 再向集群发起查询时,一定能够查到被存储成功的这 100 元钱,就算有机器出现不可用情况,这 100 元的账也不可篡改。这就是共识算法要达到的效果。

Raft 算法和其他的共识算法相比,又有了如下几个不同的特性:

  • Strong leader:Raft 集群中最多只能有一个 Leader,日志只能从 Leader 复制到 Follower 上;
  • Leader election:Raft 算法采用随机选举超时时间触发选举来避免选票被瓜分的情况,保证选举的顺利完成;
  • Membership changes:通过两阶段的方式应对集群内成员的加入或者退出情况,在此期间并不影响集群对外的服务。

共识算法有一个很典型的应用场景就是复制状态机。Client 向复制状态机发送一系列能够在状态机上执行的命令,共识算法负责将这些命令以 Log 的形式复制给其他的状态机,这样不同的状态机只要按照完全一样的顺序来执行这些命令,就能得到一样的输出结果。所以这就需要利用共识算法保证被复制日志的内容和顺序一致。

\"\"

Leader 选举

复制状态机集群在利用 Raft 算法保证一致性时,要做的第一件事情就是 Leader 选举。在讲 Leader 选举之前我们先要说一个重要的概念:Term。Term 用来将一个连续的时间轴在逻辑上切割成一个个区间,它的含义类似于“美国第 26 届总统”这个表述中的“26”。

\"img\"

每一个 Term 期间集群要做的第一件事情就是选举 Leader。起初所有的 Server 都是 Follower 角色,如果 Follower 经过一段时间( election timeout )的等待却依然没有收到其他 Server 发来的消息时,Follower 就可以认为集群中没有可用的 Leader,遂开始准备发起选举。在发起选举的时候 Server 会从 Follower 角色转变成 Candidate,然后开始尝试竞选 Term + 1 届的 Leader,此时他会向其他的 Server 发送投票请求,当收到集群内多数机器同意其当选的应答之后,Candidate 成功当选 Leader。但是如下两种情况会让 Candidate 退回 (step down) 到 Follower,放弃竞选本届 Leader:

  1. 如果在 Candidate 等待 Servers 的投票结果期间收到了其他拥有更高 Term 的 Server 发来的投票请求;

  2. 如果在 Candidate 等待 Servers 的投票结果期间收到了其他拥有更高 Term 的 Server 发来的心跳;

当然了,当一个 Leader 发现有 Term 更高的 Leader 时也会退回到 Follower 状态。

当选举 Leader 成功之后,整个集群就可以向外提供正常读写服务了,如图所示,集群由一个 Leader 两个 Follower 组成,Leader 负责处理 Client 发起的读写请求,同时还要跟 Follower 保持心跳或者把 Log 复制给 Follower。

Log 复制

下面我们就详细说一下 Log 复制。我们之前已经说了 Log 就是 Client 发送给复制状态机的一系列命令,。这里我们再举例解释一下 Log,比如我们的复制状态机要实现的是一个银行账户系统,那么这个 Log 就可以是 Client 发给账户系统的一条存钱的命令,比如“存 100 元钱”。

Leader 与 Follower 之间的日志复制是共识算法运用于复制状态机的重要目的,在 Raft 算法中 Log 由 TermId、LogIndex、LogValue 这三要素构成,在这张图上每一个小格代表一个 Log。当 Leader 在向 Follower 复制 Log 的时候,Follower 还需要对收到的 Log 做检查,以确保这些 Log 能和本地已有的 Log 保持连续。我们之前说了,Raft 算法是要严格保证 Log 的连续性的,所以 Follower 会拒绝无法和本地已有 Log 保持连续的复制请求,那么这种情况下就需要走 Log 恢复的流程。总之,Log 复制的目的就是要让所有的 Server 上的 Log 无论在内容上还是在顺序上都要保持完全一致,这样才能保证所有状态机执行结果一致。

\"\"

目前已经有一些很优秀的对 Raft 的实现,比如 C++ 写的 braft,Go 写的 etcd,Rust 写的 TiKV。当然了,SOFAJRaft 并不是 Raft 算法的第一个 Java 实现,在我们之前已经有了很多项目。但是经过我们的评估,觉得目前还是没有一个 Raft 的 Java 实现库类能够满足蚂蚁生产环境的要求,这也是我们去写 SOFAJRaft 的主要原因。

SOFAJRaft 介绍

接下来我们介绍 SOFAJRaft。

SOFAJRaft 是基于 Raft 算法的生产级高性能 Java 实现,支持 MULTI-RAFT-GROUP。从去年 3 月开发到今年 2 月完成,并在今年 3 月开源。应用场景有 Leader 选举、分布式锁服务、高可靠的元信息管理、分布式存储系统,目前使用案例有 RheaKV,这是 SOFAJRaft 中自带的一个分布式 KV 存储,还有今天开源的 SOFA 服务注册中心中的元信息管理模块也是用到了 SOFAJRaft,除此之外还有一些内部的项目也有使用,但是因为没有开源,所以就不再详述了。\"\"

这张图就是 SOFAJRaft 的设计图,Node 代表了一个 SOFAJRaft Server 节点,这些方框代表他内部的各个模块,我们依然用之前的银行账户系统举例来说明 SOFAJRaft 的各模块是如何工作的。

当 Client 向 SOFAJRaft 发来一个“存 100 元”的命令之后,Node 的 Log 存储模块首先将这个命令以 Log 的形式存储到本地,同时 Replicator 会把这个 Log 复制给其他的 Node,Replicator 是有多个的,集群中有多少个 Follower 就会有多少个 Replicator,这样就能实现并发的日志复制。当 Node 收到集群中半数以上的 Node 返回的“复制成功” 的响应之后,就可以把这条 Log 以及之前的 Log 有序的送到状态机里去执行了。状态机是由用户来实现的,比如我们现在举的例子是银行账户系统,所以状态机执行的就是账户金额的借贷操作。如果 SOFAJRaft 在别的场景中使用,状态机就会有其他的执行方式。

Meta Storage 是用来存储记录 Raft 实现的内部状态,比如当前 Term 、投票给哪个节点等信息。

Snapshot 是快照,所谓快照就是对数据当前值的一个记录,Leader 生成快照有这么几个作用:

  1. 当有新的 Node 加入集群的时候,不用只靠日志复制、回放去和 Leader 保持数据一致,而是通过安装 Leader 的快照来跳过早期大量日志的回放;

  2. Leader 用快照替代 Log 复制可以减少网络上的数据量;

  3. 用快照替代早期的 Log 可以节省存储空间。

刚才我们说的是一个节点内部的情况,那在 Raft Group 中至少需要 3 个节点,所以这是一个三副本的架构图。

 

我们会因为各种各样的需求而去构建一个 Raft 集群,如果你的目标是实现一个存储系统的话,那单个 Raft 集群可能没有办法承载你所有的存储需求;如果你的目标是实现一个为用户请求提供 Service 的系统的话,因为 Raft 集群内只有 Leader 提供读写服务,所以读写也会形成单点的瓶颈。因此为了支持水平扩展,SOFAJRaft 提供了 Multi-Group 部署模式。如图所示,我们可以按某种 Key 进行分片部署,比如用户 ID,我们让 Group 1 对 [0, 10000) 的 ID 提供服务,让 Group 2 对 [10000, 20000) 的 ID 提供服务,以此类推。

\"\"

SOFAJRaft 特性

\"\"

这是我们所支持的 Raft 特性,其中:

  • Membership change 成员管理:集群内成员的加入和退出不会影响集群对外提供服务;
  • Transfer leader:除了集群根据算法自动选出 Leader 之外,还支持通过指令强制指定一个节点成为 Leader。
  • Fault tolerance 容错性:当集群内有节点因为各种原因不能正常运行时,不会影响整个集群的正常工作。
  • 多数派故障恢复:当集群内半数以上的节点都不能正常服务的时候,正常的做法是等待集群自动恢复,不过 SOFAJRaft 也提供了 Reset 的指令,可以让整个集群立即重建。
  • Metrics:SOFAJRaft 内置了基于 Metrics 类库的性能指标统计,具有丰富的性能统计指标,利用这些指标数据可以帮助用户更容易找出系统性能瓶颈。

SOFAJRaft 定位是生产级的 Raft 算法实现,所以除了几百个单元测试以及部分 Chaos 测试之外, SOFAJRaft 还使用 jepsen 这个分布式验证和故障注入测试框架模拟了很多种情况,都已验证通过:

  • 随机分区,一大一小两个网络分区
  • 随机增加和移除节点
  • 随机停止和启动节点
  • 随机 kill -9 和启动节点
  • 随机划分为两组,互通一个中间节点,模拟分区情况
  • 随机划分为不同的 majority 分组

网络分区包括两种,一种是非对称网络分区,一种是对称网络分区。

\"\"

在对称网络分区中,S2 和其他节点通信中断,由于无法和 Leader 通信,导致它不断尝试竞选 Leader,这样等到网络恢复的时候,S2 由于之前的不断尝试,其 Term 已经高于 Leader 了。这会迫使 S1 退回到 Follower 状态,集群重新进行选举。为避免这种由于对称网络分区造成的不必要选举,SOFAJRaft 增加了预投票(pre-vote),一个 Follower 在发起投票前会先尝试预投票,只有超过半数的机器认可它的预投票,它才能继续发起正式投票。在上面的情况中,S2 在每次发起选举的时候会先尝试预选举,由于在预选举中它依然得不到集群内多数派的认可,所以预投票无法成功,S2 也就不会发起正式投票了,因此他的 Term 也就不会在网络分区的时候持续增加了。

\"\"

在非对称网络分区中,S2 和 Leader S1 无法通信,但是它和另一个 Follower S3 依然能够通信。在这种情况下,S2 发起预投票得到了 S3 的响应,S2 可以发起投票请求。接下来 S2 的投票请求会使得 S3 的 Term 也增加以至于超过 Leader S1(S3 收到 S2 的投票请求后,会相应把自己的 Term 提升到跟 S2 一致),因此 S3 接下来会拒绝 Leader S1 的日志复制。为解决这种情况,SOFAJRaft 在 Follower 本地维护了一个时间戳来记录收到 Leader 上一次数据更新的时间,Follower S3 只有超过 election timeout 之后才允许接受预投票请求,这样也就避免了 S2 发起投票请求。

SOFAJRaft 优化

接下来我们说一下 SOFAJRaft 的优化。

\"\"

为了提供支持生产环境运行的高性能,SOFAJRaft 主要做了如下几部分的性能优化,其中:

  • 并行 append log:在 SOFAJRaft 中 Leader 持久化 Log 和向 Followers 发送 Log 是并行的。
  • 并发复制:Leader 向所有 Follwers 发送 Log 也是完全相互独立和并发的。
  • 异步化:SOFAJRaft 中整个链路几乎没有任何阻塞,完全异步的,是一个完全的 Callback 编程模型。

下面我们再说说另外三项:批量化、复制流水线以及线性一致读。

批量化是性能优化最常用的手段之一。SOFAJRaft 通过批量化的手段合并 IO 请求、减少方法调用和上下文切换,具体包括批量提交 Task、批量网络发送、本地 IO 批量写入以及状态机批量应用。值得一提的是 SOFAJRaft 主要是通过 Disruptor 来实现批量的消费模型,通过这种 Ring Buffer 的方式既可以实现批量消费,又不需要为了攒批而等待。

复制流水线主要是利用 Pipeline 的通信方式来提高日志复制的效率,如果 Leader 跟 Followers 节点的 Log 同步是串行 Batch 的方式,那么每个 Batch 发送之后需要等待 Batch 同步完成之后才能继续发送下一批(ping-pong), 这样会导致较长的延迟。通过 Leader 跟 Followers 节点之间的 Pipeline 复制可以有效降低更新的延迟, 提高吞吐。

\"\"

什么是线性一致读呢?简单来说就是要在分布式环境中实现 Java volatile 语义的效果,也就是说当一个 Client 向集群发起写操作的请求并且得到成功响应之后,该写操作的结果要对所有后来的读请求可见。和 volatile 的区别是 volatile 是实现线程之间的可见,而 SOFAJRaft 需要实现 Server 之间的可见。实现这个目的最常规的办法是走 Raft 协议,将读请求同样按照 Log 处理,通过 Log 复制和状态机执行来得到读结果,然后再把结果返回给 Client。这种办法的缺点是需要 Log 存储、复制,这样会带来刷盘开销、存储开销、网络开销,因此在读操作很多的场景下对性能影响很大。所以 SOFAJRaft 采用 ReadIndex 来替代走 Raft 状态机的方案,简单来说就是依靠这样的原则直接从 Leader 读取结果:所有已经复制到多数派上的 Log(可视为写操作)就可以被视为安全的 Log,Leader 状态机只要按序执行到这条 Log 之后,该 Log 所体现的数据就能对 Client 可见了。具体可以分解为以下四个步骤:

  1. Client 发起读请求;
  2. Leader 确认最新复制到多数派的 LogIndex;
  3. Leader 确认身份;
  4. 在 LogIndex apply 后执行读操作。

通过 ReadIndex 的优化,SOFAJRaft 已经能够达到 RPC 上限的 80%了。但是我们其实还可以再往前走一步,上面的步骤中可以看到第 3 步还是需要 Leader 通过向 Followers 发心跳来确认自己的 Leader 身份,因为 Raft 集群中的 Leader 身份随时可能发生改变。所以我们可以采用 LeaseRead 的方式把这一步 RPC 省略掉。租约可以理解为集群会给 Leader 一段租期(lease)的身份保证,在此期间 Leader 的身份不会被剥夺,这样当 Leader 收到读请求之后,如果发现租期尚未到期,就无需再通过和 Followers 通信来确认自己的 Leader 身份,这样就可以跳过第 3 步的网络通信开销。通过 LeaseRead 优化,SOFAJRaft 几乎已经能够达到 RPC 的上限。但是通过时钟维护租期本身并不是绝对的安全(时钟漂移问题),所以 SOFAJRaft 中默认配置是线性一致读,因为通常情况下线性一致读性能已足够好。

性能

\"\"

这是我们性能测试的情况,测试条件如下:

  • 3 台 16C 20G 内存的 Docker 容器作为 Server Node (3 副本)
  • 2 ~ 8 台 8C Docker 容器 作为 Client
  • 24 个 Raft 复制组,平均每台 Server Node 上各自有 8 个 Leader 负责读写请求,不开启 Follower 读
  • 压测目标为 JRaft 中的 RheaKV 模块,只压测 Put、Get 两个接口,其中 get 是保证线性一致读的,Key 和 Value 大小均为 16 字节
  • 读比例 10%,写比例 90%

可以看到在开启复制流水线之后,性能可以提升大约 30%。而当复制流水线和 Client-Batching 都开启之后,8 台 Client 能够达到 40w+ ops。

目前 SOFARaft 最新的版本是 v1.2.4,由于 Raft 算法本身也比较复杂,而且 SOFAJRaft 在实现中还做了很多优化,所以如果对今天的讲演有什么不清楚的地方,欢迎继通过 SOFAJRaft wiki 继续了解更多细节,另外我们还有一个如何使用 SOFAJRaft 的示例,在 wiki 上也有详细的说明。除此之外,家纯同学写过一篇很详细的介绍文章《蚂蚁金服开源 SOFAJRaft:生产级 Java Raft 算法库》,大家也可以看一看。

欢迎 Star SOFAJRaft 帮助我们改进。

文中涉及到的相关链接

  • 本文 PPT 下载地址:https://tech.antfin.com/activities/382
  • GitHub 地址:https://github.com/alipay/sofa-jraft
  • SOFAJRaft wiki:https://github.com/alipay/sofa-jraft/wiki
  • 《蚂蚁金服开源 SOFAJRaft:生产级 Java Raft 算法库》:https://www.yuque.com/huarou/gd4szw/zon6t9

 

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

相关文章

  1. 目标检测经典论文——Faster R-CNN论文翻译:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Net

    Faster R-CNN: Towards Real-Time Object Detection with Region Proposal NetworksFaster R-CNN:通过Region Proposal网络实现实时目标检测Shaoqing Ren, Kaiming He, Ross Girshick, and Jian SunAbstractState-of-the-art object detection networks depend on region prop…...

    2024/5/6 1:07:24
  2. 区块链学姐:7月29日 小牛确立,逢低做多!

    币圈新鲜事 7月29日热点提要: 1.中欧经贸高层对话表示,双方同意在数字货币等领域加强合作。Tether7在以太坊上新增印钞1.2亿USDT(已授权未发行)。3.CME比特币未平仓合约达7.24亿美元创新。 4.数据显示,7月28日比特币期货交易量突破400亿美元。 5.欧盟公布其区块链服务测试网…...

    2024/4/25 4:45:22
  3. MySQL数据库-个人归纳总结

    1 什么是数据库?百度百科解释:2 数据库的分类?具体含义?常见的数据库?2.1 数据库的分类2.1.1 关系型数据库关系数据库,是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据,同时也是一个被组织成一组拥有正式描述性的表格,该形式的…...

    2024/4/19 1:19:58
  4. Mac 上安装ngrok 实现内网穿透

    Mac 上安装ngrok 实现内网穿透 转载https://www.jianshu.com/p/6de08a6f0838 一、准备工作 前往https://ngrok.com/,下载ngrok ,然后注册一个账号,并获取官方分配一个授权令牌。 # mac brew install ngrok二、本地绑定授权令牌 打开https://dashboard.ngrok.com/auth,复制你…...

    2024/4/20 16:56:34
  5. 情暖童心,共筑未来;周匠人珠宝关爱在行动

    有这样一群孩子,他们还嗷嗷待哺时,父母就远离家乡,到遥远的地方谋生糊口。很多时候,他们只能从电话中或者从偶尔寄来的汇款单中,才能感觉父母的存在。当别的孩子都在享受花样年华的时候,他们被留在乡下,孤独地像荒草一样生长。人们给这群孩子起了一个酸楚的名字:留守儿…...

    2024/4/27 22:34:11
  6. 7月关键词“科幻”:梁建章新书《永生之后》发售 人类寿命将达10000年?

    “这是一部理工男脑洞大开写的科幻小说。”直播间内,梁建章这样评价自己的新书。 梁建章的个人IP,与携程战疫历程深度融为一体。他像是携程“星际战舰”的掌舵人。7月29日,携程直播间“加场”召开“多彩的梁建章•多彩的携程”发布会。梁建章首部人口科幻寓言《永生之后》在…...

    2024/4/27 2:09:23
  7. 最全电报(Telegram)入门教学(海螺/汉化/免翻)

    对于身在币圈的韭菜们来说,Telegram(电报)几乎是一个必用的社交软件。由于国内政策的不明朗,多数项目方和交易所都将用户服务转移到了电报上,糖果空投时电报更是必不可少。同时,在使用其他国外平台的服务时,电报群也是个投诉建议的好地方,与平台发生冲突时也是撕逼利器(…...

    2024/5/9 22:52:05
  8. 物联网渗透测试威胁建模,捕捉应用相关安全风险

    如今,信息技术突飞猛进,对政治、经济、社会、文化、军事等很多领域都产生了深刻影响。互联网技术更是融入到生活的各方各面,早已改变人们生活方式。同时,网络攻击也在日益增加,安全防护始终是网络安全防护的一个痛点。近年来,网络攻击亦成为最火爆的网络安全话题之一。那…...

    2024/4/27 18:01:34
  9. 区域性股权交易+区块链,能为中小微企业带来什么?

    近日,证监会发布《关于原则同意北京、上海、江苏、浙江、深圳等5家区域性股权市场开展区块链建设工作的函》,原则同意了北京、上海、浙江、江苏、深圳等区域性股权市场,参与区块链建设试点工作。 区块链价值有多大,让区域性股权市场参与试点? 首当其冲的是,区块链技术能推…...

    2024/5/8 23:41:47
  10. kettle You have an error in your SQL syntax; check the manual that corresponds to your MySQL server

    使用kettle遇到的问题 获取sql查询语句时不能获取对应的字段名称,是因为导的mysql的驱动jar包版本可能太低了,换一个新的驱动包就可以了。。。...

    2024/5/8 23:41:47
  11. Mybatis foreach迭代的使用方法

    Mybatis foreach迭代的使用方法一、参数介绍二、List的使用三、Array的使用 mybatis 在批量插入或者in查询的时候会用到foreach来进行迭代拼接;foreach一共有三种类型,分别为List,Array,Map三种。 一、参数介绍 首先看参数介绍:属性 介绍item 循环体中的具体对象。支持属性的…...

    2024/4/24 22:45:09
  12. centos安装orcal(docker容器)

    centos安装orcal《centos安装sqlserver》续:1、软件准备docker+orcal镜像 (阿里镜像) 传送门 需登录注册内容如下2、安装镜像(oracle 11.0.2 64bit 企业版 实例名: helowin)1) 下载docker镜像:(6G)# 下载镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helow…...

    2024/5/2 21:20:19
  13. Python的特性和基本语法

    Python的特性和基本语法二大特性四大基本语法常见运算符运算符优先级 二大特性 一特性:Python是一种动态类型语言 二特性:Python是一种强类型定义语言 得出Python是一门动态解释性的强类型定义语言。编译型与解释型编译型编译器是把源程序的每一条语句都编译成机器语言,并保存…...

    2024/5/10 7:18:10
  14. Win10下使用Anaconda安装Tensorflow

    家里的电脑比较旧,显卡不行,所以安装的是CPU版本的Tensordlow。这里主要讲的是安装以及解决的问题。 1. 安装Anaconda 就像普通的软件安装一样,网上有很多教程,这儿就不赘述了。 2. 安装Tensorflow在cmd中创建一个python3.5的环境,环境命名为tensorflow。输入下面的命令co…...

    2024/5/2 7:37:40
  15. SpringBoot+Shiro整合MyBatis、thymeleaf

    用springhboot整合shiro做了一个简单的小练习 页面展示: 首页:登录验证:实现登录权限认证:代码奉上: 项目结构:数据库:maven依赖 pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4…...

    2024/4/25 20:37:30
  16. vs2015开发工具 部署发布代码生成

    想起去年开发的一个.net 项目,关于项目发布代码部署,我也做了笔记,分享给下伙伴们。1.前置操作:1)提取最新的代码;2)重新申城解决方案;2.发布项目:右键单击解决方案选择发布:这里的步骤是设置自定义发布步骤,第二次发布的时候选择之前自定义的发布规则即可;1)配置文件--->…...

    2024/5/10 5:28:46
  17. SQL注入详解

    一:什么是sql注入SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。二:SQL注入攻击的总体思路 1:寻找到SQL注入的位置2:判断服务器类型和后台数据库类型3:针对不同的…...

    2024/5/2 14:40:17
  18. C++中使用new与不使用new创建对象的区别

    一、实例使用new创建对象:CTest* pTest = new CTest(); delete pTest;不使用new创建对象:CTest mTest;使用new,用一个指向类对象的指针来接收;不使用new,直接定义一个类对象。二、区别使用new创建的特点:new创建类对象使用完需delete销毁。new创建类对象需要指针接收,一…...

    2024/5/8 23:41:47
  19. Golang练习题(自己认为比较不错的)

    Q1:求一段代码的运行时长 func test03() {str := " "for i := 0; i < 100000; i++{str += "hello" + strconv.Itoa(i)}}func main() {var start int64 = time.Now().UnixNano()test03()var end int64 = time.Now().UnixNano()fmt.Println(end - start)…...

    2024/5/2 11:25:48
  20. 贝塞尔曲线最小二乘法拟合(随意切向/切向方向统一)——思路适用于绝大多数的最小二乘法拟合

    离散点拟合贝塞尔曲线(三次贝塞尔为例)简介贝塞尔曲线最小二乘法拟合曲线两端不带切向约束的公式推导 简介 最近参加了一个拟合边缘的项目,本来是刚接手的时候只有直线拟合和2、3次线性拟合,因为实验品是丰富多样的,再加上客户比较挑,两端之间的交界处那边希望看起来圆滑…...

    2024/5/9 3:44:57

最新文章

  1. 吴恩达机器学习笔记:第 9 周-17大规模机器学习(Large Scale Machine Learning)17.3-17.4

    目录 第 9 周 17、 大规模机器学习(Large Scale Machine Learning)17.3 小批量梯度下降17.4 随机梯度下降收敛 第 9 周 17、 大规模机器学习(Large Scale Machine Learning) 17.3 小批量梯度下降 小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法&…...

    2024/5/10 11:48:51
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/9 21:23:04
  3. 【干货】零售商的商品规划策略

    商品规划&#xff0c;无疑是零售业的生命之源&#xff0c;是推动业务腾飞的强大引擎。一个精心策划的商品规划策略&#xff0c;不仅能帮助零售商在激烈的市场竞争中稳固立足&#xff0c;更能精准捕捉客户需求&#xff0c;实现利润最大化。以下&#xff0c;我们将深入探讨零售商…...

    2024/5/10 0:24:47
  4. C++ 【原型模式】

    简单介绍 原型模式是一种创建型设计模式 | 它使你能够复制已有对象&#xff0c;客户端不需要知道要复制的对象是哪个类的实例&#xff0c;只需通过原型工厂获取该对象的副本。 以后需要更改具体的类或添加新的原型类&#xff0c;客户端代码无需改变&#xff0c;只需修改原型工…...

    2024/5/10 0:24:07
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/10 1:36:26
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/9 7:40:42
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/9 2:44:26
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/10 2:07:45
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/10 8:07:24
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/9 5:40:03
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/10 8:16:30
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/10 2:07:43
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/10 2:07:43
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/9 4:12:16
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/9 7:40:35
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/9 19:47:07
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/10 10:17:11
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/10 2:07:41
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/9 5:02:59
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/9 4:31:45
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/9 16:54:42
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/10 1:31:37
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/10 9:24:29
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/10 10:40:03
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57