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

【大数据】Flink 详解(二):核心篇 Ⅲ

Flink 详解(二):核心篇 Ⅲ

29、Flink 通过什么实现可靠的容错机制?

Flink 使用 轻量级分布式快照,设计检查点(checkpoint)实现可靠容错。

在这里插入图片描述

30、什么是 Checkpoin 检查点?

Checkpoint 被叫做 检查点,是 Flink 实现容错机制最核心的功能,是 Flink 可靠性的基石,它能够根据配置周期性地基于 Stream 中各个 Operator 的 状态 来生成 Snapshot 快照,从而将这些状态数据定期持久化存储下来,当 Flink 程序一旦意外崩溃时,重新运行程序时可以有选择地从这些 Snapshot 进行恢复,从而修正因为故障带来的程序数据状态中断。

Flink 的 Checkpoint 机制原理来自 Chandy-Lamport algorithm 算法(一种分布式快照算法)。

注意区分 State 和 Checkpoint:

1.State

  • 一般指一个具体的 Task/Operator 的状态(Operator 的状态表示一些算子在运行的过程中会产生的一些中间结果)。
  • State 数据默认保存在 Java 的堆内存中 / TaskManage 节点的内存中。
  • State 可以被记录,在失败的情况下数据还可以恢复。

2.Checkpoint

  • 表示了一个 FlinkJob 在一个特定时刻的一份全局状态快照,即包含了所有 Task/Operator 的状态。

  • 可以理解为 Checkpoint 是把 State 数据定时持久化存储了。

  • 比如 KafkaConsumer 算子中维护的 Offset 状态,当任务重新恢复的时候可以从 Checkpoint 中获取。

31、什么是 Savepoint 保存点?

保存点 在 Flink 中叫作 Savepoint,是基于 Flink 检查点机制的应用完整快照备份机制,用来保存状态,可以在另一个集群或者另一个时间点从保存的状态中将作业恢复回来。适用于 应用升级集群迁移Flink 集群版本更新A/B 测试 以及 假定场景暂停和重启、归档 等场景。保存点可以视为一个(算子 ID → State)的 Map,对于每一个有状态的算子,Key 是算子 ID,Value 是算子 State。

32、什么是 CheckpointCoordinator 检查点协调器?

Flink 中检查点协调器叫作 CheckpointCoordinator,负责协调 Flink 算子的 State 的分布式快照。当触发快照的时候,CheckpointCoordinator 向 Source 算子中注入 Barrier 消息 ,然后等待所有的 Task 通知检查点确认完成,同时持有所有 Task 在确认完成消息中上报的 State 句柄。

33、Checkpoint 中保存的是什么信息?

检查点里面到底保存着什么信息呢?我们以 Flink 消费 Kafka 数据 Wordcount 为例:

1、我们从 Kafka 读取到一条条的日志,从日志中解析出 app_id,然后将统计的结果放到内存中一个 Map 集合,app_id 做为 key,对应的 pv 做为 value,每次只需要将相应 app_idpv + 1 +1 +1 后 put 到 Map 中即可;

2、kafka topic:test;

3、Flink 运算流程如下:

在这里插入图片描述
kafka topic 有且只有一个分区。

假设 kafka 的 topic-test 只有一个分区,flink 的 Source task 记录了当前消费到 kafka test topic 的所有 partition 的 offset

例:(0,1000)表示 0 号 partition 目前消费到 offset 为 1000 的数据。

Flink 的 pv task 记录了当前计算的各 app 的 pv 值,为了方便讲解,我这里有两个 app:app1、app2。

例:(app1,50000)(app2,10000)
表示 app1 当前 pv 值为 50000
表示 app2 当前 pv 值为 10000
每来一条数据,只需要确定相应 app_id,将相应的 value 值 +1 后 put 到 map 中即可。

该案例中,CheckPoint 保存的其实就是 第 n 次 CheckPoint 消费的 offset 信息和各 app 的 pv 值信息,记录一下发生 CheckPoint 当前的状态信息,并将该状态信息保存到相应的状态后端。图下代码:(注:状态后端是保存状态的地方,决定状态如何保存,如何保障状态高可用,我们只需要知道,我们能从状态后端拿到 offset 信息和 pv 信息即可。状态后端必须是高可用的,否则我们的状态后端经常出现故障,会导致无法通过 checkpoint 来恢复我们的应用程序)。

chk-100
offset:(0,1000)
pv:(app1,50000)(app2,10000)
该状态信息表示第 100 次 CheckPoint 的时候, partition 0 offset 消费到了 1000,pv 统计。

