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

202535| Kafka架构与重要概念+幂等性+事务

好的!以下是关于 Kafka 架构 以及其 重要概念 的详细介绍,结合 Mermaid 图形表格,帮助你更好地理解各个概念的关系和作用。


Kafka 架构与重要概念

Kafka 是一个分布式消息系统,广泛应用于日志收集、流处理、事件驱动架构等场景。它采用高吞吐量、可扩展的架构,支持多个组件进行数据的发布、订阅、存储和消费。

一、Kafka 架构图(Mermaid 格式)

Topic 分区
发送消息
存储消息
发送消息
存储消息
存储消息
协调与管理
消费消息
消费消息
Partition 0
Leader: Kafka-1
Replica: Kafka-2, Kafka-3
Partition 1
Leader: Kafka-2
Replica: Kafka-1, Kafka-3
Partition 2
Leader: Kafka-3
Replica: Kafka-1, Kafka-2
Producer
Kafka Broker 1
ZooKeeper
Kafka Broker 2
Consumer Group

二、Kafka 重要概念详细解释

概念说明
BrokerKafka 服务器节点,负责存储和管理消息。每个 Broker 处理多个 Topic 和 Partition 的数据读写。
ZooKeeper分布式协调服务,Kafka 用它来管理集群的元数据,协调 Broker 状态,选举 Leader 等。
Producer消息的生产者,将数据发布到指定的 Topic 中。
Consumer消息的消费者,从 Kafka 中获取数据并进行处理。
Consumer Group由多个 Consumer 组成,Kafka 会确保每个分区在 Consumer Group 中只被一个消费者消费。
TopicKafka 中的主题,用于组织和分类消息。
Partition每个 Topic 被划分为多个分区,分区是 Kafka 存储消息的基本单位。
Replica分区的副本,确保数据的高可用性。每个分区可以有多个副本,其中一个为 Leader。
OffsetKafka 中每条消息在分区内的唯一标识,消费者通过 Offset 来追踪自己消费的进度。

三、Kafka 架构中的各个组件

1. Broker(Kafka 代理)

  • 定义:Kafka 中的 Broker 是负责存储消息并处理客户端请求的节点。每个 Broker 负责多个 Topic 和 Partition 的数据读写。
  • 角色:Kafka 集群由多个 Broker 组成,集群中的 Broker 节点共同工作,确保数据的存储、消费和高可用性。
  • 作用:Broker 接受来自 Producer 的消息,将其存储在本地磁盘中,并提供 Consumer 按需读取。

2. ZooKeeper(协调服务)

  • 定义:ZooKeeper 是一个分布式协调服务,用于管理 Kafka 集群的元数据和协调 Broker 的状态。Kafka 使用 ZooKeeper 来进行 Broker 的注册、Leader 选举等管理操作。
  • 作用:它帮助 Kafka 保持一致性、选举 Leader 和管理集群状态。ZooKeeper 集群中可以有多个节点,提供高可用性。

3. Producer(生产者)

  • 定义:Producer 是向 Kafka 集群发送消息的客户端。它将消息发送到指定的 Topic 中。
  • 作用:Producer 可以选择发送到特定的 Partition,也可以选择由 Kafka 自动分配 Partition。
  • 分区选择:Producer 可以通过指定一个 key 来确保某一类消息始终发送到同一个分区,或者由 Kafka 根据负载均衡策略自动选择。

4. Consumer(消费者)

  • 定义:Consumer 是从 Kafka 中读取消息并处理的客户端。它可以订阅一个或多个 Topic,读取分区中的消息。
  • 作用:Consumer 从 Kafka 中消费消息,通常会从消息的 Offset 开始读取。消费者通常会在自己的 Offset 位置继续消费。

5. Consumer Group(消费组)

  • 定义:Consumer Group 是由多个 Consumer 组成的一组消费者。每个 Consumer Group 内的消费者共同消费同一个 Topic 的消息,但每个分区的消息只有一个消费者消费。
  • 作用:通过消费组,Kafka 可以实现消息的并行消费。每个消费组都会维护自己的 Offset 独立于其他消费组。

6. Topic(主题)

  • 定义:Topic 是 Kafka 中的消息分类标签。Producer 将消息发送到特定的 Topic,Consumer 可以订阅一个或多个 Topic 来消费消息。
  • 作用:Topic 是 Kafka 消息的逻辑分组,可以帮助管理不同种类的消息流。

7. Partition(分区)

  • 定义:每个 Topic 会被划分成多个 Partition,Partition 是 Kafka 存储消息的最小单位。每个分区存储消息的顺序,并且每个 Partition 都有一个 Leader 和若干个 Follower 副本。
  • 作用:分区提供了水平扩展的能力,可以增加分区来处理更高的消息吞吐量和并发消费。

8. Replica(副本)

  • 定义:每个分区都有多个副本(Replica),其中一个副本是 Leader,负责处理所有的读写请求。其他副本是 Follower,负责同步数据。
  • 作用:副本保证了 Kafka 集群的数据高可用性和容错性。即使某个 Broker 节点失败,其他副本仍然可以保证数据不丢失。

