3 分布式系统抽象

讨论编程语言时,我们使用通用术语并用函数、运算符、类、变量和指针来定义我们的程序。通用的词汇可以帮助我们避免每次都为了描述某些东西而发明新词。我们的定义越精确、越没有歧异,听众也就越容易理解。

在开始学习算法之前,我们首先要了解分布式系统中的词汇:这些定义你会经常在演讲、书籍和论文中遇到。

链路

网络是不可靠的:消息会丢失、延迟或被打乱。记住这一点之后,我们来尝试构建几种通信协议。我们从最不可靠的协议开始,确定它们可能处于的状态,然后找出可以为协议增加的东西使它提供更好的保证。

公平损失链路

我们可以从两个进程开始,它们之间以链路相连。进程可以相互发送消息,如图2所示。任何通信介质都是不完美的,消息可能丢失或延迟。

看看我们能得到什么样的保证。消息M被发送之后(从发送方的角度来看),它可能处于以下状态之一:

  1. 还未送达进程B(但会在某个时间点送达)
  2. 在途中丢失且不可恢复
  3. 成功送达远程进程最简单的不可靠通信形式

注意,发送方没有任何方法确定消息是否已经送达。在分布式系统的术语中,这种链路称为公平损失(fair-loss)。这种链路具有以下属性:

公平损失

    如果发送方和接收方都是正确的,且发送方无限多次重复发送,则消息最终会被送达注3。

有限重复

    发送的消息不会被送达无限次。

不会无中生有

    链路不会自己生成消息。换句话说,它不会传递一个从未发送过的消息。

公平损失链路是一种很有用的抽象,它是构建具有更强保证的通信协议的基石。我们可以假设该链路不会在通信双方之间系统性地丢弃消息,也不会创建新消息。但与此同时,我们也不能完全依靠它。这可能让你想起了用户数据报协议(UDP),UDP允许我们从一个进程发送消息到另一个进程,但在协议层面上不提供可靠的传输语义。

消息确认

为了改善这一情况、更清晰地获得消息状态,我们可以引入确认(acknowledgment)机制:接收方通知发送方消息已送达。为此,我们需要双向通信信道,并增加一些措施以区分不同的消息,例如序列号—单调递增的唯一消息标识符。

每个消息只要有唯一标识符就足够了。序列号只是唯一标识符的一种特殊情况,即使用计数器来获取标识符,从而实现唯一性。当使用哈希算法来唯一地标识消息时,我们应当考虑可能的冲突,并确保能消除歧义。

现在,进程A可以发送消息M(n),其中n是单调递增的消息计数器。B收到消息后立即向A发送确认ACK(n)。图8-3展示了这种通信形式。
发现消息并确认

确认消息,就像原始消息一样,也有可能在途中丢失。消息可能处于的状态数会稍有变化。在A收到确认之前,该消息仍处于我们前面提到的三种状态之一,但是,一旦A收到确认,就可以确信该消息已送达B。

消息重传

增加确认机制仍不足以保证通信协议完全可靠:发送的消息仍可能会丢失,远程进程也可能在确认之前发生故障。为了解决该问题并提供送达保证,我们可以尝试重传(retransmit)。重传是指发送方重试可能失败的操作。我们之所以说可能失败,是因为发送方并不能真的知道有没有失败,因为我们要讨论的链路不使用确认机制。

进程A发送消息M之后,它将等到超时T被触发,然后尝试再次发送同一条消息。假设进程之间的链路完好无损,进程间的网络分区不会无限持续下去,并且并非所有数据包都丢失,我们可以认为,从发送方的角度看,消息要么尚未送达进程B,要么已经成功送达。由于A一直在尝试发送消息,可以认为传输过程中不会发生不可恢复的消息丢失。

在分布式系统的术语中,这种抽象称为顽固链路(stubborn link)。之所以称为顽固,是因为发件人会无限期地反复发送消息,但是,由于这种抽象非常不切实际,因此我们需要将重试与确认结合起来。