34、当作业失败后,检查点如何恢复作业?

Flink 提供了 应用自动恢复机制手动作业恢复机制

1、应用自动恢复机制

Flink 设置有作业失败重启策略,包含三种:

  • 定期恢复策略fixed-delay):固定延迟重启策略会尝试一个给定的次数来重启 Job,如果超过最大的重启次数,Job 最终将失败,在连续两次重启尝试之间,重启策略会等待一个固定时间,默认 Integer.MAX_VALUE 次。

  • 失败比率策略failure-rate):失败比率重启策略在 Job 失败后重启,但是超过失败率后,Job 会最终被认定失败,在两个连续的重启尝试之间,重启策略会等待一个固定的时间。

  • 直接失败策略None):失败不重启。

2、手动作业恢复机制

因为 Flink 检查点目录分别对应的是 JobId,每通过 flink run 方式 / 页面提交方式恢复都会重新生成 JobId,Flink 提供了在启动之时通过设置 -s 参数指定检查点目录的功能,让新的 Jobld 读取该检查点元文件信息和状态信息,从而达到指定时间节点启动作业的目的。

启动方式如下:

/bin/flink -s /flink/checkpoints/03112312a12398740a87393/chk-50/_metadata

35、当作业失败后,从保存点如何恢复作业?

从保存点恢复作业并不简单,尤其是在作业变更(如修改逻辑、修复 Bug)的情况下, 需要考虑如下几点:

  • 算子的顺序改变。如果对应的 UID 没变,则可以恢复;如果对应的 UID 变了,恢复失败。
  • 作业中添加了新的算子。如果是无状态算子,没有影响,可以正常恢复;如果是有状态的算子,跟无状态的算子一样处理。
  • 从作业中删除了一个有状态的算子。默认需要恢复保存点中所记录的所有算子的状态,如果删除了一个有状态的算子,从保存点恢复的时候被删除的 OperatorID 找不到,所以会报错,可以通过在命令中添加 --allowNonReStoredSlale(short: -n) 跳过无法恢复的算子 。
  • 添加和删除无状态的算子。如果手动设置了 UID 则可以恢复,保存点中不记录无状态的算子。如果是自动分配的 UID ,那么有状态算子的可能会变(Flink 一个单调递增的计数器生成 UID,DAG 改变,计数器极有可能会变)很有可能恢复失败。

36、Flink 如何实现轻量级异步分布式快照?

要实现分布式快照,最关键的是能够将数据流切分。Flink 中使用 屏障Barrier)来切分数据流。 Barrierr 会周期性地注入数据流中,作为数据流的一部分,从上游到下游被算子处理。Barrier 会严格保证顺序,不会超过其前边的数据。Barrier 将记录分割成记录集,两个 Barrier 之间的数据流中的数据隶属于同一个检查点每一个 Barrier 都携带一个其所属快照的 ID 编号。Barrier 随着数据向下流动,不会打断数据流,因此非常轻量。 在一个数据流中,可能会存在多个隶属于不同快照的 Barrier ,并发异步地执行分布式快照,如下图所示:
在这里插入图片描述
Barrier 会在数据流源头被注人并行数据流中。Barrier n n n 所在的位置就是恢复时数据重新处理的起始位置。 例如,在 Kafka 中,这个位置就是最后一个记录在分区内的偏移量(offset),作业恢复时,会根据这个位置从这个偏移量之后向 Kafka 请求数据,这个偏移量就是 State 中保存的内容之一。

Barrier 接着向下游传递。当一个非数据源算子从所有的输入流中收到了快照 n n n 的 Barrier 时,该算子就会对自己的 State 保存快照,并向自己的下游 广播发送 快照 n n n 的 Barrier。一旦 Sink 算子接收到 Barrier,有两种情况:

  • 如果是引擎内严格一次处理保证,当 Sink 算子已经收到了所有上游的 Barrie n n n 时, Sink 算子对自己的 State 进行快照,然后通知检查点协调器(CheckpointCoordinator)。当所有的算子都向检查点协调器汇报成功之后,检查点协调器向所有的算子确认本次快照完成。
  • 如果是端到端严格一次处理保证,当 Sink 算子已经收到了所有上游的 Barrie n n n 时, Sink 算子对自己的 State 进行快照,并 预提交事务(两阶段提交的第一阶段),再通知检查点协调器(CheckpointCoordinator),检查点协调器向所有的算子确认本次快照完成,Sink 算子 提交事务(两阶段提交的第二阶段),本次事务完成。