9. Offset(偏移量)

  • 定义:Offset 是 Kafka 中每条消息在分区内的唯一标识。每个消费者在消费消息时都会记录自己的 Offset 位置。
  • 作用:Offset 使得 Kafka 的消息消费具有高可控性。消费者可以从特定的 Offset 开始消费消息,也可以重新从头消费历史消息。

Kafka生产者幂等性

Kafka 生产者的幂等性功能是为了保证消息的 一次性写入。即使在网络超时、生产者重试等情况下,消息依然能够保证 只被写入一次。为了实现这一目标,Kafka 利用一系列机制来控制消息的重复发送,并对每条消息进行唯一标识。

Kafka 生产者幂等性核心概念

  1. Producer ID (PID): 每个 Kafka 生产者实例都会在启动时获取一个唯一的 Producer ID。这是 Kafka 用来区分不同生产者的标识符,确保每个生产者发送的消息在 Kafka 集群中都有唯一标识。
  2. Sequence Number (序列号): 每个生产者发送的消息都有一个递增的序列号,Sequence Number 是 Kafka 用来判定消息是否重复的关键参数。序列号的递增可以确保即使是同一个生产者发送多条消息,Kafka 也能区分它们。
  3. Message Key & Partition: 消息的 Key 用来决定消息将发送到哪个分区,确保同一个 Key 的消息总是发送到同一个分区。分区内的消息顺序对于幂等性没有影响,但消息的重复性检查依赖于 Producer ID 和 Sequence Number。

生产者幂等性工作流程

为了解释 Kafka 是如何确保消息不被重复写入,我们可以将其工作过程分解为几个步骤:

  1. 生产者初始化
    • 每个生产者在启动时会向 Kafka 集群申请一个唯一的 Producer ID (PID),并且会从 Kafka 中获得一个初始的 Sequence Number
    • 生产者为每条发送的消息附上递增的序列号。
  2. 消息发送
    • 生产者向 Kafka 发送消息时,消息携带两个关键字段:Producer IDSequence Number。这些字段帮助 Kafka 区分不同生产者发送的消息,以及同一生产者发送的不同消息。
  3. 消息接收与存储
    • Kafka Broker 在接收到消息后,会先检查 Producer IDSequence Number。如果该消息的 Sequence Number 对应的消息已经存在,说明这是一个 重复消息,则 Kafka 会 忽略 该消息,不进行存储。
    • 如果消息是新的,Kafka 会将其存储,并将该消息的 Producer IDSequence Number 存储在元数据中。
  4. 消息重试
    • 在网络延迟或其他故障的情况下,生产者可能会重试发送相同的消息。由于生产者会附带相同的 Producer IDSequence Number,Kafka Broker 会识别到这是同一条消息,并 忽略 重试请求,确保消息只被写入一次。
  5. 消息确认
    • 在消息成功写入 Kafka 后,Broker 会将写入成功的确认返回给生产者。若发生故障或超时,生产者会继续重试,直到成功或者达到重试次数的上限。

Kafka 生产者幂等性详细流程图

为了让你更直观地理解这一过程,下面是一个更详细的图解,展示了生产者发送消息、重试以及如何避免重复消息写入的流程:

生产者 Kafka Broker ZooKeeper 消费者 生产者启动时,分配一个唯一的 PID 发送消息(消息 1) PID: 123 Sequence: 0 存储消息 1 的元数据 传递消息 1 网络延迟或故障,生产者重试发送相同消息 发送消息(消息 1) PID: 123 Sequence: 0 检查消息 1 是否已存在 消息已存在,重试请求忽略 不发送重复消息 发送消息(消息 2) PID: 123 Sequence: 1 存储消息 2 的元数据 传递消息 2 每条消息的 PID 和 Sequence Number 保证唯一性 生产者的 Sequence Number 在重试时会保持一致,确保幂等性 生产者 Kafka Broker ZooKeeper 消费者

工作原理解读

1. 生产者启动时

当生产者启动时,Kafka 为该生产者分配一个 Producer ID(如 123),并且给该生产者分配一个递增的 Sequence Number(从 0 开始)。每个消息都携带这些信息,确保 Kafka 能识别该生产者的每一条消息。

2. 生产者发送消息(消息 1)

生产者发送 消息 1 到 Kafka 集群,消息的内容包括:Producer ID: 123 和 Sequence Number: 0。Kafka 会根据这个信息将消息存储并传递给消费者。

3. 网络故障与重试

由于网络延迟或其他原因,生产者可能会重试发送相同的消息。此时,生产者再次发送 消息 1(Producer ID: 123, Sequence: 0)。Kafka 在收到这条消息时,会检查消息的 Producer IDSequence Number,发现这条消息已经存在,因此会 忽略 重复的消息。

4. 发送新的消息(消息 2)