重传的问题

每当我们发送消息时,在收到远程进程的确认之前,我们无从得知消息的状态:可能已被处理,可能马上就要处理,也可能已经丢失,甚至可能在收到消息之前远程进程就崩溃了—上述的任意状态都是可能的。我们可以重试操作、再次发送消息,但这可能导致消息重复。只有当我们要执行的操作是幂等时,处理重复消息才是安全的。

幂等(idempotent)的操作可以执行多次而产生相同的结果,且不会产生其他副作用。例如,服务器关机操作可以是幂等的,第一次调用将发起关机,而所有后续调用都不会产生任何其他影响。

如果每个操作都是幂等的,那我们可以少考虑一些传递语义,更多地依赖重传来实现容错,并以完全反应式的方式构建系统:为某些信号触发相应的操作,而不会引起预期之外的副作用。但是,操作不一定是幂等的,简单地假设它们幂等可能会导致集群范围的副作用。例如,向客户的信用卡收费不是幂等操作,绝对不可以重复收费多次。

在存在部分故障和网络分区的情况下,幂等性尤其重要,因为我们无法总是确定远程操作的确切状态—是成功还是失败,还是会马上被执行—我们只能等待更长的时间。保证每个操作都是幂等的是不切实际的,因此我们需要在不改变实际操作语义的情况下,提供与幂等性等价的保证。为此,我们可以使用去重来避免多次处理消息。

消息顺序

不可靠的网络给我们带来了两个问题:一是消息可能会乱序到达;二是由于重传某些消息可能会多次送达。我们已经引入了序列号,利用这些消息标识符我们可以在接收方确保先进先出(FIFO)的顺序。由于每条消息都有一个序列号,因此接收方可以跟踪下列信息:

nconsecutive表示最大连续序列号:所有小于或等于该序列号的消息都已经收到,这些消息可以按顺序放到正确的位置上。

nprocessed表示最大已处理序列号:所有小于或等于该序列号的消息都已经按照原来的顺序被处理。此序列号可以用于去重。

如果收到的消息序列号不连续,接收方会将其放入重新排序缓冲区。例如,它在接收到序列号为3的消息后收到消息5,那我们就知道4还是缺失的,因此我们将5放在一旁,直到4到来,然后就能构造出原本的消息顺序。由于通信构建在公平损失链路之上,可以认为nconsecutive和nmax_seen之间的消息最终一定会送达。

接收方可以安全地丢弃收到的序列号小于等于nconsecutive的消息,因为这些消息确定已经送达了。

去重的工作原理是检查带有序列号n的消息是否已被处理(已被传给网络栈的更上层),丢弃已处理的消息。

在分布式系统的术语中,这种类型的链路称为完美链路,它提供以下保证[CACHIN11]:

可靠传递

正确的进程A发送一次到正确的进程B的每个消息最终都会被传递。

没有重复

消息不会被传送多次。

不会无中生有

与其他种类的链路一样,它只能传递实际由发送者发送过的消息。

这可能会让你想起TCP注4协议(但是,TCP仅在单个会话内保证可靠传递)。当然,上述模型仅仅是一种用于说明原理的简化表示。TCP中处理消息确认的模型更为复杂,它按组进行确认以减少协议层面的开销。另外,TCP具有选择性确认、流控、拥塞控制、错误检测等很多其他功能,这些不在我们的讨论范围之内。

严格一次传递

分布式系统中只有两个难题:1)保证消息顺序;2)严格一次传递。 —Mathias Verraes

关于是否可以做到严格一次传递(exactly-once delivery)这个问题已经有很多讨论。这里,语义和精确的措辞非常重要。由于链路故障可能导致传递消息的第一次尝试无法成功,因此大多数实际的系统都采用至少一次传递(at-least-once delivery),它确保了发送方将重试直到收到确认为止,否则就认为对方没有收到该消息。还有一种传递语义是最多一次(at-most-once):发送方仅仅发送消息而不期待得到任何确认。