我们接着 33 33 33 的案例来具体说一下如何执行分布式快照:

对应到 pv 案例中就是,Source Task 接收到 JobManager 的编号为 chk-100(从最近一次恢复)的 CheckPoint 触发请求后,发现自己恰好接收到 Kafka offset(0,1000) 处的数据,所以会往 offset(0,1000) 数据之后,offset(0,1001) 数据之前,安插一个 Barrier,然后自己开始做快照,也就是将 offset(0,1000) 保存到状态后端 chk-100 中。然后 Barrier 接着往下游发送,当统计 pv 的 task 接收到 Barrier 后,也会暂停处理数据,将自己内存中保存的 pv 信息 (app1,50000)(app2,10000) 保存到状态后端 chk-100 中。OK,Flink 大概就是通过这个原理来保存快照的。

统计 pv 的 task 接收到 Barrier,就意味着 Barrier 之前的数据都处理了,所以说,不会出现丢数据的情况。

37、什么是 Barrier 对齐?

在这里插入图片描述
上图从左至右分别表示:开始对齐,对齐,执行检查点,继续处理数据。

一旦 operator 从输入流接收到 checkpoint barrier n n n,它就不能处理来自该流的任何数据记录,直到它从其他所有输入接收到 barrier n n n 为止。否则,它会混合属于快照 n n n 的记录和属于快照 n + 1 n + 1 n+1 的记录;

如上图所示

  • 1 1 1:算子收到数字流的 Barrier,字母流对应的 Barrier 尚未到达。
  • 2 2 2:算子收到数字流的 Barrier,会继续从数字流中接收数据,但这些流只能被搁置,记录不能被处理,而是放入缓存中,等待字母流 Barrier 到达。在字母流到达前, 1 、 2 、 3 1、2、3 123 数据已经被缓存。
  • 3 3 3:字母流到达,算子开始对齐 State 进行异步快照,并将 Barrier 向下游广播,并不等待快照执行完毕。
  • 4 4 4:算子做异步快照,首先处理缓存中积压数据,然后再从输入通道中获取数据。

38、什么是 Barrier 不对齐?

Checkpoint 是要等到所有的 Barrier 全部都到才算完成。

上述图 2 2 2 中,当还有其他输入流的 Barrier 还没有到达时,会把已到达的 Barrier 之后的数据 1 、 2 、 3 1、2、3 123 搁置在缓冲区,等待其他流的 Barrier 到达后才能处理。

Barrier 不对齐:就是指当还有其他流的 Barrier 还没到达时,为了不影响性能,也不用理会,直接处理 Barrier 之后的数据。等到所有流的 Barrier 的都到达后,就可以对该 Operator 做 Checkpoint 了。

39、为什么要进行 Barrier 对齐?不对齐到底行不行?

Exactly Once 时必须 Barrier 对齐,如果 Barrier 不对齐就变成了 At Least Once

Checkpoint 的目的就是为了保存快照,如果不对齐,那么在 chk-100 快照之前,已经处理了一些 chk-100 对应的 offset 之后的数据,当程序从 chk-100 恢复任务时,chk-100 对应的 offset 之后的数据还会被处理一次,所以就出现了重复消费。

41、要实现 Exactly-Once 需具备什么条件?

流系统要实现 Exactly-Once,需要保证上游 Source 层、中间计算层和下游 Sink 层三部分同时满足端到端严格一次处理,如下图:

在这里插入图片描述
Source 端:数据从上游进入 Flink,必须保证消息严格一次消费。同时 Source 端必须满足可重放(replay)。否则 Flink 计算层收到消息后未计算,却发生 failure 而重启,消息就会丢失。

Flink 计算层:利用 Checkpoint 机制,把状态数据定期持久化存储下来,Flink 程序一旦发生故障的时候,可以选择状态点恢复,避免数据的丢失、重复。

Sink 端:Flink 将处理完的数据发送到 Sink 端时,通过 两阶段提交协议 ,即 TwoPhaseCommitSinkFunction 函数。该 SinkFunction 提取并封装了两阶段提交协议中的公共逻辑,保证 Flink 发送 Sink 端时实现严格一次处理语义。同时,Sink 端必须支持事务机制,能够进行数据回滚或者满足幂等性。

  • 回滚机制:即当作业失败后,能够将部分写入的结果回滚到之前写入的状态。
  • 幂等性:就是一个相同的操作,无论重复多少次,造成的结果和只操作一次相等。即当作业失败后,写入部分结果,但是当重新写入全部结果时,不会带来负面结果,重复写入不会带来错误结果。