当生产者发送 消息 2 时,Sequence Number 增加为 1,Kafka 会识别为新消息,并将其存储和传递给消费者。


Kafka 幂等性实现的关键因素

  1. Producer ID (PID)
    • 每个生产者在 Kafka 中都有一个唯一的 Producer ID,它用来标识消息的来源。即使网络重试,Kafka 也能根据 Producer ID 来区分不同的生产者。
  2. Sequence Number
    • 每个生产者发送的消息都有一个递增的序列号。这个序列号使 Kafka 能够区分同一生产者发送的不同消息,确保消息的顺序性。
  3. 去重机制
    • Kafka 使用 Producer IDSequence Number 来判断消息是否重复。如果收到相同 Producer IDSequence Number 的消息,Kafka 会认为这是一条重复消息,进而忽略它。
  4. 跨分区的一致性
    • Kafka 的幂等性机制是 跨分区的,即使消息被发送到多个分区,只要生产者的 Producer IDSequence Number 相同,Kafka 就会确保消息不重复写入。

生产者幂等性机制的优缺点

优点
  1. 保证消息准确性:即使发生网络重试、故障等问题,生产者也能保证消息 只写一次,避免了数据的重复和不一致。
  2. 提升容错能力:在发生故障或超时的情况下,生产者能够安全重试,并且 Kafka 会确保不会重复写入消息,增强了系统的容错性。
  3. 避免消费者重复消费:幂等性机制确保了消费者不会收到重复的消息,避免了重复消费和数据错误。
缺点
  1. 性能开销:启用幂等性会增加一定的性能开销,尤其在高吞吐量的场景下,Kafka 需要进行更多的检查和存储操作来确保消息唯一性。
  2. 对多生产者的支持有限:幂等性机制仅对单一生产者实例有效,不同生产者间无法共享幂等性状态。

Kafka 生产者幂等性配置示例

以下是一个典型的 Kafka 生产者配置,启用了幂等性功能:

java复制编辑
Properties properties = new Properties();
properties.put("bootstrap.servers", "localhost:9092");
properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");// 启用幂等性
properties.put("acks", "all");  // 等待所有副本确认
properties.put("retries", Integer.MAX_VALUE);  // 设置最大重试次数为最大值
properties.put("max.in.flight.requests.per.connection", 1);  // 防止并发请求导致乱序
properties.put("enable.idempotence", "true");  // 启用幂等性KafkaProducer<String, String> producer = new KafkaProducer<>(properties);
配置详解
  1. acks=all:等待所有副本确认后才返回确认,提供了最佳的消息可靠性。
  2. retries=Integer.MAX_VALUE:允许生产者无限次重试,直到成功。通过幂等性机制,Kafka 确保即使消息重试,也不会重复写入。
  3. max.in.flight.requests.per.connection=1:为了确保消息的顺序性,生产者一次只允许发送一个未确认的消息。
  4. enable.idempotence=true:启用幂等性,确保消息只写一次,即使发生重试,消息也不会重复。

KafKa事务

Kafka 事务简介

Kafka 的事务是一个强大的特性,它允许用户将多个消息的发送操作封装在一个 原子操作 中。通过事务,生产者可以确保多条消息的发送要么全部成功,要么全部失败。Kafka 的事务能够保证数据一致性,特别是在分布式环境下,避免了部分消息写入而其他消息丢失的问题。

Kafka 事务不仅仅用于生产者,也为消费者提供了 精确一次消费(Exactly Once Semantics, EOS)的能力。事务在 Kafka 中的应用解决了消息重复消费和漏消费的难题,提升了消息流的可靠性。


Kafka 事务的核心特点

  1. 原子性(Atomicity): Kafka 事务保证一组消息的发送要么全部成功,要么全部失败。若消息在事务内的某些操作失败,那么整个事务会被回滚,确保消息的原子性。
  2. 可靠性(Durability): 一旦事务提交,Kafka 会保证消息持久化,并且可以恢复事务内的消息。
  3. 一致性(Consistency): Kafka 确保事务内的消息要么全都提交,要么全都回滚,避免了数据不一致的情况。
  4. 隔离性(Isolation): Kafka 确保事务内的消息在事务提交之前对消费者是不可见的。即消费者只能看到已经提交的消息,未提交的事务消息对消费者是不可见的。

Kafka 事务的实现

Kafka 使用以下两种类型的标记来管理事务:

  • 事务开始:生产者发出开始事务的信号,所有后续发送的消息都属于这个事务。
  • 事务提交:生产者发出提交事务的信号,Kafka 将事务中的所有消息持久化,确保消息可供消费者读取。
  • 事务中止(回滚):如果生产者遇到错误并决定放弃事务,可以发出中止事务的信号,所有事务内的消息都不会被提交。

Kafka 会在事务日志中记录每个事务的状态。事务状态包括提交、回滚或未决(进行中)。