TCP协议的原理是将消息分成数据包,一个一个传输,然后在接收端将它们拼接到一起。TCP可能会尝试重传某些数据包,并且可能有不止一次的传输会成功。由于TCP用序列号标记每个数据包,即使某些数据包被发送多次,它也可以对其进行去重,确保接收方只会看到并处理一次该消息。在TCP中,此保证仅对单个会话有效:如果消息被确认并处理,但是发送方在收到确认消息前连接就中断了,则应用程序并不知道此传递成功,取决于其逻辑,它可能会尝试再次发送消息。

这意味着严格一次处理是个有趣的问题,因为重复的传送(或数据包传输)没有副作用,仅仅是链路尽力而为的产物。举个例子,如果数据库节点仅接收到记录但还没将它持久化。在这种情况下传递已经完成了,但除非该记录可以被查到(换句话说,除非消息被传递并且处理了),否则这次传递毫无用处。

为了确保严格一次传递,各节点需要一个共同知识[HALPERN90]:每个节点都知道某件事,每个节点都知道其他所有节点也都知道这件事。用简化的术语来说,节点必须在记录状态上达成共识:两个节点都认为该记录已经或者还未被持久化。正如本章之后会说的,这在理论上是不可能的,但在实践中,我们仍通过放宽协调的要求来使用这一概念。

各种关于是否是严格一次发送的误解,大多是因为从不同协议和抽象层次上考虑该问题,以及对“传递”的不同定义。要想建立可靠的链路,不可能不重复传送某些消息。但是,我们可以通过仅处理每个消息一次并忽略重复消息,使得从发送方的角度来看是严格一次发送。

现在,在建立了实现可靠通信的方法之后,我们可以继续前进,探寻实现分布式系统中进程间一致性和共识的方法。

4 两将军问题

一个被广泛称为两将军问题的思想实验,是对分布式系统一致性的最著名的描述之一。

这个思想实验表明,如果链路可能发生故障并且通信是异步的,则不可能在通信的双方之间达成共识。尽管TCP具有完美链路的性质,但是务必记住:完美链路尽管被称为完美链路,并不能保证完美的传递。它们也不能保证参与方一直活着,而只关心传输本身。

想象现在有两支军队,分别由两位将军领导,准备进攻一座要塞城市。两支军队分别位于城市的两侧,只有在同时进攻的情况下才能获胜。

两位将军通过信使进行通信。他们已经制定了攻击计划,现在唯一需要达成共识的就是是否执行计划。该问题的变体包括:其中一位将军的级别较高,但需要确保攻击是有协调的;或者两位将军需要就确切时间达成共识。这些细节不会改变问题的定义:将军们需要达成一项共识。

将军们只需要对“他们都会发起进攻”这一事实达成共识。否则,攻击将无法成功。将军A发出一条消息MSG(N),表明如果对方也同意的话,就在指定的时间发起进攻。

将军A送出信使之后,他不知道信使是否已经到达:信使可能会被抓而无法传达消息。当将军B收到消息时,他必须发送确认ACK(MSG(N))。图8-4展示了一条消息由一方发送并由另一方确认。

两将军问题示意图

传递确认消息的信使也可能会被抓而无法传达消息。B无从得知信使是否已成功送达确认消息。

为了确认这一点,B必须等待ACK(ACK(MSG(N))),一个二阶的确认,用于确认A收到了确认。

无论将军们互相发送多少确认,他们始终距离安全地发起攻击还差一个ACK。将军们注定要怀疑最后一个确认消息是否已送达目的地。

注意我们没有做任何时序上的假设:将军间的通信是完全异步的。并没有一个上限约束将军必须在多长时间内做出回应。

5 FLP不可能定理

Fisher、Lynch和Paterson在论文中描述了一个著名的问题:FLP不可能问题[FISCHER85](FLP是作者姓氏的首字母),论文讨论了一种共识形式:各进程启动时有一个初始值,并尝试就新值达成共识。算法完成后,所有正常进程上的新值必须相同。