42、什么是两阶段提交协议?

两阶段提交协议Two-Phase Commit2PC)是解决分布式事务问题最常用的方法,它可以保证在分布式事务中,要么所有参与进程都提交事务,要么都取消,即实现 A C I D ACID ACID 中的 A A A(原子性)。

两阶段提交协议中有两个重要角色,协调者Coordinator)和 参与者Participant),其中协调者只有一个,起到分布式事务的协调管理作用,参与者有多个。

两阶段提交阶段分为两个阶段:投票阶段Voting)和 提交阶段Commit)。

(1)投票阶段

  • 协调者向所有参与者发送 prepare 请求和事务内容,询问是否可以准备事务提交,等待参与者的响应。
  • 参与者执行事务中包含的操作,并记录 undo 日志(用于回滚)和 redo 日志(用于重放),但不真正提交。
  • 参与者向协调者返回事务操作的执行结果,执行成功返回 yes,失败返回 no

(2)提交阶段

  • 分为成功与失败两种情况。
  • 若所有参与者都返回 yes,说明事务可以提交:
    • 协调者向所有参与者发送 commit 请求。
    • 参与者收到 commit 请求后,将事务真正地提交上去,并释放占用的事务资源,并向协调者返回 ack
    • 协调者收到所有参与者的 ack 消息,事务成功完成,如下图:

在这里插入图片描述
在这里插入图片描述

  • 若有参与者返回 no 或者超时未返回,说明事务中断,需要回滚:
    • 协调者向所有参与者发送 rollback 请求。
    • 参与者收到 rollback 请求后,根据 undo 日志回滚到事务执行前的状态,释放占用的事务资源,并向协调者返回 ack
    • 协调者收到所有参与者的 ack 消息,事务回滚完成。

在这里插入图片描述
在这里插入图片描述

43、Flink 如何保证 Exactly-Once 语义?

Flink 通过 两阶段提交协议 来保证 Exactly-Once 语义。

对于 Source 端:Source 端严格一次处理比较简单,因为数据要进入 Flink 中,所以 Flink 只需要保存消费数据的偏移量(offset)即可。如果 Source 端为 Kafka,Flink 将 Kafka Consumer 作为 Source,可以将偏移量保存下来,如果后续任务出现了故障,恢复的时候可以由连接器重置偏移量,重新消费数据,保证一致性。

对于 Sink 端:Sink 端是最复杂的,因为数据是落地到其他系统上的,数据一旦离开 Flink 之后,Flink 就监控不到这些数据了,所以严格一次处理语义必须也要应用于 Flink 写入数据的外部系统,故这些外部系统必须提供一种手段允许提交或回滚这些写入操作,同时还要保证与 Flink Checkpoint 能够协调使用(Kafka 0.11 0.11 0.11 版本已经实现精确一次处理语义)。

我们以 Kafka - Flink - Kafka 为例 说明如何保证 Exactly-Once 语义。

在这里插入图片描述
如上图所示:Flink 作业包含以下算子。

  • 一个 Source 算子,从 Kafka 中读取数据(即 KafkaConsumer
  • 一个窗口算子,基于时间窗口化的聚合运算(即 window+window 函数)
  • 一个 Sink 算子,将结果写会到 Kafka(即 KafkaProducer

Flink 使用 两阶段提交协议,即 预提交Pre-commit)阶段和 提交Commit)阶段保证端到端严格一次。

1、预提交阶段

(1)当 Checkpoint 启动时,进入预提交阶段,JobManager 向 Source Task 注入检查点分界线(CheckpointBarrier),Source Task 将 CheckpointBarrier 插入数据流,向下游广播开启本次快照,如下图所示:

在这里插入图片描述
(2)Source 端:Flink Data Source 负责保存 KafkaTopic 的 offset 偏移量,当 Checkpoint 成功时 Flink 负责提交这些写入,否则就终止取消掉它们,当 Checkpoint 完成位移保存,它会将 Checkpoint Barrier(检查点分界线) 传给下一个 Operator,然后每个算子会对当前的状态做个快照,保存到 状态后端(State Backend)。

对于 Source 任务而言,就会把当前的 offset 作为状态保存起来。下次从 Checkpoint 恢复时,Source 任务可以重新提交偏移量,从上次保存的位置开始重新消费数据,如下图所示:

在这里插入图片描述
(3)Slink 端:从 Source 端开始,每个内部的 Transformation 任务遇到 Checkpoint Barrier(检查点分界线)时,都会把状态存到 Checkpoint 里。数据处理完毕到 Sink 端时,Sink 任务首先把数据写入外部 Kafka,这些数据都属于预提交的事务(还不能被消费),此时的 Pre-commit 预提交阶段下 ,Data Sink 在保存状态到状态后端的同时还必须预提交它的外部事务,如下图所示:

在这里插入图片描述
2、提交阶段

(4)当所有算子任务的快照完成(所有创建的快照都被视为是 Checkpoint 的一部分),也就是这次的 Checkpoint 完成时,JobManager 会向所有任务发通知,确认这次 Checkpoint 完成,此时 Pre-commit 预提交阶段才算完成。才正式到两阶段提交协议的第二个阶段:Commit 阶段。该阶段中 JobManager 会为应用中每个 Operator 发起 Checkpoint 已完成的回调逻辑。

本例中的 Data Source 和窗口操作无外部状态,因此在该阶段,这两个 Opeartor 无需执行任何逻辑,但是 Data Sink 是有外部状态的,此时我们必须提交外部事务,当 Sink 任务收到确认通知,就会正式提交之前的事务,Kafka 中未确认的数据就改为 “已确认”,数据就真正可以被消费了,如下图所示:

在这里插入图片描述
:Flink 由 JobManager 协调各个 TaskManager 进行 Checkpoint 存储,Checkpoint 保存在 StateBackend(状态后端) 中,默认 StateBackend 是内存级的,也可以改为文件级的进行持久化保存。

44、数的很好,很清楚,那你对 Flink 端到端 严格一次 Exactly-Once 语义做个总结。

在这里插入图片描述

相关文章:

【大数据】Flink 详解(二):核心篇 Ⅲ

Flink 详解(二):核心篇 Ⅲ 29、Flink 通过什么实现可靠的容错机制? Flink 使用 轻量级分布式快照,设计检查点(checkpoint)实现可靠容错。 30、什么是 Checkpoin 检查点? Checkpoint …...

Jmeter性能测试系列-性能测试需求分析

性能测试需求分析 性能测试需求分析与传统的功能测试需求有所不同,功能测试需求分析重点在于从用户层面分析被测对象的功能性、易用性等质量特性,性能测试则需要从终端用户应用、系统架构设计、硬件配置等多个纬度分析系统可能存在性能瓶颈的业务。 性…...

Syncfusion Essential Studio JavaScrip Crack

Syncfusion Essential Studio JavaScrip Crack 数据透视表 添加了在将数据透视表导出到PDF文档时自定义列宽的支持。 签名 添加了对在特定位置绘制文本的支持。 Syncfusion Essential Studio for JavaScript在一个包中包含80多个高性能、轻量级、模块化和响应式UI组件。包括Jav…...

8.13黄金是否进入下行通道?下周开盘如何布局

近期有哪些消息面影响黄金走势?黄金多空该如何研判? ​黄金消息面解析:周五(8月11日)现货黄金小幅收低,受累于美元走强和美国国债收益率上升,本周录得6月底以来最差单周表现。投资者在评估最新一批通胀报告和消费者信…...

Idea的基本使用带案例---详细易懂

一.idea是什么 有专业人士说,idea是天生适合做微软,当时我还想肯定是夸大其词了,但当你用起来的时候确实很爽,😊😊 ntelliJ IDEA是一种集成开发环境(IDE),由JetBrains开发…...

MySQL中的用户管理

系列文章目录 MySQL常见的几种约束 MySQL中的函数 MySQL中的事务 MySQL中的视图 MySQL中的索引 文章目录 系列文章目录前言一、用户管理1、用户管理入门2、用户管理操作及示例 二、权限管理1.权限管理语法2.权限操作示例 三、角色管理1、角色管理入门2、角色操作示例 总结…...

【STM32】利用CubeMX对FreeRTOS用按键控制任务

对于FreeRTOS中的操作,最常用的就是创建、删除、暂停和恢复任务。 此次实验目标: 1.创建任务一:LED1每间隔1秒闪烁一次,并通过串口打印 2.创建任务二:LED2每间隔0.5秒闪烁一次,并通过串口打印 3.创建任…...

c# .net mvc的IHttpHandler奇妙之旅--图片文件请求安全过滤,图片防盗链