Kafka 事务的关键配置

  1. acks
    • 设置为 all,确保所有副本都确认消息,以提高消息可靠性和容错性。
  2. transactional.id
    • 这是 Kafka 生产者的一个关键配置,标识一个生产者实例的事务标识符。每个事务性生产者都需要设置这个唯一的标识符,以便 Kafka 能追踪事务状态。
  3. retries
    • 在事务中,重试机制非常重要,设置 retries 可以确保生产者在事务中的消息如果失败,可以重试。
  4. transaction.timeout.ms
    • 这个配置用于设置事务的超时时间,默认值是 60000 毫秒。若一个事务未在指定时间内提交或回滚,Kafka 会认为事务超时并自动中止事务。
  5. enable.idempotence
    • 在启用事务的同时,还需要启用幂等性,这样可以确保即使在网络中断或生产者重试的情况下,也不会重复发送相同的消息。

Kafka 事务的生产者使用流程

  1. 开启事务: 在生产者代码中,需要使用 beginTransaction() 方法显式地开始一个事务。
  2. 发送消息: 在事务中发送消息时,所有发送的消息都会被标记为事务的一部分,直到事务被提交或回滚。
  3. 提交事务: 通过 commitTransaction() 方法提交事务,Kafka 会将事务中的所有消息持久化。
  4. 回滚事务: 如果在事务过程中发生了错误,生产者可以使用 abortTransaction() 方法回滚事务,所有未提交的消息都不会被持久化。

事务的生产者代码示例

以下是一个使用 Kafka 事务的 Java 代码示例,演示如何开启事务、发送消息并提交事务。

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("acks", "all");
props.put("retries", Integer.MAX_VALUE);
props.put("transactional.id", "my-transaction-id");// 创建 KafkaProducer 实例
KafkaProducer<String, String> producer = new KafkaProducer<>(props);try {// 开始事务producer.beginTransaction();// 发送消息producer.send(new ProducerRecord<>("my-topic", "key1", "value1"));producer.send(new ProducerRecord<>("my-topic", "key2", "value2"));// 提交事务producer.commitTransaction();
} catch (ProducerFencedException | OutOfMemoryError | KafkaException e) {// 在发生异常时回滚事务producer.abortTransaction();
} finally {producer.close();
}

代码解释:

  1. 初始化生产者:配置 bootstrap.serversacks 等基本参数,并设置 transactional.id 来启用事务。
  2. 开始事务:通过 beginTransaction() 方法启动一个事务。
  3. 发送消息:消息会被添加到当前事务中,直到事务提交或回滚。
  4. 提交事务commitTransaction() 方法将事务中的所有消息持久化到 Kafka 集群中。
  5. 异常处理和回滚:如果发生异常(如网络中断、写入失败等),调用 abortTransaction() 方法回滚事务,确保事务内的消息不被写入。

Kafka 事务的消费者

Kafka 的事务不仅对生产者有效,还影响消费者的行为。启用事务后,消费者只能看到已经提交的消息,这意味着未提交的事务对消费者是不可见的。这保证了 精确一次消费(Exactly Once Semantics,EOS),确保消费者不会消费到重复或不完整的数据。

消费者的事务性读取:
  • 如果消费者消费到一个尚未提交的消息,它会等待直到该消息所在的事务提交。
  • 如果事务被回滚,消费者不会读取到该事务中的消息。
启用精确一次消费:

为了启用精确一次的消费,消费者需要设置 isolation.level 配置项,通常设置为 read_committed,这意味着消费者只会读取已提交的消息。

Properties consumerProps = new Properties();
consumerProps.put("bootstrap.servers", "localhost:9092");
consumerProps.put("group.id", "my-consumer-group");
consumerProps.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
consumerProps.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
consumerProps.put("isolation.level", "read_committed");KafkaConsumer<String, String> consumer = new KafkaConsumer<>(consumerProps);
consumer.subscribe(Collections.singletonList("my-topic"));while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));for (ConsumerRecord<String, String> record : records) {System.out.println("Consumed: " + record.value());}
}

总结:Kafka 事务的优势

  1. 消息的原子性:保证一组消息的发送操作要么完全成功,要么完全失败。避免了部分消息写入成功而其他消息丢失的情况。
  2. 精确一次语义(EOS):通过生产者事务和消费者的事务性读取,Kafka 提供了精确一次的消息传递语义,确保数据的一致性。
  3. 高可靠性:在分布式环境下,事务能够确保即使在故障和重试的情况下,数据不会重复或者丢失,保证了消息传递的可靠性。
  4. 简化消费者逻辑:启用事务后,消费者无需额外的逻辑去处理重复数据,Kafka 会自动保证消费者只处理已提交的消息。

通过 Kafka 事务,用户可以构建更加稳定和一致的数据流系统,尤其适用于金融、订单等要求高数据一致性的场景。

相关文章:

202535| Kafka架构与重要概念+幂等性+事务