如果网络完全可靠,很容易对特定值达成共识。但实际上,系统容易出现各式各样的故障,例如消息丢失、重复、网络分区,以及进程缓慢或崩溃。

共识协议描述了这样一个系统:给定初始状态的多个进程,它将所有进程带入决定状态。一个正确的共识协议必须具备以下三个属性:

一致性

协议达成的决定必须是一致的:每个进程都做出了决定且所有进程决定的值是相同的。否则我们就尚未达成共识。

有效性

达成共识的值必须由某一个参与者提出,这意味着系统本身不能“提出”值。这也意味着这个值不是无关紧要(trivial)的:进程不能总是决定某个预定义的默认值。

终止性

只有当所有进程都达到决定状态时,协议才算完成。

文献[FISCHER85]假定处理过程是完全异步的,进程之间没有共享的时间概念。这样的系统中的算法不能基于超时,并且一个进程无法确定另一个进程是崩溃了还是仅仅运行太慢。论文表明,在这些假设下,不存在任何协议能保证在有限时间内达成共识。完全异步的共识算法甚至无法容忍一个远程进程无通知地突然崩溃。

如果我们不给进程完成算法步骤设定一个时间上限,那么就无法可靠地检测出进程故障,也不存在确定性的共识算法。

但是,FLP不可能定理并不意味着我们要收拾东西回家(由于达成共识是不可能的)。它仅仅意味着我们不能总是在有限的时间内在一个异步系统中达成共识。实践中,系统至少会表现出一定程度的同步性,而要想解决共识问题还需要一个更完善的模型。

6 系统同步性

从FLP不可能定理中可以看出时序假设是分布式系统的关键特征之一。在异步系统中,我们不知道进程运行的相对速度,也不能保证在有限时间内或以特定顺序传递消息。进程可能要花无限长的时间来响应,而且无法总是可靠地检测到进程故障。

对异步系统的主要批评在于上述假设不切实际:进程不可能具有任意不同的处理速度,链路传递消息的时间也不会无限长。依赖时间能够简化推理,并提供时间上限的保证。

在异步模型中不一定能解决共识问题[FISCHER85]。而且,不一定能设计出高效的异步算法。对于某些任务,切实可行的解决方案很可能需要依赖时间[ARJOMANDI83]。

我们可以放宽一些假设,认为系统是同步的。为此我们引入了时间的概念。在同步模型下对系统进行推理要容易得多。它假定各进程的处理速度相近、传输延迟是有限的,并且消息传递不会花任意长的时间。

同步系统也可以表示为同步的进程本地时钟:两个进程本地时间源之间的时间差存在上限[CACHIN11]。

在同步模型中设计系统可以使用超时机制。我们可以构建更复杂的抽象,例如领导者选举、共识、故障检测以及基于它们的其他抽象。这使得最佳情况的场景更加健壮,但是如果时序假设不成立则可能导致故障。例如:Raft共识算法(参见14.4节)中,可能最终有多个进程认为它们是领导者,为了解决该问题,我们强制滞后的进程接受其他进程成为领导者;故障检测算法(参见第9章)可能会错误地将活动进程标记为故障,反之亦然。设计系统时,我们必须考虑这些可能性。

异步和同步模型的性质可以组合使用,我们可以将系统视为部分同步的。部分同步的系统具有同步系统的某些属性,但是消息传递、时钟漂移和相对处理速度的边界范围可能并不精确,并且仅在大多数时候成立[DWORK88]。

同步是分布式系统的基本属性:它对性能、扩展性和一般可解性有影响,并且有许多对系统正常工作来说是必要的因素。本书中讨论的一些算法就工作在同步系统的假设下。

7 故障模型