源码下载: c# .net mvc图片文件请求安全过滤,图片防盗链 https://download.csdn.net/download/cplvfx/88206428 在阅读该文章前,请先阅读该文章 c# .net mvc的IHttpHandler奇妙之旅。.net的生命周期和管道你听说过吗?你可以利用他处理业务如:跳转业务页面,文件请求的安全…...

STM32F407使用Helix库软解MP3并通过DAC输出,最精简的STM32+SD卡实现MP3播放器

只用STM32单片机SD卡耳机插座,实现播放MP3播放器! 看过很多STM32软解MP3的方案,即不通过类似VS1053之类的解码器芯片,直接用STM32和软件库解码MP3文件,通常使用了labmad或者Helix解码库实现,Helix相对labm…...

STM32 CAN 过滤器设置

做个笔记吧 ,免得以后忘记了 芯片是stm32F207 ,用cubeMX 6.80 版本生成 CAN 的使用总体包含4个部分 第一步:CAN初始化,配置波特率 (cubeMX 里面配置好后自动生成,不需要手动添加) MX_CAN1_Init(); 第二步&#…...

日常BUG—— maven编译报错

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 一个maven项目在由于在代码中书写了如下代码&#xff1a; public static ConcurrentMap<…...

Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理

Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理 目录 Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理 一、简单介绍 二、实现原理 三、实现步骤 四、关键代码 一、简单介绍 Unity 工具类&#xff0c;自己整理的一些游戏开发可…...

学习Vue:插值表达式和指令

在 Vue.js 中&#xff0c;Vue 实例与数据绑定是构建动态交互界面的关键。在这篇文章中&#xff0c;我们将重点介绍 Vue 实例中两种实现数据绑定的方式&#xff1a;插值表达式和指令。这些机制允许您将数据无缝地渲染到界面上&#xff0c;实现实时的数据更新和展示。 插值表达式…...

echart 3d立体颜色渐变柱状图

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 1.需求描述 根据业务需求将不同的法律法规&#xff0c;展示不同的3d立体渐变柱状图。 2.先看下效果图 3. 确定三面的颜色&#xff0c;这里我是自定义的颜色 // 右面生成颜色const rightColorArr ref(["#79D…...

linux shell变量

linux shell变量 1、变量命名规则2、只读变量3、删除变量 1、变量命名规则 变量名不能加$命名只能使用英文字母、数字和下划线&#xff0c;首个字母不能以数字开头中间不能有空格。可以有下划线不能使用标点符号不能使用bash中的关键字 username"tom"引用 $userna…...

Linux 发行版 Debian 12.1 发布

在今年 6 月初&#xff0c;Debian 12“bookworm”发布&#xff0c;而日前 Debian 迎来了 12.1 版本&#xff0c;主要修复系统用户创建等多个安全问题。 Debian 是最古老的 GNU / Linux 发行版之一&#xff0c;也是许多其他基于 Linux 的操作系统的基础&#xff0c;包括 Ubuntu…...

【Rust】Rust学习 第七章使用包、Crate和模块管理不断增长的项目

目前为止&#xff0c;我们编写的程序都在一个文件的一个模块中。伴随着项目的增长&#xff0c;你可以通过将代码分解为多个模块和多个文件来组织代码。一个包可以包含多个二进制 crate 项和一个可选的 crate 库。伴随着包的增长&#xff0c;你可以将包中的部分代码提取出来&…...

网站SSL安全证书是什么及其重要性

网站SSL安全证书具体来说是一个数字文件&#xff0c;是由受信任的数字证书颁发机构&#xff08;CA机构&#xff09;进行审核颁发的&#xff0c;其中包含CA发布的信息&#xff0c;该信息表明该网站已使用加密连接进行了安全保护。 网站SSL安全证书也被称为SSL证书、https证书和…...

Android Alarm闹钟API使用心得

前言 有什么办法可以在不打开App的时候&#xff0c;也能够触发一些操作呢&#xff1f;比如说发送通知&#xff0c;解决这个需求的办法有很多种选择&#xff0c;比如说官方推荐的WorkManager API&#xff0c;可以在后台执行一次性、耗时、定时的任务&#xff0c;但WorkManager是…...

什么是业务敏捷,如何实现业务敏捷?

点击链接了解详情 作者介绍 前言 随着越来越多行业的企业开始关注敏捷&#xff0c;业务敏捷&#xff08;Business Agility&#xff09;成为一个新的热点。毕竟大部分的行业和组织与软件无关&#xff0c;但是依然要实现业务上的敏捷&#xff0c;所以这个系列会主要谈两点&#…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...