好的&#xff01;以下是关于 Kafka 架构 以及其 重要概念 的详细介绍&#xff0c;结合 Mermaid 图形 和 表格&#xff0c;帮助你更好地理解各个概念的关系和作用。 Kafka 架构与重要概念 Kafka 是一个分布式消息系统&#xff0c;广泛应用于日志收集、流处理、事件驱动架构等场…...

MySQL 索引和事务

目录 一、MySQL 索引介绍 1、索引概述 2、索引作用 3、索引的分类 &#xff08;1&#xff09;普通索引 &#xff08;2&#xff09;唯一索引 &#xff08;3&#xff09;主键索引 &#xff08;4&#xff09;组合索引&#xff08;最左前缀&#xff09; &#xff08;5&…...

IPFS与去中心化存储:重塑数字世界的基石

引言 在数据爆炸式增长的数字时代&#xff0c;中心化存储的弊端日益凸显——数据垄断、隐私泄露、单点故障等问题频发。IPFS&#xff08;InterPlanetary File System&#xff09; 作为一种去中心化存储协议&#xff0c;正与区块链技术共同推动一场存储革命。本文将深入解析IPF…...

Web3 学习全流程攻略

目录 🧭 Web3 学习全流程攻略 🌱 第一阶段:打好基础(Web3 入门) 🧠 目标: 📚 学习内容: ✅ 推荐资源: 🧑‍💻 第二阶段:技术栈搭建(成为 Web3 开发者) 🧠 目标: 📚 学习内容: ✅ 推荐资源: 🌐 第三阶段:构建完整 DApp(去中心化应用)…...

AUTODL Chatglm2 langchain 部署大模型聊天助手

资源申请 注册登录 进入下面的链接 AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDLAutoDL为您提供专业的GPU租用服务&#xff0c;秒级计费、稳定好用&#xff0c;高规格机房&#xff0c;7x24小时服务。更有算法复现社区&#xff0c;一键复现算法。https://autodl.com/ho…...

牛客练习赛138

牛客练习赛138 A.小s的签到题 思路&#xff1a;过题人数最多的就是签到题 #include <bits/stdc.h> using namespace std; typedef long long ll; typedef pair<int, char> PII;bool cmp(PII a, PII b) {return a.first > b.first; }void solve() {int n;cin …...

【脑机接口临床】脑机接口手术的风险?脑机接口手术的应用场景?脑机接口手术如何实现偏瘫康复?

脑机接口的应用 通常对脑机接口感兴趣的两类人群&#xff0c;一类是适应症患者 &#xff0c;另一类是科技爱好者。 1 意念控制外部设备 常见的外部设备有&#xff1a;外骨骼、机械手、辅助康复设备、电刺激设备、电脑光标、轮椅。 2 辅助偏瘫康复或辅助脊髓损伤患者意念控制…...

普通IT的股票交易成长史--股价起伏的真相-缺口(2)

声明&#xff1a;本文章的内容只是自己学习的总结&#xff0c;不构成投资建议。价格行为理论学习可参考简介中的几位&#xff0c;感谢他们的无私奉献。 送给自己的话&#xff1a; 仓位就是生命&#xff0c;绝对不能满仓&#xff01;&#xff01;&#xff01;&#xff01;&…...

基于NI-PXI的HIL系统开发

基于NI-PXI平台的汽车电控单元HIL系统开发全解析 引言&#xff1a;HIL系统如何成为汽车电控开发的“效率倍增器”&#xff1f; 某车企通过基于NI-PXI的HIL系统&#xff0c;将悬架控制器的测试周期从3个月压缩至2周&#xff0c;故障检出率提升65%。这背后是硬件在环技术对汽车电…...

IOC和Bean

IOC IOC将对象的创建&#xff0c;依赖关系的管理和生命周期的控制从应用程序代码中解耦出来了 IOC容器的依赖注入(DI) 在程序运行过程中动态的向某个对象中注入他所需要的其他对象 依赖注入是基于反射实现的 Spring IOC 容器使用的是Map&#xff08;concorrentMap&#xff…...

助力你的Neovim!轻松管理开发工具的魔法包管理器来了!

在现代编程环境中&#xff0c;Neovim 已经成为许多开发者的编辑器选择。而针对 Neovim 的各种插件与功能扩展&#xff0c;则是提升开发体验的重要手段。今天我们要介绍的就是一个强大而便捷的开源项目——mason.nvim&#xff0c;一个旨在简化和优化 Neovim 使用体验的便携式包管…...

AI与机器人学:从SLAM到导航的未来

AI与机器人学&#xff1a;从SLAM到导航的未来 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 AI与机器人学&#xff1a;从SLAM到导航的未来摘要引言技术路线对比1. 传感器融合架构&#xff1a;纯激光 vs 多模态2. …...

C++学习之模板初阶学习

今天我们来学习C中模板的学习。但是模板是C中比较难的部分&#xff0c;因此本节我们直接出相对比较初阶的部分。 目录 泛型编程 函数模板 函数模板格式 函数模板的原理 函数模板的特性 函数模板的实例化 模板参数的匹配原则 类模板 类模板定义格式 类模板实例化 泛型…...