我们一直在提到故障这个词,但到目前为止,它还是一个十分宽泛的概念,可能包含多种含义。就像我们可以做出不同的时序假设那样,我们也可以假设存在不同种类的故障。故障模型准确地描述了分布式系统中的进程可能以怎样的方式崩溃,并基于这些假设来开发算法。例如,我们可以假设进程可能崩溃并且永远无法恢复,或者可以预期它将在一段时间后恢复,或者它可能会失控并且产生错误的值。

分布式系统中,进程互相依赖以共同执行算法,因此故障可能导致整个系统的执行错误。

我们将讨论分布式系统中现有的多种故障模型,例如崩溃、遗漏和任意故障。这个列表并非面面俱到,但它涵盖了在实际中的大多数重要场景。

7.1 崩溃故障

通常,我们期望进程正确执行算法的所有步骤。最简单的崩溃方式是进程停止执行接下来的算法步骤,并且不再发送任何消息给其他进程。换句话说,该进程崩溃了。大多数情况下,我们使用崩溃–停止(crash-stop)进程抽象的假设,它规定一旦进程崩溃就会保持这种状态。

该模型不假定该进程无法恢复,也不阻拦或试图阻止恢复。这仅仅意味着该算法的正确性或活动性不依赖于恢复过程。实际上,并没有什么东西会去阻止进程恢复、追上系统状态以及参与下一次的算法执行。

失败的进程无法再继续参与当前这一轮的协作。为恢复的进程分配一个新的、不同的ID不会使模型等价于崩溃–恢复模型(之后会讨论),因为大多数算法使用预定义的进程列表,并且依据最多可容忍的故障数明确定义了故障的语义[CACHIN11]。

崩溃–恢复(crash-recovery)是另一种的进程抽象。在这个抽象中,进程停止执行算法步骤,但会在稍后恢复并尝试执行剩下的步骤。要想让恢复成为可能,需要在系统中引入持久状态以及恢复协议[SKEEN83]。允许崩溃–恢复的算法需要考虑所有可能的恢复状态,因为恢复的进程会尝试从最后一个已知的步骤开始继续执行。

想利用恢复的算法必须同时考虑状态和进程ID。在这种情况下,崩溃恢复也可以看作是遗漏故障的一种特殊情况,因为从另一个进程的角度看,不可达的进程与崩溃再恢复的进程没什么区别。

7.2 遗漏故障

另一个故障模式是遗漏故障(omission fault)。该模型假设故障进程跳过了某些算法步骤,或者无法执行这些步骤,或者执行过程对其他参与者不可见,或者无法与其他参与者通信。遗漏故障中包含了由于网络链路故障、交换机故障或网络拥塞而导致的网络分区。网络分区可以表示为单个进程或进程组之间的消息遗漏。进程崩溃可以模拟为遗漏所有该进程收发的消息。

如果进程的运行速度慢于其他参与者,发送响应比预期迟得多,那么对于系统的其余部分来说,这个节点看起来丢三落四的。慢节点没有完全停止,而是发送结果太慢,常常与其他节点不同步。

如果本应执行某些步骤的算法跳过了这些步骤或者执行结果不可见时,就发生了遗漏故障。例如,消息在送往接收方的途中丢失,而发送方就像消息发送成功时那样,没有再次发送而是继续运行,即使消息已经不可恢复地丢失了。遗漏故障也可能是由间歇性停顿、网络过载、队列满等引起的。

7.3 任意故障

最难以解决的故障种类是任意故障或拜占庭故障(Byzantine fault):进程继续执行算法步骤,但是以与违背算法的方式(例如,共识算法中的进程决定一个从未由任何参与者提出过的值)。

此类故障可能是由于软件bug或运行不同版本算法的进程,在这种情况下,故障很容易被发现和理解。如果我们无法控制所有进程,并且其中一个进程有意地误导其他进程,则发现和理解故障会变得非常困难。

你可能在航空航天工业中听说过拜占庭式的容错:飞机和航天器的系统不会直接使用子部件传来的值,而是会对结果进行交叉验证。另一个广泛的应用是加密货币[GILAD17],那里没有中央权威,节点被多方控制,并且敌对的参与者有强烈的动机通过提供错误响应来欺骗系统。