专业级软件卸载工具:免费使用,彻底卸载无残留!

在数字生活节奏日益加快的今天&#xff0c;我们的电脑就像每天都在"吃进"各种软件。但您是否注意到&#xff0c;那些看似消失的程序其实悄悄留下了大量冗余文件&#xff1f;就像厨房角落里积攒的调味瓶空罐&#xff0c;日积月累就会让系统变得"消化不良"。…...

JSON|cJSON 介绍以及具体项目编写

一、JSON介绍 JSON&#xff08;JavaScript Object Notation 即JavaScript对象表示法&#xff09;是一种轻量级的数据交换格式。采用完全独立于编程语言的文本格式来存储和表示数据。 JSON是一种数据交换格式.JSON独立于编程语言(你不必学习JavaScript).JSON表达数据的方式对通…...

Cell | 大规模 单细胞图谱 揭示非小细胞肺癌抗PD-1治疗后的免疫微环境异质性

–https://doi.org/10.1016/j.cell.2025.03.018 A single-cell atlas reveals immune heterogeneity in anti-PD-1-treated non-small cell lung cancer 留意更多内容&#xff1a;组学之心 研究简介 背景与问题 非小细胞肺癌&#xff08;NSCLC&#xff09;术后复发率高。新…...

光流 | 基于深度学习的光流估计算法汇总,原理,公式,流程图,代码

基于深度学习的光流算法 一、光流估计的基本原理二、基于深度学习的光流估计算法1. **FlowNet系列**2. **FlowNet 2.0**3. **PWC-Net**4. **RAFT(Recurrent All-Pairs Field Transformers)**5. **LiteFlowNet系列**三、算法流程图示例FlowNet2.0架构PWC-Net金字塔处理流程四、…...

常见的算法介绍

算法概述线性回归(Linear Regression)线性回归是一种通过属性的线性结合来进行预测的线性模型, 其目的是找到一条直线, 一个平面或者更高维的超平面, 使预测值和真实值之间的误差最小化逻辑回归(Logistic Regression)逻辑回归是一种分类模型, 入二分类公式 P ( Y 1 ∣ X ) e …...

【基于 LangChain 的异步天气查询1】异步调用 Open-Meteo API 查询该城市当前气温

目录 一、功能概述 二、文件结构 三、城市天气实时查询&#xff08;运行代码&#xff09; weather_runnable.py main.py 运行结果 四、技术亮点 五、使用场景 一、功能概述 它实现了以下主要功能&#xff1a; 用户输入地点&#xff08;城市名&#xff09; 构造提示词…...

深入解析JavaScript变量作用域:var、let、const全攻略

在JavaScript中&#xff0c;变量作用域是一个核心概念&#xff0c;它决定了变量的可访问性和生命周期。理解变量作用域对于编写清晰、高效且无错误的代码至关重要。本文将深入探讨JavaScript中不同类型的变量声明方式&#xff08;var、let、const等&#xff09;&#xff0c;分析…...

C33-函数嵌套及编码实战

我们以一个编程题目的实践来学习此部分内容 题目:输入四个数,以函数的方式找出最大值 思维:使用两个数找出较大值→较大值与第三个数比较得出新的较大值→新的较大值与第四个数比较得出最大值 代码 #include <stdio.h>//内层函数的封装int GetMaxFromTwoNums(int a,int…...

clangd与clang-tidy

Clangd是基于Clang的Language Server&#xff0c;主要用于提供代码补全、跳转定义、错误提示等IDE功能。而Clang-Tidy则是静态代码分析工具&#xff0c;用于检查代码中的潜在问题&#xff0c;比如风格违规、潜在bug等。 clangd 核心工作原理 1. 基于编译器的精准解析 底层引擎…...

【Linux】冯诺依曼体系结构和操作系统的理解

目录 冯诺依曼体系结构一个例子来深入理解 初识操作系统操作系统的作用设计操作系统的目的操作系统之上和之下分别有啥 管理的精髓&#xff0c;先描述&#xff0c;再组织 冯诺依曼体系结构 我们知道&#xff0c;计算机这个东西发明出来就是帮助人们快速解决问题的。那如果我们想…...

Windows系统Jenkins企业级实战

目标 在Windows操作系统上使用Jenkins完成代码的自动拉取、编译、打包、发布工作。 实施 1.安装Java开发工具包&#xff08;JDK&#xff09; Jenkins是基于Java的应用程序&#xff0c;因此需要先安装JDK。可以从Oracle官网或OpenJDK下载适合的JDK版本。推荐java17版本&#x…...

服务预热原理

Java、Spring、Springboot工程启动后&#xff0c;第一次访问比较慢&#xff0c;而从第二次访问开始就快很多&#xff0c;这通常是由以下几个原因导致的&#xff1a; 类加载与初始化开销 类加载过程&#xff1a;Java程序在启动时需要加载大量的类文件到内存中&#xff0c;包括…...

Python核心编程深度解析:作用域、递归与匿名函数的工程实践

引言 Python作为现代编程语言的代表&#xff0c;其作用域管理、递归算法和匿名函数机制是构建高质量代码的核心要素。本文基于Python 3.11环境&#xff0c;结合工业级开发实践&#xff0c;深入探讨变量作用域的内在逻辑、递归算法的优化策略以及匿名函数的高效应用&#xff0c…...

python环境搭建和pycharm的安装配置以及使用face_recognition与cv2

一.python环境的搭建: 1.下载python&#xff08;这里以python3.11为例&#xff09; step 1&#xff1a;打开下载网址&#xff1a;https://www.python.org/downloads/windows/ step 2&#xff1a;我这里选着python3.11.9的版本 2. 安装我就不说了,网上很多 二.pycharm的安装…...

养生:为健康生活筑牢根基

养生并非遥不可及的目标&#xff0c;而是贯穿于日常生活的点滴之中。从饮食、运动到心态调节&#xff0c;每一个环节都对我们的健康有着重要意义。以下为你详细介绍养生的实用策略&#xff0c;助力你开启健康生活模式。 饮食养生&#xff1a;科学搭配&#xff0c;滋养生命 合…...

linux-----------Ext系列⽂件系统(上)

1.理解硬盘 1-1 磁盘、服务器、机柜、机房 机械磁盘是计算机中唯⼀的⼀个机械设备 磁盘--- 外设 慢 容量⼤&#xff0c;价格便宜 1-2 磁盘物理结构 1-3 磁盘的存储结构 扇区&#xff1a;是磁盘存储数据的基本单位&#xff0c;512字节&#xff0c;块设备 如何定位⼀个扇区呢…...

ts装饰器

TypeScript 装饰器是一种特殊类型的声明&#xff0c;能够被附加到类声明、方法、访问符、属性或参数上。它本质上是一个函数&#xff0c;会在运行时被调用&#xff0c;并且被装饰的声明信息会作为参数传递给装饰器函数。 装饰器的分类 类装饰器 类装饰器作用于类构造函数&…...

未来通信中的大型人工智能模型:基础、应用与挑战的全面综述

题目&#xff1a;A Comprehensive Survey of Large AI Models for Future Communications: Foundations, Applications and Challenges 作者&#xff1a;江沸菠&#xff0c;潘存华&#xff0c;董莉&#xff0c;王可之&#xff0c;Merouane Debbah&#xff0c;Dusit Niyato&…...

青藏高原七大河流源区径流深、蒸散发数据集(TPRED)

时间分辨率 月空间分辨率 1km - 10km共享方式 开放获取数据大小 83.27 MB数据时间范围 1998-07-01 — 2017-12-31元数据更新时间 2024-07-22 数据集摘要 通过构建耦合积雪、冻土、冰川等冰冻圈水文物理过程的WEB-DHM模型&#xff08;Water and Energy Budget-based Distribute…...

5.2 参数管理

目标 访问参数&#xff0c;用于调试、诊断和可视化&#xff1b;参数初始化&#xff1b;在不同模型组件间共享参数。 模型&#xff1a;单隐藏层的MLP import torch from torch import nnnet nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 1)) X torch.rand(size…...

Best Video下载器——抖音视频去水印工具

在浏览抖音时&#xff0c;我们常常会遇到一些精彩的短视频&#xff0c;想要保存下来作为创作素材或与朋友分享。然而直接下载的视频往往带有平台水印&#xff0c;影响观看体验。今天就为大家介绍几种简单实用的去水印方法&#xff0c;让你轻松获取高清无水印视频。 目前市面上…...

C语言_程序的段

在 C 语言程序中,内存通常被分为多个逻辑段,每个段存储不同类型的数据。理解这些段的结构和功能,有助于你更高效地编写、调试和优化程序。以下是 C 语言程序中主要的内存段及其特点: 1. 代码段(Text Segment) 存储内容:编译后的机器指令(程序代码)。特性: 只读:防止…...

Google Earth Pro(谷歌地球)2025大陆版安装教程

软件介绍 【名称】&#xff1a;Google Earth Pro&#xff08;谷歌地球&#xff09;2025 【大小】&#xff1a;63.6M 【语言】&#xff1a;简体中文 【安装环境】&#xff1a;Win/Win8/Winxp/Win10/Win11 谷歌地球(Google Earth) 是由Google公司开发的地图软件。谷歌地球采用了…...

2025年数维杯赛题C题专家 组委会C题专家疑集锦

1、段前段后距&#xff0c;行间距有要求嘛 C题专家&#xff1a;一般是单倍行距 2、请问参考文献和附录上方也要有图示页眉吗?ai使用报告放在附录里还是附录之后? C题专家:附录 3、第三问的那个三天都在一个城市可以吗?这样我们列两份城市的清明自由行&#xff0c;还是说…...

C.循环函数基础