7.4 故障处理

我们可以通过构成进程组、在算法中引入冗余来掩盖故障:即使其中一个进程发生故障,用户也不会注意到[CHRISTIAN91]。

故障可能会带来一些性能损失:正常的执行依赖于进程可响应,而且系统必须回退到较慢的执行路径来处理故障和纠正错误。故障往往可以通过一些方式来避免,例如:代码审查、广泛的测试、引入超时重试机制确保消息送达,以及确保各算法步骤在本地按顺序执行。

我们这里介绍的大多数算法都基于崩溃-故障模型,并通过引入冗余来解决故障。这些假设帮助我们创造性能更好、更易于理解和实现的算法。

8 小结

我们讨论了一些分布式系统的术语,并介绍了一些基本概念。我们讨论了分布式系统的固有困难和复杂性,这是由于系统组件不可靠性导致的:链路可能无法传递消息、进程可能崩溃、网络可能发生分区。

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

相关文章

  1. Python3.9 中的一些特性

    PEP 584 使用 | 和|= 符号取字典的并集为什么需要这个新特性:现有合并字典的方法:# 1. 合并d1, d2, 用inplace的方式修改了字典d1 d1.update(d2) # 2. 如果不想修改d1,就采用下面的代码:把d1复制到一个新字典,再对新字典使用update()方法 e = d1.copy() e.update(d2)# 3. …...

    2024/4/29 16:21:03
  2. 百度Apollo智能驾驶进阶课程——第四章 百度Apollo高精地图

    高精地图1 高精地图与自动驾驶的关系1.1 高精地图与自动驾驶1.2 什么是高精地图1.3 高精地图与导航地图2 高精地图与其他模块的关系2.1 高精地图与定位模块的关系2.2 高精度地图与感知模块2.3 高精度地图与规划、预测、决策模块2.4 高精地图与安全模块的关系2.4.1 安全方面主要…...

    2024/4/29 16:21:01
  3. Apollo课程学习4——感知

    Apollo课程学习4——感知学习前言感知的概述一、什么是感知二、感知的任务1、检测与分类2、跟踪3、语义分割三、图像分类器步骤传感器的选择和标定一、传感器的选择1、相机2、激光雷达3、毫米波雷达二、传感器的安装三、传感器标定四、传感器融合感知算法一、点云感知1、启发式…...

    2024/4/29 16:20:54
  4. java源码 - Spring5.x(3)之 ApplicationContext#refresh

    ApplicationContext 相比BeanFactory提供了更多的扩展功能文章目录1. ApplicationContext2. ClassPathXmlApplicationContext3. AbstractApplicationContextrefresh()4. refreshprepareRefresh()obtainFreshBeanFactory()customizeBeanFactory()loadBeanDefinitions()prepareBe…...

    2024/4/29 16:20:51
  5. 压缩感知笔记——动态模态分解(DMD)

    压缩感知初入门小白,如有错误,欢迎指正交流~ 动态模态分解(DMD)前言特征值分解奇异值分解(SVD)动态模态分解(DMD)参考 今天在阅读论文时,文中设计到较多动态模态分解的知识,因此学习了一下,记录一哈~ 前言 动态模态分解DMD其思想与机器学习中的PCA降维比较类似,而P…...

    2024/4/29 16:20:47
  6. 9道多线程并发面试题,你能答对几道?

    1. synchronized的实现原理以及锁优化? synchronized的实现原理synchronized作用于「方法」或者「代码块」,保证被修饰的代码在同一时间只能被一个线程访问。 synchronized修饰代码块时,JVM采用「monitorenter、monitorexit」两个指令来实现同步 synchronized修饰同步方法时…...

    2024/4/29 16:20:42
  7. 微信小程序开发——实现元素的垂直居中

    我们在进行日常前端页面的开发时,让元素垂直居中的操作数不胜数,初学者可能不太了解如何操作,方法很多,我说一种我用的比较多的。 我们以一个块元素view为例,首先我们写一个宽高分别为300rpx的view,加一个背景色方便我们直观感受效果。这是默认的效果,view会在左上角。 …...

    2024/4/29 0:54:48
  8. Intellij IDEA 通过 Token 认证连接 GitHub

    打开自己的GitHub 主页, 点击自己的头像, 找到Settings 并进入, 在左边目录栏找到Developer settings,并点击进入,Personal access tokens。 点击 Generate new token, 按照步骤申请即可,过程简单。Scopes (范围)那里建议全选。 Token申请成功后,将Token复制到Token一…...

    2024/5/2 6:32:34
  9. Leetcode 838. 推多米诺 C++

    Leetcode 838. 推多米诺 题目 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立。 在开始时,我们同时把一些多米诺骨牌向左或向右推。每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。 同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌…...

    2024/4/29 16:20:38
  10. 网络安全三期8.12网络排错报告

    **网络排错报告**已知上图网络中有错误,需要将其查找出来并进行修改,使其能够正常的运行,以下是排错步骤及修改方案。 1、 对该拓补图中的所有结点从下自上进行分析: 首先对于pc端可能存在的ip,网关等错误造成无法通信,因此先先对其一一查看如下图由上图几张pc的ip,网关…...

    2024/4/29 16:20:34
  11. SpringBoot2.x配置logback

    由于SpringBoot默认整合的就是logback,所以相关的依赖是不需要引入的。spring-boot-starter包下已经把相关依赖引入好了。所以我们只需要加入logback相关的配置就可以了。 在application.yml文件中配置; logging:level:root: infoconfig: classpath:logback.xml在resources中新…...

    2024/4/29 16:20:30
  12. VS安装万头文件bits/stdc++.h

    找到文件夹include。 我的include目录是"C:\Program Files (x86)\Visual Studio\VC\Tools\MSVC\14.26.28801\include",仅供参考 找到后,新建文件夹,命名为bits,并进入 在bits文件夹中新建一个txt,并打开 将下面的代码复制黏贴进去 #ifndef _GLIBCXX_NO_ASSERT #…...

    2024/4/29 16:20:26
  13. 8-12 队伍训练2

    序号 题目 Solved Attempted 补题A Tokitsukaze and Rescue / 铁子 铁子B Blow up the Enemy 铁子 /C Contest of Rope Pulling / /D Deliver the Cake / 午夜 午夜E Equal Sentences 铁子 /F Go Running / /G Kindergarten Physics 午夜 /H Last Problem / 铁子I Tetrahedron …...

    2024/5/2 21:07:13
  14. Python学习,小甲鱼课后作业

    class ticket:pri = 100person = day = def money (self , person , day):pri = 100self.person = personself.day = day# 判断是不是小孩if self.person == c:pri = 50# 判断是不是假期if self.day == h:pri = pri * 1.2return pricnt = 0 a = ticket() ans = 0cnt = int(…...

    2024/4/29 16:20:19
  15. 论文《CROSS: Cross-Platform Recommendation for Social E-Commerce》阅读

    论文《CROSS: Cross-Platform Recommendation for Social E-Commerce》阅读论文概况论文亮点IntroductionRelated WorkData & Preliminary StudyDataPreliminary StudyQ1. 社交媒体的购物占比Q2. 不同平台购物模式区别Q3. 好友关系的影响Preliminaries问题形式化baselinesC…...

    2024/4/29 16:20:14
  16. 8.12

    //定义二维空间点的坐标结构体,实现求两点中点的坐标 #include using namespace std; struct point { double x; double y; }; int main() { point p1, p2, p0; cin >> p1.x >> p1.y; cin >> p2.x >> p2.y; p0.x = (p1.x + p2.x) / 2; p0.y = (p1.y +…...

    2024/4/29 16:20:10
  17. Redis参数转换API

    编辑工具API 此工具API主要负责将用户参数转换为JSON或者将JSOn串转换为对象,简化客户端的使用 1.创建工具类ObjectMapperUtil public class ObjectMapperUtil {}2.创建工具API对象private static final ObjectMapper MAPPER = new ObjectMapper();3.封装API 将传入对象转换为J…...

    2024/4/29 16:20:05
  18. 关于artifact、war、jar、war exploded

    intellij中Project Structure中的artifacts到底是什么? 官方定义是这样的:An artifact is an assembly of your project assets that you put together to test, deploy or distribute your software solution or its part. Examples are a collection of compiled Java clas…...

    2024/4/29 16:20:05
  19. sql 按xxx属性分组,取yyy属性最大值所在行的数据

    SELECTx.* FROMb_purchase_order_detail x WHEREx.TAX_AMOUNT = ( SELECT max( y.TAX_AMOUNT ) FROM b_purchase_order_detail y WHERE x.MATERIAL_ID = y.MATERIAL_ID ) ORDER BYx.MATERIAL_ID;...

    2024/4/29 16:19:58
  20. 手写简易顺序表 - SimpleVector

    使用C++手写简易顺序表在C++的STL中最常用的数据结构可谓是std::vector了, vector弥补了数组不可以动态扩展的缺陷并且保证了储存在连续的内存块中,使访问效率很高。 std::vector就是标准的顺序表,类似的还有Java中的ArrayList,那么他们是如何实现的呢? 这里,我们就来一起…...

    2024/4/29 16:19:54