循环函数基础 1. 循环函数基础1.1 循环的定义与作用1.1.1 `for` 循环语法示例1.1.2 `while` 循环语法示例1.1.3 `do-while` 循环语法示例1.1.4 循环的比较1.1.5 循环的应用场景2.1 for 循环语法结构执行流程示例应用场景优点缺点2.2 while 循环语法结构执行流程示例应用场景优点…...

spark-Join Key 的基数/rand函数

在数据处理中&#xff0c;Join Key 的基数 是指 Join Key 的唯一值的数量&#xff08;也称为 Distinct Key Count&#xff09;。它表示某个字段&#xff08;即 Join Key&#xff09;在数据集中有多少个不同的值。 1. Join Key 基数的意义 高基数&#xff1a;Join Key 的唯一值…...

【Oracle认证】MySQL 8.0 OCP 认证考试英文版(MySQL30 周年版)

文章目录 1、MySQL OCP考试介绍2、考试注册流程3、考试复习题库 Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到2025.07.31 之前。所有人均可以免费考取原价245美元 &#xff08;约1500&#xff09;的MySQL OCP 认证。 1、MySQL OCP考试介绍 OCP考试 OCP认证是Oracle公司推…...

不同环境下运行脚本如何解决pythonpath问题

目录 问题背景&#xff1a; 方法一&#xff1a;在 Dockerfile 中设置 PYTHONPATH&#xff1a; 方法二: 本地脚本内动态地设置 sys.path&#xff0c;以确保 Python 程序在运行时能够找到项目中的模块 注意&#xff1a; 问题背景&#xff1a; 脚本在windows环境定义 然后因为…...

照片to谷歌地球/奥维地图使用指南

软件介绍 照片to谷歌地球/奥维地图是一款由WTSolutions开发的跨平台图片处理工具&#xff0c;能够将带有GPS信息的照片导入Google Earth&#xff08;谷歌地球&#xff09;或奥维地图。该软件支持Windows、Mac、iOS、Linux和Android系统&#xff0c;无需下载安装&#xff0c;直…...

visual studio 2015 安装闪退问题

参考链接&#xff1a; VS2012安装时启动界面一闪而过问题解决办法 visual studio 2015 安装闪退问题...

Kubernetes 使用 containerd 实现 GPU 支持及 GPU Operator 部署指南

目录 Kubernetes 使用 containerd 实现 GPU 支持及 GPU Operator 部署指南 一、为什么 containerd 是趋势&#xff1f; 二、目标 三、前提条件 四、方式一&#xff1a;containerd nvidia-container-toolkit&#xff08;基础方式&#xff09; 1️⃣ 安装 NVIDIA Containe…...

【typenum】 1 说明文件(README.md)

Typenum Typenum 是一个用于在编译时计算类型级数字的 Rust 库。目前支持位、无符号整数和有符号整数。 Typenum 仅依赖 libcore&#xff0c;因此适用于任何平台&#xff01; 导入方式 虽然 typenum 分为多个模块&#xff0c;但它们都通过 crate 根目录重新导出&#xff0c…...

Axure疑难杂症:统计分析页面引入Echarts示例动态效果

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:统计分析页面引入Echarts示例动态效果 主要内容:echart示例引入、大小调整、数据导入 应用场景:统计分析页面…...

PyQt5基本窗口控件(QWidget)

QWidget 基础窗口控件QWidget类是所有用户界面对象的基类&#xff0c;所有的窗口和控件都直 接或间接继承自QWidget类。 窗口控件&#xff08;Widget&#xff0c;简称“控件”&#xff09;是在PyQt中建立界面的主要元素。在PyQt 中把没有嵌入到其他控件中的控件称为窗口&…...

双目视觉系统中,极线校正(Epipolar Rectification)与单应性矩阵/多平面单应性模型

在双目视觉系统中&#xff0c;极线校正&#xff08;Epipolar Rectification&#xff09;的目标是使左右图像的对应点位于同一水平线上&#xff0c;从而简化立体匹配的搜索过程。标准的双目相机标定和校正流程&#xff0c;其核心原理与单应性矩阵的应用方式如下&#xff1a; 1. …...

【部署】win10的wsl环境下调试dify的api后端服务

回到目录 标题&#xff1a;win10的wsl环境下&#xff0c;远程调试dify的api后端服务 0. 上一篇讲解web前端服务的启动方法&#xff0c;本篇内容是vscode的调试模式启动api后端服务。文章4000字左右&#xff0c;阅读时间15-20分钟。 dify官方运行环境要求较低2U4G&#xff0c…...

学习黑客了解Python3的“HTTPServer“

5 分钟深入浅出理解Python3的"HTTPServer"模块 &#x1f310; 大家好&#xff01;今天我们将探索Python3中的HTTPServer模块——一个简单却强大的工具&#xff0c;它允许你快速创建web服务器。在网络安全学习、渗透测试和CTF挑战中&#xff0c;这个模块常被用来搭建…...