最新文章

  1. 鸿蒙原生应用元服务开发-Web加载本地页面

    将本地页面文件放在应用的rawfile目录下,开发者可以在Web组件创建的时候指定默认加载的本地页面 ,并且加载完成后可通过调用loadUrl()接口变更当前Web组件的页面。 在下面的示例中展示加载本地页面文件的方法: 将资源文件放置在应用的resou…...

    2024/5/2 21:45:31
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/3/20 10:50:27
  3. 微信小程序实现左滑删除

    效果 实现思路 使用的是官方提供的movable-area 嵌套movable-view 1、movable-area:注意点,需要设置其高度,否则会出现列表内容重叠的现象。 2、由于movable-view需要向右移动,左滑的时候给删除控件展示的空间,故 mov…...

    2024/5/1 13:30:10
  4. CentOS 7查看磁盘空间

    CentOS如何查看硬盘大小? CentOS是一种基于Linux的操作系统,主要用于服务器端应用。在服务器管理中,硬盘大小是一个非常重要的指标,查看硬盘大小可以帮助系统管理员有效地管理硬盘空间和避免硬盘满了的情况。 方法一&#xff1a…...

    2024/4/29 20:07:12
  5. 416. 分割等和子集问题(动态规划)

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

    2024/5/2 11:19:01
  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/2 16:04:58
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

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

    2024/5/1 21:18:12
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

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

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

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

    2024/5/2 9:47:31
  10. 【Objective-C】Objective-C汇总

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

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

    👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...

    2024/5/2 9:47:30
  12. 【ES6.0】- 扩展运算符(...)

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

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

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

    2024/5/2 5:31:39
  14. Go语言常用命令详解(二)

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

    2024/5/1 20:22:59
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

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

    2024/5/2 9:47:28
  16. 【NGINX--1】基础知识

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

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

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

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

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

    2024/5/2 8:37:00
  19. --max-old-space-size=8192报错

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

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

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

    2024/5/2 9:47:25
  21. JS原型对象prototype

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

    2024/5/1 14:33:22
  22. C++中只能有一个实例的单例类

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

    2024/5/2 18:46:52
  23. python django 小程序图书借阅源码

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

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

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

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

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

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

    %读入6幅图像(每一幅图像的大小是564*564) 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系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 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系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...

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

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

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

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

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

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

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

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

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

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

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

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