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

Kafka 八股文

一、基础概念

1. Kafka 是什么?它的核心组件有哪些?

Kafka 的定义
Kafka 是一个 分布式流处理平台,最初由 LinkedIn 开发,后成为 Apache 顶级项目。它主要用于 高吞吐量的实时数据流处理,支持发布-订阅模式的消息传递。

核心组件

  • 生产者(Producer):负责将数据发布到 Kafka 的 Topic 中。
  • 消费者(Consumer):从 Kafka 的 Topic 中读取数据。
  • Topic:消息的逻辑分类,类似于 RabbitMQ 中的队列。
  • 分区(Partition):Topic 的分区是 Kafka 实现高吞吐量和扩展性的核心机制。
  • Broker:Kafka 集群中的每个节点称为 Broker,负责存储数据、处理生产者和消费者的请求。
  • ZooKeeper:Kafka 使用 ZooKeeper 来管理集群元数据、Broker 状态和消费者偏移量(Offset)。
    • (注:Kafka 2.8+ 版本开始支持无需 ZooKeeper 的模式,称为 KRaft 模式)。

2. 解释 Kafka 中的 Topic、Partition 和 Broker。

Topic

  • 定义:Topic 是消息的逻辑分类,类似于 RabbitMQ 中的队列。
  • 特点
    • 一个 Topic 可以分为多个分区(Partition),以实现并行处理。
    • 每个 Topic 可以有多个生产者和消费者。

Partition

  • 定义:Partition 是 Topic 的分区,每个分区是一个有序的、不可变的消息日志。
  • 特点
    • 分区可以分布在不同的 Broker 上,实现负载均衡。
    • 每个分区可以有多个副本(Replica),分为 Leader 和 Follower。
    • 分区内的消息是有序的,但不同分区之间的消息顺序无法保证。

Broker

  • 定义:Broker 是 Kafka 集群中的每个节点,负责存储数据、处理生产者和消费者的请求。
  • 特点
    • 每个 Broker 可以管理多个 Topic 的分区。
    • Broker 之间通过副本机制实现数据的高可用性和容错性。

3. 什么是 Consumer Group?它的作用是什么?

Consumer Group 的定义

  • 定义:Consumer Group 是一组消费者的集合,共同消费一个 Topic 的消息。
  • 特点
    • 每个 Consumer Group 可以包含多个消费者实例。
    • 每个分区只能被同一个 Consumer Group 中的一个消费者消费。

Consumer Group 的作用

  1. 负载均衡:同一个 Consumer Group 中的消费者实例可以并行消费 Topic 的不同分区,提升消费速度。
  2. 容错性:如果某个消费者实例宕机,其他消费者实例可以接管其负责的分区,确保消费不中断。
  3. 水平扩展:通过增加消费者实例,可以动态扩展消费能力。

示例

  • Topic:orders,分区数:3,Consumer Group:order_consumers,消费者实例:consumer1consumer2
  • consumer1 消费分区 0 和 1,consumer2 消费分区 2。

4. Kafka 如何保证消息的顺序性?

分区内有序

  • 机制:Kafka 保证分区内的消息是有序的,即消息按照写入顺序存储和消费。
  • 实现方式:生产者发送消息时,可以指定分区键(Partition Key),确保相同键的消息写入同一个分区。

分区间的无序

  • 机制:不同分区之间的消息顺序无法保证。
  • 解决方案:如果需要全局有序,可以将 Topic 设置为单分区,但这会限制吞吐量。

保证顺序性的方法

  1. 单分区 Topic:将 Topic 设置为单分区,确保所有消息有序。
  2. 分区键设计:使用业务属性(如订单ID)作为分区键,确保相关消息写入同一个分区。
  3. 消费者顺序消费:消费者按顺序处理分区内的消息,避免并发消费导致乱序。

5. Kafka 的消息存储机制是什么?消息是如何持久化的?

消息存储机制
Kafka 的底层存储机制基于 日志分段(Log Segment)索引文件(Index File),确保消息的高效存储和检索。

  1. 日志分段(Log Segment)

    • 每个分区的消息存储在一个日志文件中,日志文件按大小或时间分段。
    • 每个段文件(Segment File)包含一组消息,文件名基于起始偏移量(Offset)命名。
  2. 索引文件(Index File)

    • 每个段文件对应一个索引文件,记录消息的偏移量和物理位置。
    • 索引文件用于快速定位消息,减少磁盘 I/O。

消息持久化过程

  1. 生产者发送消息:生产者将消息发送到 Kafka Broker。
  2. 消息写入日志文件:Broker 将消息追加到对应分区的日志文件中。
  3. 消息索引更新:Broker 更新索引文件,记录消息的偏移量和物理位置。
  4. 消息确认:Broker 向生产者发送确认(ACK),表示消息已成功写入。

持久化特点

  • 顺序写入:消息按顺序写入磁盘,提升写入性能。
  • 零拷贝(Zero-Copy):通过零拷贝技术减少数据复制,提升读取性能。
  • 日志清理:支持基于时间和大小的日志清理策略,避免磁盘空间耗尽。

二、核心机制

1. Kafka 的分区(Partition)机制是如何工作的?

分区机制的定义

  • 分区:Topic 的分区是 Kafka 实现高吞吐量和扩展性的核心机制。
  • 特点:每个分区是一个有序的、不可变的消息日志。分区可以分布在不同的 Broker 上,实现负载均衡。

分区机制的工作原理

  1. 消息写入

    • 生产者发送消息时,可以指定分区键(Partition Key),Kafka 根据键的哈希值将消息路由到特定分区。
    • 如果未指定分区键,Kafka 会使用轮询策略分配分区。
  2. 消息存储

    • 每个分区的消息按顺序追加到日志文件中,确保分区内有序。
    • 日志文件按大小或时间分段,便于管理和清理。
  3. 消息消费

    • 消费者从分区中按顺序读取消息,确保分区内有序。
    • 不同分区之间的消息顺序无法保证。

分区的优势

  • 并行处理:多个分区可以并行处理消息,提升吞吐量。
  • 负载均衡:分区可以分布在不同的 Broker 上,实现负载均衡。
  • 扩展性:通过增加分区数,可以水平扩展 Kafka 集群。

2. Kafka 的副本(Replica)机制是什么?Leader 和 Follower 的区别?

副本机制的定义

  • 副本:每个分区可以有多个副本,分为 Leader 和 Follower。
  • 作用:副本机制用于实现数据的高可用性和容错性。

Leader 和 Follower 的区别

  1. Leader

    • 负责处理生产者和消费者的读写请求。
    • 每个分区只有一个 Leader。
  2. Follower

    • 从 Leader 同步数据,作为备份。
    • 如果 Leader 宕机,Follower 可以接管成为新的 Leader。

副本同步机制

  • 同步副本(ISR):ISR 是当前与 Leader 保持同步的副本集合。只有 ISR 中的副本才有资格成为新的 Leader。
  • 异步副本:未与 Leader 保持同步的副本,不能参与 Leader 选举。

3. Kafka 如何实现高可用性和容错性?

高可用性和容错性的实现方式

  1. 副本机制

    • 每个分区有多个副本,分布在不同的 Broker 上。
    • 如果 Leader 宕机,Follower 可以接管成为新的 Leader。
  2. ISR 机制

    • 只有 ISR 中的副本才有资格成为新的 Leader,确保数据一致性。
  3. ZooKeeper 协调

    • Kafka 使用 ZooKeeper 管理 Broker 状态和分区 Leader 选举。
    • (注:Kafka 2.8+ 版本开始支持无需 ZooKeeper 的模式,称为 KRaft 模式)。
  4. 数据持久化

    • 消息持久化到磁盘,确保 Broker 重启后数据不丢失。

4. 什么是 ISR(In-Sync Replicas)?它的作用是什么?

ISR 的定义

  • ISR:当前与 Leader 保持同步的副本集合。
  • 特点
    • ISR 中的副本与 Leader 的数据保持一致。
    • 只有 ISR 中的副本才有资格成为新的 Leader。

ISR 的作用

  1. 数据一致性:确保 ISR 中的副本与 Leader 的数据一致,避免数据丢失。
  2. Leader 选举:如果 Leader 宕机,Kafka 会从 ISR 中选举新的 Leader。
  3. 容错性:通过 ISR 机制,Kafka 可以在副本故障时快速恢复,确保高可用性。

5. Kafka 的消息消费偏移量(Offset)是如何管理的?

Offset 的定义

  • Offset:消费者在分区中消费消息的位置。
  • 特点
    • 每个分区维护一个独立的 Offset。
    • Offset 是消息在分区中的唯一标识。

Offset 的管理方式

  1. 消费者提交 Offset

    • 消费者处理完消息后,将 Offset 提交到 Kafka。
    • Offset 可以存储在 Kafka 的内部 Topic(__consumer_offsets)或外部存储(如数据库)。
  2. 自动提交

    • 消费者定期自动提交 Offset,可能存在重复消费的风险。
  3. 手动提交

    • 消费者在处理完消息后手动提交 Offset,确保消息不丢失。
  4. Offset 重置

    • 如果消费者从新的 Group ID 开始消费,可以选择从最早的 Offset(earliest)或最新的 Offset(latest)开始消费。

6. Kafka 如何保证消息不丢失?

消息不丢失的保障机制

  1. 生产者确认机制

    • 生产者发送消息后,等待 Kafka 的确认(ACK)。
    • ACK 级别可以配置为:
      • acks=0:不等待确认。
      • acks=1:等待 Leader 确认。
      • acks=all:等待所有 ISR 副本确认。
  2. 副本机制

    • 每个分区有多个副本,确保数据的高可用性。
    • 如果 Leader 宕机,Follower 可以接管成为新的 Leader。
  3. 数据持久化

    • 消息持久化到磁盘,确保 Broker 重启后数据不丢失。
  4. 消费者手动提交 Offset

    • 消费者在处理完消息后手动提交 Offset,确保消息不丢失。

7. Kafka 的消息清理策略有哪些?(如 Log Compaction 和 Retention Policy)

消息清理策略

  1. 基于时间的清理(Retention Policy)

    • 删除超过指定时间的消息。
    • 配置参数:log.retention.hourslog.retention.minuteslog.retention.ms
  2. 基于大小的清理

    • 删除超过指定大小的日志文件。
    • 配置参数:log.retention.bytes
  3. 日志压缩(Log Compaction)

    • 保留每个 Key 的最新消息,删除旧消息。
    • 适用于需要保留最新状态的场景(如数据库变更日志)。
  4. 删除策略

    • 删除整个日志分段(Log Segment),而不是单独删除消息。
    • 配置参数:log.cleanup.policy(可选 deletecompact)。

三、应用场景

1. Kafka 适合哪些应用场景?与 RabbitMQ 相比有什么优势?

Kafka 的适用场景

  1. 日志收集与分析

    • Kafka 广泛用于收集和存储系统日志、用户行为日志等。
    • 示例:ELK(Elasticsearch、Logstash、Kibana)中的日志传输。
  2. 实时数据管道

    • Kafka 可以作为实时数据管道,连接不同的数据源和目标。
    • 示例:将数据库变更实时同步到数据仓库。
  3. 事件驱动架构

    • Kafka 支持事件驱动架构,用于解耦微服务之间的通信。
    • 示例:订单系统中订单创建、支付、发货等事件的传递。
  4. 流处理

    • Kafka 提供流处理能力,支持实时计算和分析。
    • 示例:实时统计用户点击量、计算推荐分数。

Kafka 与 RabbitMQ 的对比

维度KafkaRabbitMQ
设计目标高吞吐、日志流处理消息可靠传输、复杂路由
协议自定义协议AMQP
吞吐量高(百万级/秒)中等(万级/秒)
消息存储长期存储(按时间或大小保留)消费后删除(可持久化)
顺序性分区内有序单队列单消费者保证
延迟较高延迟(依赖批处理)低延迟(毫秒级)
可靠性高(支持副本机制、持久化)高(支持消息确认、持久化、事务)
适用场景日志采集、流式计算实时通信、业务解耦

2. 如何用 Kafka 设计一个实时日志收集系统?

设计目标

  • 实时收集和存储系统日志、用户行为日志等。
  • 支持高吞吐量和低延迟。

设计方案

  1. 日志生产者

    • 在每个服务器上部署日志收集代理(如 Filebeat、Fluentd),将日志发送到 Kafka。
  2. Kafka Topic

    • 创建多个 Topic,按日志类型(如系统日志、应用日志)分类存储。
  3. 日志消费者

    • 使用消费者组从 Kafka 中消费日志,写入存储系统(如 Elasticsearch、HDFS)。
  4. 流处理

    • 使用 Kafka Streams 或 Flink 对日志进行实时处理(如过滤、聚合)。
  5. 监控与报警

    • 使用 Kafka Monitoring 工具监控日志收集系统的状态,设置报警阈值。

优点

  • 高吞吐量:Kafka 支持百万级消息/秒,适合日志收集场景。
  • 持久化存储:日志可以长期存储在 Kafka 中,便于后续分析。
  • 实时处理:支持流处理,实时分析日志数据。

3. Kafka 在事件驱动架构中的作用是什么?

事件驱动架构的定义

  • 事件驱动架构:基于事件的异步通信模式,解耦服务之间的依赖关系。
  • 核心组件:事件生产者、事件消费者、事件总线(如 Kafka)。

Kafka 的作用

  1. 事件总线:Kafka 作为事件总线,负责事件的存储和传递。
  2. 事件存储:Kafka 持久化存储事件,确保事件不丢失。
  3. 事件分发:Kafka 支持多消费者组,确保事件可以广播到多个服务。
  4. 事件处理:Kafka 支持流处理,实时处理和分析事件数据。

示例

  • 订单系统:订单创建、支付、发货等事件通过 Kafka 传递,解耦订单服务和支付服务。
  • 用户行为分析:用户点击、浏览等事件通过 Kafka 传递,实时分析用户行为。

4. 如何用 Kafka 实现消息的 Exactly-Once 语义?

Exactly-Once 语义的定义

  • Exactly-Once:确保消息被精确处理一次,既不丢失也不重复。

实现方式

  1. 生产者幂等性

    • Kafka 生产者支持幂等性,确保消息不重复发送。
    • 配置参数:enable.idempotence=true
  2. 事务机制

    • Kafka 支持事务,确保生产者和消费者的操作原子性。
    • 配置参数:isolation.level=read_committed
  3. 流处理 Exactly-Once

    • Kafka Streams 支持 Exactly-Once 语义,确保流处理结果精确一次。
    • 配置参数:processing.guarantee=exactly_once

示例

  • 订单支付系统:生产者发送支付消息,消费者处理支付并更新订单状态,确保支付和状态更新精确一次。

5. Kafka 如何支持流处理(Stream Processing)?

流处理的定义

  • 流处理:实时处理和分析数据流,支持过滤、聚合、连接等操作。

Kafka 的流处理支持

  1. Kafka Streams

    • Kafka 提供的轻量级流处理库,支持 Exactly-Once 语义。
    • 示例:实时统计用户点击量、计算推荐分数。
  2. KSQL

    • Kafka 提供的 SQL 接口,支持流处理查询。
    • 示例:实时查询用户行为数据。
  3. 集成外部流处理框架

    • Kafka 可以与 Flink、Spark Streaming 等流处理框架集成,支持复杂流处理任务。

示例

  • 实时推荐系统:使用 Kafka Streams 实时处理用户行为数据,计算推荐分数并更新推荐结果。
  • 实时监控系统:使用 KSQL 实时查询系统日志,监控系统状态并触发报警。

四、性能优化

1. 如何提升 Kafka 的吞吐量?

提升吞吐量的方法

  1. 增加分区数

    • 分区是 Kafka 并行处理的基本单位,增加分区数可以提升吞吐量。
    • 注意:分区数过多可能导致资源开销增加,需根据集群规模合理设置。
  2. 优化生产者配置

    • 批量发送:通过 linger.msbatch.size 参数控制批量发送,减少网络开销。
    • 压缩消息:启用消息压缩(如 GZIP、Snappy),减少网络传输量。
    • 异步发送:使用异步发送模式,避免阻塞生产者。
  3. 优化消费者配置

    • 增加消费者实例:通过增加消费者实例或使用多线程消费,提升消费速度。
    • 调整预取数量:通过 max.poll.records 参数控制每次拉取的消息数量,避免消费者过载。
  4. 优化 Broker 配置

    • 增加 Broker 节点:通过水平扩展提升集群处理能力。
    • 调整日志段大小:通过 log.segment.bytes 参数优化日志段大小,减少磁盘 I/O。
  5. 优化网络和硬件

    • 使用高性能磁盘(如 SSD)提升持久化性能。
    • 确保生产者和消费者与 Kafka 集群之间的网络延迟低、带宽高。

2. Kafka 的分区数量如何影响性能?如何选择合适的分区数?

分区数量对性能的影响

  1. 吞吐量:分区数越多,并行处理能力越强,吞吐量越高。
  2. 延迟:分区数过多可能导致资源开销增加,延迟上升。
  3. 负载均衡:分区数过少可能导致负载不均衡,部分 Broker 压力过大。

选择合适的分区数

  1. 根据吞吐量需求

    • 每个分区的吞吐量有限,通常每个分区每秒可处理数万条消息。
    • 根据总吞吐量需求计算所需分区数。
  2. 根据消费者数量

    • 每个分区只能被一个消费者实例消费,分区数应大于等于消费者实例数。
  3. 根据集群规模

    • 分区数过多可能导致资源开销增加,需根据集群规模合理设置。
  4. 经验值

    • 通常建议每个 Topic 的分区数为 Broker 数的 1-3 倍。

3. Kafka 的生产者和消费者如何优化性能?

生产者性能优化

  1. 批量发送
    • 通过 linger.msbatch.size 参数控制批量发送,减少网络开销。
  2. 压缩消息
    • 启用消息压缩(如 GZIP、Snappy),减少网络传输量。
  3. 异步发送
    • 使用异步发送模式,避免阻塞生产者。
  4. 重试机制
    • 配置 retriesretry.backoff.ms 参数,确保消息发送失败后重试。

消费者性能优化

  1. 增加消费者实例
    • 通过增加消费者实例或使用多线程消费,提升消费速度。
  2. 调整预取数量
    • 通过 max.poll.records 参数控制每次拉取的消息数量,避免消费者过载。
  3. 手动提交 Offset
    • 使用手动提交 Offset,确保消息处理完成后再提交,避免重复消费。
  4. 优化消费逻辑
    • 使用异步处理或多线程处理消息,提升消费速度。

4. Kafka 的副本同步机制对性能有什么影响?如何优化?

副本同步机制的影响

  1. 数据一致性:副本同步机制确保数据的高可用性和一致性,但会增加网络和磁盘 I/O 开销。
  2. 延迟:副本同步可能导致写入延迟增加,特别是 acks=all 时。
  3. 吞吐量:副本同步会占用网络带宽和磁盘 I/O,影响集群吞吐量。

优化方法

  1. 调整 ACK 级别

    • 根据业务需求选择合适的 ACK 级别:
      • acks=1:等待 Leader 确认,性能较高。
      • acks=all:等待所有 ISR 副本确认,可靠性较高。
  2. 优化网络和硬件

    • 使用高性能磁盘(如 SSD)和高速网络,提升副本同步性能。
  3. 增加副本数

    • 增加副本数可以提高数据可靠性,但会增加资源开销,需根据业务需求权衡。

5. Kafka 的消息压缩机制有哪些?如何选择压缩算法?

消息压缩机制

  1. GZIP
    • 压缩率高,但 CPU 开销较大,适合网络带宽有限的场景。
  2. Snappy
    • 压缩率较低,但 CPU 开销小,适合高吞吐量场景。
  3. LZ4
    • 压缩率和 CPU 开销介于 GZIP 和 Snappy 之间,适合通用场景。
  4. Zstandard
    • 压缩率高,CPU 开销较低,适合对压缩率和性能要求较高的场景。

选择压缩算法

  1. 根据网络带宽
    • 如果网络带宽有限,选择压缩率高的算法(如 GZIP)。
  2. 根据 CPU 资源
    • 如果 CPU 资源充足,选择压缩率高的算法(如 GZIP)。
  3. 根据吞吐量需求
    • 如果吞吐量要求高,选择 CPU 开销小的算法(如 Snappy)。

五、问题排查与运维

1. Kafka 集群出现性能瓶颈,如何排查?

性能瓶颈的排查步骤

  1. 检查 Broker 资源使用率

    • CPU:检查 CPU 使用率是否过高,可能是消息压缩或副本同步导致。
    • 内存:检查内存使用率是否过高,可能是 JVM 堆内存不足。
    • 磁盘 I/O:检查磁盘读写性能,可能是日志写入或副本同步导致。
  2. 检查网络带宽

    • 使用工具(如 iftopnload)检查网络带宽使用率,确保网络不成为瓶颈。
  3. 检查分区负载均衡

    • 使用 Kafka 管理工具(如 Kafka Manager)检查分区分布是否均衡。
    • 如果分区分布不均衡,可能导致部分 Broker 压力过大。
  4. 检查消费者 Lag

    • 使用 kafka-consumer-groups.sh 检查消费者 Lag,确保消费者能够及时消费消息。
  5. 检查日志文件

    • 查看 Kafka Broker 日志,检查是否有异常错误或警告信息。

优化建议

  • 增加 Broker 节点:通过水平扩展提升集群处理能力。
  • 优化分区分布:重新分配分区,确保负载均衡。
  • 调整配置参数:优化生产者、消费者和 Broker 的配置参数(如 batch.sizelinger.ms)。

2. Kafka 的消息积压(Lag)是什么原因?如何解决?

消息积压的原因

  1. 消费者处理能力不足
    • 消费者处理速度慢,无法及时消费消息。
  2. 生产者发送速率过高
    • 生产者发送消息的速度远高于消费者处理速度。
  3. 消费者宕机或网络故障
    • 消费者无法连接 Kafka,导致消息积压。
  4. 分区分布不均衡
    • 部分分区的消息量过大,导致消费者处理不过来。

解决方案

  1. 增加消费者实例
    • 部署更多消费者实例,提升消费能力。
  2. 优化消费者处理逻辑
    • 使用多线程或异步处理消息,提升消费速度。
  3. 调整预取数量
    • 通过 max.poll.records 参数控制每次拉取的消息数量,避免消费者过载。
  4. 优化分区分布
    • 重新分配分区,确保负载均衡。
  5. 限流与降级
    • 生产者限流,控制消息发送速率。
    • 对非核心消息进行降级处理(如丢弃或延迟处理)。

3. Kafka 的 Leader 选举机制是什么?如何避免脑裂问题?

Leader 选举机制

  1. 选举触发条件

    • Leader 宕机或与 ZooKeeper 失去连接。
    • ISR(In-Sync Replicas)中的副本数量不足。
  2. 选举过程

    • Kafka 从 ISR 中选举新的 Leader,确保数据一致性。
    • 如果 ISR 为空,Kafka 会从所有副本中选举新的 Leader,但可能导致数据丢失。

避免脑裂问题

  1. 使用 ISR 机制
    • 只有 ISR 中的副本才有资格成为新的 Leader,确保数据一致性。
  2. 配置最小 ISR 数量
    • 通过 min.insync.replicas 参数配置最小 ISR 数量,确保选举时数据不丢失。
  3. 使用 ZooKeeper 协调
    • ZooKeeper 用于管理 Broker 状态和分区 Leader 选举,避免脑裂问题。
    • (注:Kafka 2.8+ 版本开始支持无需 ZooKeeper 的模式,称为 KRaft 模式)。

4. Kafka 如何监控?常用的监控指标有哪些?

监控工具

  1. Kafka Manager
    • 提供 Web UI,实时监控 Kafka 集群状态、分区分布、消费者 Lag 等。
  2. Prometheus + Grafana
    • 使用 Prometheus 采集 Kafka 的监控数据,通过 Grafana 展示可视化图表。
  3. Kafka 自带工具
    • 使用 kafka-consumer-groups.sh 检查消费者 Lag。
    • 使用 kafka-topics.sh 检查 Topic 和分区状态。

常用监控指标

  1. Broker 指标
    • CPU、内存、磁盘 I/O 使用率。
    • 网络带宽使用率。
  2. Topic 指标
    • 消息生产速率(Messages In)。
    • 消息消费速率(Messages Out)。
    • 分区分布和负载均衡。
  3. 消费者指标
    • 消费者 Lag(Consumer Lag)。
    • 消费者处理速率(Consumer Throughput)。
  4. 副本指标
    • ISR 副本数量(In-Sync Replicas)。
    • 副本同步延迟(Replication Latency)。

5. Kafka 的 ZooKeeper 依赖是什么?Kafka 如何摆脱 ZooKeeper?

ZooKeeper 的作用

  1. 集群元数据管理
    • ZooKeeper 存储 Kafka 集群的元数据(如 Broker 状态、Topic 配置)。
  2. Leader 选举
    • ZooKeeper 用于管理分区 Leader 选举,确保高可用性。
  3. 消费者偏移量管理
    • ZooKeeper 存储消费者的偏移量(Offset),确保消费进度不丢失。

Kafka 摆脱 ZooKeeper 的方式

  1. KRaft 模式
    • Kafka 2.8+ 版本开始支持 KRaft 模式,无需依赖 ZooKeeper。
    • KRaft 模式使用 Kafka 自身的 Raft 协议管理集群元数据和 Leader 选举。
  2. KRaft 的优势
    • 简化部署和维护,减少外部依赖。
    • 提升集群的稳定性和性能。

六、高级特性

1. Kafka 的 Log Compaction 是什么?它的应用场景是什么?

Log Compaction 的定义

  • Log Compaction:Kafka 的一种日志清理策略,保留每个 Key 的最新消息,删除旧消息。
  • 特点:只保留每个 Key 的最新值,确保日志文件不会无限增长。适用于需要保留最新状态的场景。

Log Compaction 的工作原理

  1. 消息标记:Kafka 为每条消息标记 Key 和 Value,Key 用于标识消息的唯一性。
  2. 日志清理:Kafka 定期清理日志文件,删除相同 Key 的旧消息,只保留最新消息。
  3. 日志分段:日志文件按大小或时间分段,清理操作在段文件级别进行。

应用场景

  1. 数据库变更日志:记录数据库的变更历史,保留每个记录的最新状态。
  2. 配置管理:记录系统配置的变更历史,保留每个配置项的最新值。
  3. 状态存储:记录系统状态的变化,保留每个状态的最新值。

2. Kafka 的 Exactly-Once 语义是如何实现的?

Exactly-Once 语义的定义

  • Exactly-Once:确保消息被精确处理一次,既不丢失也不重复。

实现方式

  1. 生产者幂等性

    • Kafka 生产者支持幂等性,确保消息不重复发送。
    • 配置参数:enable.idempotence=true
  2. 事务机制

    • Kafka 支持事务,确保生产者和消费者的操作原子性。
    • 配置参数:isolation.level=read_committed
  3. 流处理 Exactly-Once

    • Kafka Streams 支持 Exactly-Once 语义,确保流处理结果精确一次。
    • 配置参数:processing.guarantee=exactly_once

示例

  • 订单支付系统:生产者发送支付消息,消费者处理支付并更新订单状态,确保支付和状态更新精确一次。

3. Kafka Connect 和 Kafka Streams 的区别是什么?

Kafka Connect

  • 定义:Kafka 提供的工具,用于将 Kafka 与外部系统(如数据库、文件系统)集成。
  • 特点:支持 Source Connector(从外部系统读取数据)和 Sink Connector(将数据写入外部系统)。适合数据导入和导出场景。

Kafka Streams

  • 定义:Kafka 提供的流处理库,用于实时处理和分析数据流。
  • 特点:支持流处理操作(如过滤、聚合、连接)。适合实时计算和分析场景。

区别

维度Kafka ConnectKafka Streams
用途数据导入和导出实时流处理
操作对象外部系统(如数据库、文件系统)Kafka Topic
处理方式批量处理实时处理
适用场景数据同步、ETL实时计算、事件驱动架构

4. Kafka 的事务机制是如何工作的?

事务机制的定义

  • 事务机制:Kafka 提供的事务功能,确保生产者和消费者的操作原子性。

工作原理

  1. 事务初始化:生产者初始化事务,获取事务 ID。
  2. 消息发送:生产者在事务中发送消息,消息暂存到事务缓冲区。
  3. Offset 提交:消费者在事务中提交 Offset,确保消息处理和 Offset 提交原子性。
  4. 事务提交:生产者提交事务,消息和 Offset 提交操作生效。
  5. 事务回滚:如果事务失败,生产者回滚事务,消息和 Offset 提交操作取消。

配置参数

  • isolation.level=read_committed:确保消费者只读取已提交的消息。
  • transactional.id:生产者的事务 ID,用于标识事务。

5. Kafka 的 SASL 认证和 ACL 权限控制是如何实现的?

SASL 认证

  • 定义:SASL(Simple Authentication and Security Layer)是一种认证机制,支持多种认证方式(如 PLAIN、SCRAM、GSSAPI)。
  • 配置步骤
    1. 在 Kafka Broker 配置文件中启用 SASL 认证:
      security.inter.broker.protocol=SASL_PLAINTEXT
      sasl.mechanism.inter.broker.protocol=PLAIN
      sasl.enabled.mechanisms=PLAIN
      
    2. 配置客户端(生产者和消费者)的 SASL 认证信息:
      security.protocol=SASL_PLAINTEXT
      sasl.mechanism=PLAIN
      sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin";
      

ACL 权限控制

  • 定义:ACL(Access Control List)用于控制用户对 Kafka 资源的访问权限。
  • 配置步骤
    1. 在 Kafka Broker 配置文件中启用 ACL:
      authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer
      
    2. 使用 kafka-acls.sh 工具配置 ACL 规则:
      kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:admin --operation Read --topic test-topic
      

七、与其他技术的对比

1. Kafka 和 RabbitMQ 的核心区别是什么?各自的适用场景?

核心区别

维度KafkaRabbitMQ
设计目标高吞吐、日志流处理消息可靠传输、复杂路由
协议自定义协议AMQP
吞吐量高(百万级/秒)中等(万级/秒)
消息存储长期存储(按

七、与其他技术的对比

1. Kafka 和 RabbitMQ 的核心区别是什么?各自的适用场景?

核心区别

维度KafkaRabbitMQ
设计目标高吞吐、日志流处理消息可靠传输、复杂路由
协议自定义协议AMQP
吞吐量高(百万级/秒)中等(万级/秒)
消息存储长期存储(按时间或大小保留)消费后删除(可持久化)
顺序性分区内有序单队列单消费者保证
延迟较高延迟(依赖批处理)低延迟(毫秒级)
可靠性高(支持副本机制、持久化)高(支持消息确认、持久化、事务)
适用场景日志采集、流式计算实时通信、业务解耦

适用场景

  • Kafka

    • 日志收集与分析(如 ELK 日志传输)。
    • 实时数据管道(如数据库变更同步)。
    • 事件驱动架构(如订单系统事件传递)。
    • 流处理(如实时推荐系统)。
  • RabbitMQ

    • 实时通信(如订单处理、通知系统)。
    • 复杂路由(如按规则分发消息)。
    • 需要高可靠性和低延迟的场景。

2. Kafka 和 RocketMQ 的对比?

核心区别

维度KafkaRocketMQ
设计目标高吞吐、日志流处理高吞吐、分布式消息中间件
协议自定义协议自定义协议
吞吐量高(百万级/秒)高(百万级/秒)
消息存储长期存储(按时间或大小保留)长期存储(按时间或大小保留)
顺序性分区内有序分区内有序
延迟较高延迟(依赖批处理)较低延迟(毫秒级)
可靠性高(支持副本机制、持久化)高(支持副本机制、持久化)
适用场景日志采集、流式计算金融交易、订单处理

适用场景

  • Kafka

    • 日志收集与分析(如 ELK 日志传输)。
    • 实时数据管道(如数据库变更同步)。
    • 事件驱动架构(如订单系统事件传递)。
    • 流处理(如实时推荐系统)。
  • RocketMQ

    • 金融交易(如支付系统)。
    • 订单处理(如电商订单系统)。
    • 需要高可靠性和低延迟的场景。

总结

  • Kafka:适合高吞吐、日志流处理、事件驱动架构和流处理场景。
  • RabbitMQ:适合实时通信、复杂路由和需要高可靠性的场景。
  • RocketMQ:适合金融交易、订单处理等需要高可靠性和低延迟的场景。
  • Pulsar:适合多租户消息中间件、实时通信和云原生消息服务场景。

八、实战与设计

1. 如何设计一个高可用的 Kafka 集群?

设计目标

确保 Kafka 集群在节点故障时仍能正常运行,数据不丢失。

设计方案

  • 多 Broker 部署:部署至少 3 个 Broker 节点,确保高可用性。节点分布在不同的物理机或可用区,避免单点故障。
  • 副本机制:每个分区配置多个副本(如 3 个),确保数据的高可用性。副本分布在不同的 Broker 上,避免单点故障。
  • ISR 机制:使用 ISR(In-Sync Replicas)机制,确保副本与 Leader 保持同步。配置 min.insync.replicas 参数,确保选举时数据不丢失。
  • ZooKeeper 集群:部署 ZooKeeper 集群,管理 Kafka 集群的元数据和 Leader 选举。(注:Kafka 2.8+ 版本开始支持无需 ZooKeeper 的模式,称为 KRaft 模式)。
  • 监控与报警:使用 Kafka Manager 或 Prometheus + Grafana 监控集群状态。设置报警阈值,及时发现和处理故障。

示例配置

  • Broker 节点:3 个,分布在不同的可用区。
  • 分区副本数:3 个,确保高可用性。
  • ZooKeeper 集群:3 个节点,确保元数据的高可用性。

2. 如何用 Kafka 实现一个分布式消息队列?

设计目标

实现一个高吞吐、高可用的分布式消息队列,支持生产者和消费者的异步通信。

设计方案

  • 创建 Topic:创建一个 Topic(如 message-queue),配置多个分区(如 3 个)。
  • 生产者发送消息:生产者将消息发送到 message-queue Topic,指定分区键(如用户 ID)。
  • 消费者消费消息:消费者从 message-queue Topic 中消费消息,确保消息按顺序处理。
  • 副本机制:每个分区配置多个副本(如 3 个),确保数据的高可用性。
  • 监控与报警:使用 Kafka Manager 监控消息队列的状态,设置报警阈值。

示例

  • Topic:message-queue,分区数:3,副本数:3。
  • 生产者:发送消息到 message-queue,指定分区键(如用户 ID)。
  • 消费者:从 message-queue 中消费消息,确保消息按顺序处理。

3. 如何用 Kafka 实现一个实时推荐系统?

设计目标

实时处理用户行为数据,计算推荐分数并更新推荐结果。

设计方案

  • 用户行为数据收集:使用 Kafka 收集用户行为数据(如点击、浏览),发送到 user-behavior Topic。
  • 实时流处理:使用 Kafka Streams 或 Flink 实时处理用户行为数据,计算推荐分数。
    • 示例:根据用户点击记录计算推荐分数。
  • 推荐结果更新:将推荐结果写入 recommendation Topic,供前端系统消费。
  • 监控与报警:使用 Kafka Manager 监控推荐系统的状态,设置报警阈值。

示例

  • Topic:user-behavior,分区数:3,副本数:3。
  • 流处理:使用 Kafka Streams 实时计算推荐分数。
  • Topic:recommendation,分区数:3,副本数:3。

4. 如何用 Kafka 实现数据同步(如 MySQL 到 Elasticsearch)?

设计目标

实时同步 MySQL 数据到 Elasticsearch,确保数据一致性。

设计方案

  • 数据变更捕获:使用 CDC(Change Data Capture)工具(如 Debezium)捕获 MySQL 数据变更,发送到 mysql-cdc Topic。
  • 数据转换:使用 Kafka Streams 或 Flink 对数据进行转换,生成 Elasticsearch 所需的格式。
  • 数据写入 Elasticsearch:使用 Kafka Connect 的 Elasticsearch Sink Connector,将数据写入 Elasticsearch。
  • 监控与报警:使用 Kafka Manager 监控数据同步的状态,设置报警阈值。

示例

  • Topic:mysql-cdc,分区数:3,副本数:3。
  • 数据转换:使用 Kafka Streams 转换数据格式。
  • Sink Connector:使用 Elasticsearch Sink Connector 写入 Elasticsearch。

5. 如何用 Kafka 实现一个事件溯源(Event Sourcing)系统?

设计目标

使用事件溯源模式记录系统状态的变化,确保数据的一致性和可追溯性。

设计方案

  • 事件存储:使用 Kafka 存储事件(如订单创建、支付、发货),发送到 events Topic。
  • 事件处理:使用 Kafka Streams 或 Flink 实时处理事件,更新系统状态。
  • 状态存储:将系统状态存储在数据库(如 MySQL)或缓存(如 Redis)中。
  • 事件重放:通过重放 events Topic 中的事件,重建系统状态。
  • 监控与报警:使用 Kafka Manager 监控事件溯源系统的状态,设置报警阈值。

示例

  • Topic:events,分区数:3,副本数:3。
  • 事件处理:使用 Kafka Streams 实时处理事件,更新系统状态。
  • 状态存储:将系统状态存储在 MySQL 或 Redis 中。

九、底层原理

1. Kafka 的底层存储机制是什么?消息是如何写入磁盘的?

底层存储机制

Kafka 的底层存储机制基于 日志分段(Log Segment)索引文件(Index File),确保消息的高效存储和检索。

  • 日志分段(Log Segment)
    • 每个分区的消息存储在一个日志文件中,日志文件按大小或时间分段。
    • 每个段文件(Segment File)包含一组消息,文件名基于起始偏移量(Offset)命名。
  • 索引文件(Index File)
    • 每个段文件对应一个索引文件,记录消息的偏移量和物理位置。
    • 索引文件用于快速定位消息,减少磁盘 I/O。

消息写入磁盘的过程

  1. 生产者发送消息:生产者将消息发送到 Kafka Broker。
  2. 消息写入日志文件:Broker 将消息追加到对应分区的日志文件中。
  3. 消息索引更新:Broker 更新索引文件,记录消息的偏移量和物理位置。
  4. 消息确认:Broker 向生产者发送确认(ACK),表示消息已成功写入。

持久化特点

  • 顺序写入:消息按顺序写入磁盘,提升写入性能。
  • 零拷贝(Zero-Copy):通过零拷贝技术减少数据复制,提升读取性能。
  • 日志清理:支持基于时间和大小的日志清理策略,避免磁盘空间耗尽。

2. Kafka 的零拷贝(Zero-Copy)技术是什么?如何提升性能?

零拷贝技术的定义

零拷贝:一种优化技术,减少数据在内核空间和用户空间之间的复制次数,提升数据传输效率。

零拷贝的工作原理

  • 传统数据复制:数据从磁盘读取到内核缓冲区,再从内核缓冲区复制到用户缓冲区,最后发送到网络。需要多次数据复制,性能较低。
  • 零拷贝技术:数据直接从磁盘读取到内核缓冲区,然后通过网络发送,无需复制到用户缓冲区。减少数据复制次数,提升性能。

零拷贝的优势

  • 减少 CPU 开销:减少数据复制次数,降低 CPU 使用率。
  • 提升吞吐量:减少数据传输时间,提升系统吞吐量。
  • 降低延迟:减少数据处理时间,降低系统延迟。

3. Kafka 的网络通信模型是什么?如何实现高吞吐量?

网络通信模型

  • 多路复用:Kafka 使用多路复用技术,通过单个连接处理多个请求,减少连接开销。
  • 批量发送:生产者将多条消息打包发送,减少网络开销。
  • 异步处理:Kafka 使用异步处理模式,避免阻塞网络通信。
  • 零拷贝技术:Kafka 使用零拷贝技术,减少数据复制次数,提升网络传输效率。

实现高吞吐量的方法

  • 增加分区数:分区是 Kafka 并行处理的基本单位,增加分区数可以提升吞吐量。
  • 优化网络配置:使用高性能网络设备(如万兆网卡),提升网络带宽。
  • 调整批处理参数:通过 linger.msbatch.size 参数控制批量发送,减少网络开销。
  • 使用压缩算法:启用消息压缩(如 GZIP、Snappy),减少网络传输量。

4. Kafka 的日志分段(Log Segment)机制是什么?

日志分段机制的定义

日志分段:Kafka 将日志文件按大小或时间分段,便于管理和清理。

日志分段的工作原理

  • 段文件创建:每个分区的日志文件按大小(如 1GB)或时间(如 1 天)分段。每个段文件包含一组消息,文件名基于起始偏移量(Offset)命名。
  • 段文件索引:每个段文件对应一个索引文件,记录消息的偏移量和物理位置。索引文件用于快速定位消息,减少磁盘 I/O。
  • 段文件清理:Kafka 定期清理旧的段文件,释放磁盘空间。清理策略包括基于时间和大小的清理,以及日志压缩(Log Compaction)。

日志分段的优势

  • 高效存储:通过分段存储,提升日志文件的读写性能。
  • 快速检索:通过索引文件,快速定位消息,减少磁盘 I/O。
  • 灵活清理:支持多种清理策略,避免磁盘空间耗尽。

十、行为与场景题

1. 如果 Kafka 集群中的一个 Broker 宕机,会发生什么?如何恢复?

Broker 宕机的影响

  • 分区 Leader 选举:如果宕机的 Broker 是某个分区的 Leader,Kafka 会从 ISR(In-Sync Replicas)中选举新的 Leader。如果 ISR 为空,Kafka 会从所有副本中选举新的 Leader,但可能导致数据丢失。
  • 数据可用性:如果分区副本数足够(如 3 个),数据仍然可用,消费者可以继续消费。如果分区副本数不足(如 1 个),数据可能不可用,消费者无法消费。
  • 性能影响:分区 Leader 选举和数据同步可能导致短暂的性能下降。

恢复方法

  • 重启 Broker:尝试重启宕机的 Broker,恢复其正常运行。
  • 重新分配分区:如果 Broker 无法恢复,使用 kafka-reassign-partitions.sh 工具重新分配分区,确保数据的高可用性。
  • 监控与报警:使用 Kafka Manager 或 Prometheus + Grafana 监控集群状态,设置报警阈值,及时发现和处理故障。

2. 如果 Kafka 的消费者消费速度过慢,如何解决?

消费速度过慢的原因

  • 消费者处理能力不足:消费者处理速度慢,无法及时消费消息。
  • 分区分布不均衡:部分分区的消息量过大,导致消费者处理不过来。
  • 网络延迟:消费者与 Kafka 集群之间的网络延迟高,影响消费速度。

解决方案

  • 增加消费者实例:部署更多消费者实例,提升消费能力。
  • 优化消费者处理逻辑:使用多线程或异步处理消息,提升消费速度。
  • 调整预取数量:通过 max.poll.records 参数控制每次拉取的消息数量,避免消费者过载。
  • 优化分区分布:重新分配分区,确保负载均衡。
  • 优化网络配置:确保消费者与 Kafka 集群之间的网络延迟低、带宽高。

3. 如果 Kafka 的生产者发送消息失败,可能是什么原因?如何排查?

发送消息失败的原因

  • Broker 不可用:Kafka 集群中的 Broker 宕机或网络不可达。
  • Topic 或分区不可用:Topic 或分区不存在,或分区 Leader 不可用。
  • 生产者配置错误:生产者配置参数(如 bootstrap.servers)错误。
  • 网络问题:生产者与 Kafka 集群之间的网络延迟高或带宽不足。

排查方法

  • 检查 Broker 状态:使用 kafka-broker-api-versions.sh 检查 Broker 是否正常运行。
  • 检查 Topic 和分区状态:使用 kafka-topics.sh 检查 Topic 和分区状态,确保分区 Leader 可用。
  • 检查生产者配置:检查生产者的配置参数(如 bootstrap.servers),确保配置正确。
  • 检查网络连接:使用 pingtelnet 检查生产者与 Kafka 集群之间的网络连接。

4. 如果 Kafka 的消息丢失,如何排查和解决?

消息丢失的原因

  • 生产者未收到 ACK:生产者发送消息后未收到 Kafka 的确认(ACK),导致消息丢失。
  • 副本同步延迟:副本同步延迟高,导致消息未及时同步到所有副本。
  • 消费者未提交 Offset:消费者处理完消息后未提交 Offset,导致消息重复消费或丢失。

排查方法

  • 检查生产者日志:检查生产者的日志,确认是否收到 Kafka 的 ACK。
  • 检查副本同步状态:使用 kafka-topics.sh 检查分区的副本同步状态,确保副本与 Leader 保持同步。
  • 检查消费者 Offset:使用 kafka-consumer-groups.sh 检查消费者的 Offset,确认是否提交成功。

解决方案

  • 启用生产者 ACK:配置生产者 acks=all,确保消息同步到所有副本后再确认。
  • 优化副本同步:增加副本数,优化网络和磁盘性能,提升副本同步速度。
  • 消费者手动提交 Offset:使用手动提交 Offset,确保消息处理完成后再提交。

5. 如果 Kafka 的 Topic 分区不均衡,如何重新分配分区?

分区不均衡会导致以下问题

  • 负载不均衡:部分 Broker 承载过多分区,导致资源(CPU、内存、磁盘 I/O)压力过大,而其他 Broker 资源闲置。
  • 性能瓶颈:负载高的 Broker 可能成为性能瓶颈,影响整个集群的吞吐量和延迟。
  • 容错性下降:如果某个 Broker 宕机,其承载的分区需要重新分配,可能导致集群性能进一步下降。

重新分配分区的原则

在重新分配分区时,需要遵循以下原则,以确保集群的负载均衡和高可用性:

a. 均衡分区分布
  • 目标:确保每个 Broker 承载的分区数量大致相同。
  • 方法
    • 计算当前每个 Broker 的分区数量,找出负载过高或过低的 Broker。
    • 将负载高的 Broker 上的分区迁移到负载低的 Broker 上。
b. 均衡副本分布
  • 目标:确保每个 Broker 承载的副本数量大致相同。
  • 方法
    • 不仅要考虑分区数量,还要考虑副本数量。
    • 避免某个 Broker 成为多个分区的 Leader 或 Follower,导致资源过度集中。
c. 考虑 Broker 的资源容量
  • 目标:根据 Broker 的资源容量(CPU、内存、磁盘)合理分配分区。
  • 方法
    • 资源充足的 Broker 可以承载更多分区。
    • 资源有限的 Broker 应减少分区数量,避免成为性能瓶颈。
d. 避免单点故障
  • 目标:确保分区和副本分布在不同的 Broker 上,避免单点故障。
  • 方法
    • 同一个分区的副本应分布在不同的 Broker 上。
    • 避免将所有分区的 Leader 集中在少数 Broker 上。
e. 最小化数据迁移
  • 目标:在重新分配分区时,尽量减少数据迁移的开销。
  • 方法
    • 优先迁移负载高的 Broker 上的分区,而不是全部分区。
    • 避免频繁重新分配分区,减少对集群性能的影响。

重新分配分区的步骤

  1. 生成分区重新分配计划

    • 使用 kafka-reassign-partitions.sh 工具生成分区重新分配计划。
    • 示例命令:
      kafka-reassign-partitions.sh --bootstrap-server <broker-list> --reassignment-json-file reassignment.json --generate
      
    • 该命令会生成一个 JSON 文件,包含当前分区分布和目标分布。
  2. 执行分区重新分配

    • 使用生成的 JSON 文件执行分区重新分配。
    • 示例命令:
      kafka-reassign-partitions.sh --bootstrap-server <broker-list> --reassignment-json-file reassignment.json --execute
      
  3. 验证分区重新分配

    • 使用以下命令验证分区重新分配是否成功:
      kafka-reassign-partitions.sh --bootstrap-server <broker-list> --reassignment-json-file reassignment.json --verify
      
  4. 监控重新分配过程

    • 使用 Kafka Manager 或 Prometheus + Grafana 监控分区重新分配的过程,确保没有性能瓶颈或数据丢失。

注意事项

  • 数据迁移开销:分区重新分配会导致数据迁移,可能会影响集群性能。建议在业务低峰期执行。
  • 副本同步:确保分区重新分配后,所有副本与 Leader 保持同步,避免数据不一致。
  • 监控与报警:在重新分配分区后,持续监控集群状态,确保负载均衡和高可用性。

相关文章:

Kafka 八股文

一、基础概念 1. Kafka 是什么&#xff1f;它的核心组件有哪些&#xff1f; Kafka 的定义 Kafka 是一个 分布式流处理平台&#xff0c;最初由 LinkedIn 开发&#xff0c;后成为 Apache 顶级项目。它主要用于 高吞吐量的实时数据流处理&#xff0c;支持发布-订阅模式的消息传递…...

现代前端开发框架对比:React、Vue 和 Svelte 的选择指南

引言 在当今快速发展的 Web 开发领域&#xff0c;前端框架的选择往往直接影响项目的开发效率、维护成本和用户体验。React、Vue 和 Svelte 作为当前最受关注的三大框架&#xff0c;各自拥有独特的设计哲学与技术实现。本文将通过 5000 字的深度解析&#xff0c;从架构设计、开…...

ffmpeg(库编译) 01 搭建环境和安装依赖

创建目录在home目录下创建 ffmpeg_sources:用于下载源文件 ffmpeg_build: 存储编译后的库文件 bin:存储二进制文件(ffmpeg,ffplay,ffprobe,X264,X265等) mkdir ffmpeg_sources ffmpeg_build bin安装依赖 先执行sudo apt-get update进行更新,再往下走sudo apt-get -…...

Java后端开发技术详解

Java作为一门成熟的编程语言&#xff0c;已广泛应用于后端开发领域。其强大的生态系统和广泛的支持库使得Java成为许多企业和开发者的首选后端开发语言。随着云计算、微服务架构和大数据技术的兴起&#xff0c;Java后端开发的技术栈也不断演进。本文将详细介绍Java后端开发的核…...

Python高级:GIL、C扩展与分布式系统深度解析

文章目录 &#x1f4cc; **前言**&#x1f527; **第一章&#xff1a;Python语言的本质与生态**1.1 **Python的实现与版本演进**1.2 **开发环境与工具链** &#x1f527; **第二章&#xff1a;元编程与动态特性**2.1 **描述符协议&#xff08;Descriptor Protocol&#xff09;*…...

数学之握手问题

问题描述 小蓝组织了一场算法交流会议&#xff0c;总共有 50人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 7 个人&#xff0c;这 7 人彼此之间没有进行握手 (但这 7 人与除这 …...

【Nodejs】2024 汇总现状

之前已经调研了容器、nexus-public&#xff0c;实现了本地构建应用镜像和基础设施的镜像。为实现分布式一体化协作开发的目标&#xff0c;还需要配套的线上协作开发环境。故而重回前端调研现状&#xff0c;比较 5 年前的 nodejs 快好的啊。 以下是针对 Node.js 工具链的深度解析…...

人工智能之数学基础:矩阵的降维

本文重点 在现实世界中,我们经常会遇到高维数据。例如,图像数据通常具有很高的维度,每个像素点都可以看作是一个维度。高维数据不仅会带来计算和存储上的困难,还可能会导致 “维数灾难”,即随着维度的增加,数据的稀疏性和噪声也会增加,从而影响数据分析的效果。因此,我…...

数仓开发那些事(10)

某神州优秀员工&#xff1a;&#xff08;没错&#xff0c;这个diao毛被评为了优秀员工&#xff09;一闪&#xff0c;听说你跑路了&#xff0c;不做零售行业了 一闪&#xff1a;没错&#xff0c;老东家的新it总监上任后大家都开始躺平&#xff0c;失去了当年的动力&#xff0c;所…...

【手工】早教游戏:下楼的猴子

一、效果 二、准备材料 吸管: 10.4 c m 10.4cm 10.4cm&#xff1b;棉签&#xff1a; 6 6 6 根双头棉签&#xff1b;硬币&#xff1a;1角&#xff1b;纸皮人: 2.0 c m 4.0 c m 2.0cm4.0cm 2.0cm4.0cm&#xff1b;纸板&#xff1a; 12.0 c m 30.0 c m 12.0cm30.0cm 12.0cm30…...

力扣刷题46. 全排列

46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 使用dfs搜索&#xff0c;查找所有的情况&#xff0c;首先定义所有的链表集合list&#xff0c;在定义每一种情况的链表res&#xff0c;在主函数中遍历所有的初始元素&#xff0c;首先初始化res&#xff0c;并且添加到res中&…...

【工作记录】pytest使用总结

1、 fixture夹具 可参考&#xff1a; python3.x中 pytest之fixture - 漂泊的小虎 - 博客园 fixture是指夹具&#xff08;把用例夹在中间&#xff09;&#xff0c;它包括前置工作和后置工作&#xff0c;前置是用例代码的准备阶段&#xff0c;后置是用例执行之后的清理阶段,用…...

linux 命令 mkdir

以下是 Linux mkdir 命令的简明总结&#xff0c;适合快速查阅和实际场景应用&#xff1a; 基础语法 mkdir [选项] 目录名... 常用选项速查 选项作用-p自动创建父目录&#xff08;解决多级目录问题&#xff09; mkdir -p a/b/c-m直接设置权限&#xff08;替代chmod&#xff0…...

浏览器对一个资源设置了缓存,如何清除缓存,且后续请求不命中缓存

方式1、浏览器端强制刷新 方式2、修改资源url eg&#xff1a;如下图&#xff0c;添加了查询参数 <link rel"stylesheet" href"style.css?v1.2.1"> <script src"app.js?t20231010"></script> 原理&#xff1a;1、在资源的…...

k8s的存储

一 configmap 1.1 configmap的功能 configMap用于保存配置数据&#xff0c;以键值对形式存储。 configMap 资源提供了向 Pod 注入配置数据的方法。 镜像和配置文件解耦&#xff0c;以便实现镜像的可移植性和可复用性。 etcd限制了文件大小不能超过1M 1.2 configmap的使用…...

[JavaScript]如何利用作用域块避免闭包内存泄漏?

出自《你不知道的JavaScript》上卷 以下是本书给出的反例: function process (data) {...} var bigdata{...} process(bigdata); var btn document.getElementById(x); btn.addEventListener(click, function click{...});click会被回调在其他位置, 在addEventListener函数内…...

Pytorch使用手册—扩展 TorchScript 使用自定义 C++ 操作符(专题五十三)

提示 本教程自 PyTorch 2.4 起已弃用。有关 PyTorch 自定义操作符的最新指南,请参阅 PyTorch 自定义操作符。 PyTorch 1.0 版本引入了一种名为 TorchScript 的新编程模型。TorchScript 是 Python 编程语言的一个子集,可以被 TorchScript 编译器解析、编译和优化。此外,编译后…...

CellOracle|基因扰动研究基因功能|基因调控网络+虚拟干预

在gzh“生信小鹏”同步文章 论文来源: 发表期刊:Nature发表时间:2023年2月23日论文题目:Dissecting cell identity via network inference and in silico gene perturbation研究团队:Kenji Kamimoto 等,华盛顿大学医学院1. 研究背景与问题提出 细胞身份(Cell Identit…...

深入探索JVM字节码增强技术与调优实践

引言 Java虚拟机(JVM)是Java程序运行的基石,而字节码增强技术则是JVM生态中一项强大的工具。通过字节码增强,开发者可以在不修改源代码的情况下,动态地修改或增强类的行为。本文将深入探讨字节码增强技术的原理、常用工具,并结合JVM调优和排错实践,帮助开发者更好地理解…...

vue 中常用操作数组的方法

操作数组方法 记录一下自己常用到的操作数组的方法 1.forEach() 遍历数组 在回调函数中对原数组的每个成员进行修改&#xff08;不用 return&#xff09; 方法接收一个回调函数 回调函数接收两个参数 第一个是遍历的当前元素 第二个是元素的索引 const arr [{name: 张三},…...

envoy 源码分析

整体架构 Envoy 的架构如图所示: Envoy 中也可能有多个 Listener&#xff0c;每个 Listener 中可能会有多个 filter 组成了 chain。 Envoy 接收到请求后&#xff0c;会先走 FilterChain&#xff0c;通过各种 L3/L4/L7 Filter 对请求进行微处理&#xff0c;然后再路由到指定的集…...

c++基础知识--返回值优化

在 C 中&#xff0c;Named Return Value Optimization&#xff08;NRVO&#xff0c;具名返回值优化&#xff09; 是一种编译器优化技术&#xff0c;用于消除函数返回一个局部对象时的拷贝或移动操作。它是 返回值优化&#xff08;RVO&#xff09; 的一种更复杂的变体&#xff0…...

【第14节】windows sdk编程:进程与线程介绍

目录 一、进程与线程概述 1.1 进程查看 1.2 何为进程 1.3 进程的创建 1.4 进程创建实例 1.5 线程查看 1.6 何为线程 1.7 线程的创建 1.8 线程函数 1.9 线程实例 二、内核对象 2.1 何为内核对象 2.2 内核对象的公共特点 2.3 内核对象句柄 2.4 内核对象的跨进程访…...

实测 Gemini 2.0 Flash 图像生成:多模态 AI 的创作力边界

近日&#xff0c;Google 发布了 Gemini 2.0 Flash 的实验性图像生成功能&#xff08;Gemini 2.0 Flash (Image Generation) Experimental&#xff09;。我也第一时间体验了这一功能&#xff0c;再次感受到 AI 技术对传统图像处理工具的颠覆性冲击。 引言 Gemini 2.0 Flash 的…...

每日一题——买卖股票的最佳时机

买卖股票的最佳时机 问题描述示例示例 1示例 2 提示 问题分析难点分析 算法设计思路 代码实现复杂度分析测试用例测试用例 1测试用例 2测试用例 3 总结 问题描述 给定一个数组 prices&#xff0c;其中第 i 个元素 prices[i] 表示一支给定股票在第 i 天的价格。你可以选择某一天…...

以太坊节点间通信机制 DEVp2p 协议

文章目录 概要1. 协议概述2. 协议栈与关键技术3. RLPx 协议核心机制3.1 数据包结构3.2 加密握手流程 4. 核心子协议与消息类型4.1 基础控制消息4.2 以太坊子协议示例4.3 网络 ID 列表 5. 安全与防攻击机制6. 节点标识与声誉管理7. 对比其他区块链通信协议8. 总结 概要 1. 协议…...

YOLO+OpenCV强强联手:高精度跌倒检测技术实战解析

目录 关于摔倒检测 摔倒检测核心逻辑 摔倒检测:联合多种逻辑判断 原理详细解释 1. 导入必要的库 2. 定义函数和关键点连接关系 3. 筛选有效关键点并计算边界框 4. 计算人体上下半身中心点和角度 5. 绘制关键点和连接线 6. 绘制角度标注和检测跌倒 7. 返回处理后的图…...

HyperAD:学习弱监督音视频暴力检测在双曲空间中的方法

文章目录 速览摘要1. 引言2. 相关工作弱监督暴力检测双曲空间中的神经网络 3. 预备知识双曲几何切空间&#xff08;Tangent Space&#xff09;指数映射与对数映射&#xff08;Exponential and Logarithmic Maps&#xff09;3.1 双曲图卷积网络&#xff08;Hyperbolic Graph Con…...

网络协议抓取与分析(SSL Pinning突破)

1. 网络协议逆向基础 1.1 网络协议分析流程 graph TD A[抓包环境配置] --> B[流量捕获] B --> C{协议类型} C -->|HTTP| D[明文解析] C -->|HTTPS| E[SSL Pinning突破] D --> F[参数逆向] E --> F F --> G[协议重放与模拟] 1.1.1 关键分析目标…...

基于C#的以太网通讯实现:TcpClient异步通讯详解

基于C#的以太网通讯实现&#xff1a;TcpClient异步通讯详解 在现代工业控制和物联网应用中&#xff0c;以太网通讯是一种常见的数据传输方式。本文将介绍如何使用C#实现基于TCP协议的以太网通讯&#xff0c;并通过异步编程提高通讯效率。我们将使用TcpClient类来实现客户端与服…...

通过C#脚本更改材质球的参数

// 设置贴图Texture mTexture Resources.Load("myTexture", typeof(Texture )) as Texture;material.SetTexture("_MainTex", mTexture );// 设置整数material.SetInt("_Int", 1);// 设置浮点material.SetFloat("_Float", 0.1f);// 设…...

SpringBoot常用注解

SpringBoot常用注解 SpringBoot框架提供了丰富的注解&#xff0c;极大地简化了应用开发。本文将SpringBoot常用注解按功能分组&#xff0c;并提供详细说明和使用示例。 一、核心注解 1. SpringBootApplication 这是SpringBoot应用的核心注解&#xff0c;标记在主类上&#…...

Vim 编辑器复制文件所有内容

Vim 编辑器复制文件所有内容 在 Vim 的可视化模式下复制所有内容&#xff0c;可以通过以下步骤完成&#xff1a; 方法 1&#xff1a;可视化模式全选复制 进入可视化模式 按下 V&#xff08;大写 V&#xff09;进入 行可视化模式。 全选内容 依次按下 gg&#xff08;跳转到文件…...

MySQL 安全传输

Doris 开启 SSL 功能需要配置 CA 密钥证书和 Server 端密钥证书&#xff0c;如需开启双向认证&#xff0c;还需生成 Client 端密钥证书&#xff1a; 默认的 CA 密钥证书文件位于Doris/fe/mysql_ssl_default_certificate/ca_certificate.p12&#xff0c;默认密码为doris&#xf…...

【速览】数据库

一、课程性质和特点 数据库系统原理是高等教育自学考试计算机信息管理专业(独立本科段)、计算机网络专业(独立本科段)、计算机及应用专业(独立本科段)、计算机通信工程专业(独立本科段)考试计划的一门专业基础课。本课程的设置目的是为了使应考者掌握数据库系统的基本原理、方法…...

MySQL 中利用 mysql.help_topic 实现行转列的深入剖析

MySQL 中利用 mysql.help_topic 实现行转列的深入剖析 在数据库操作中&#xff0c;我们常常会遇到数据格式转换的需求。其中&#xff0c;行转列是一种常见的数据处理任务&#xff0c;它能将数据从一种便于存储的行结构&#xff0c;转换为更便于分析和展示的列结构。在 MySQL 数…...

学习使用smartengine

1、开源地址 smartengine的地址 GitCode - 全球开发者的开源社区,开源代码托管平台 2、如何基于这个开源的框架实现自己的业务定制 参考一些文章&#xff1a; 探索BPMN—工作流技术的理论与实践&#xff5c;得物技术...

鸿蒙保姆级教学

鸿蒙&#xff08;HarmonyOS&#xff09;是华为推出的一款面向全场景的分布式操作系统&#xff0c;支持手机、平板、智能穿戴、智能家居、车载设备等多种设备。鸿蒙系统的核心特点是分布式架构、一次开发多端部署和高性能。以下是从入门到大神级别的鸿蒙开发深度分析&#xff0c…...

HW华为流程管理体系精髓提炼华为流程运营体系(124页PPT)(文末有下载方式)

资料解读&#xff1a;HW华为流程管理体系精髓提炼华为流程运营体系&#xff08;124页PPT&#xff09; 详细资料请看本解读文章的最后内容。 华为作为全球领先的科技公司&#xff0c;其流程管理体系的构建与运营是其成功的关键之一。本文将从华为流程管理体系的核心理念、构建…...

What a code!

要在前后两个图表之间连接对应的坐标轴刻度点&#xff0c;可以通过在父部件中绘制线条来实现。以下是具体步骤和代码实现&#xff1a; 步骤说明 重写paintEvent函数&#xff1a;在Bigraph的paintEvent中绘制连接线。获取刻度值列表&#xff1a;根据每个坐标轴的最小值、最大值…...

Qt开发中的常见问题与解决方案

目录 1.Qt中大资源文件的处理 2.中文URL编码问题 3.编译器类型、版本与操作系统的判断 4.Qt版本与构建套件位数的判断 5.QWidget样式表不起作用的解决方案 6.动态改变弹簧的拉伸策略 7.文件操作的性能优化 8.自定义心跳包与TCP保活机制 9.Qt平台插件加载失败问题 10.…...

蓝桥杯嵌入式赛道复习笔记3(lcd与led引脚冲突问题)

直接上干货 1.在初始化lcd之前要关闭锁存器 切记一定要开启PD2的引脚&#xff0c;否则白搭 2.在用到的lcd函数要加 uint16_t temp GPIOC->ODR;GPIOC->ODR temp;例如...

【cf】交换

交换数组中元素&#xff0c;逆序对数1&#xff0c;所以逆序对奇偶性发生改变 D. Swap Dilemma https://www.cnblogs.com/pure4knowledge/p/18292578这个写的太好了 任意交换两个数&#xff0c;会使序列的逆序对数加减一个奇数。 所以如果两个序列&#xff0c;初始逆序对数的奇…...

anythingLLM之stream-chat传参

1、 接口地址 /v1/workspace/{slug}/stream-chat POST请求 {"message": "根据以下事件信息找出今天发生的事件有哪几个[{\"事件所在桩号\":\"K1045900\",\"事件发生位置&#xff08;经纬度值&#xff09;\":\"114.149…...

友思特应用 | 行业首创:基于深度学习视觉平台的AI驱动轮胎检测自动化

导读 全球领先的轮胎制造商 NEXEN TIRE 在其轮胎生产检测过程中使用了基于友思特伙伴Neurocle开发的AI深度学习视觉平台&#xff0c;实现缺陷检测率高达99.96%&#xff0c;是该行业首个使用AI平台技术推动缺陷检测自动化流程的企业。 将AI应用从轮胎开发扩展到制造过程 2024年…...

Python 变量的定义与使用:从基础到高级

Python 变量的定义与使用:从基础到高级 在 Python 中,变量是程序中最基本的概念之一。变量用于存储数据,并在程序运行过程中随时访问和修改这些数据。理解变量的定义和使用是学习 Python 编程的第一步。 1. 变量的定义 1.1 什么是变量? 变量是程序中用于存储数据的容器。…...

Linux 系统性能调优

概述 在日常运维和架构优化中&#xff0c;Linux 性能调优是提高系统稳定性和运行效率的重要手段。本文结合工作经验&#xff0c;总结了 Linux 服务器常见的优化技巧&#xff0c;涵盖 CPU、内存、磁盘 I/O、网络等多个方面&#xff0c;帮助大家在不同场景下快速定位和优化系统性…...

蓝桥杯备考:奶牛晒衣服

这道题第一眼想用贪心做&#xff0c;1 2 3 我们可以让最多的3用烘干机1秒就能完成&#xff0c;那么是不是我们每次都给湿度最大的衣服用烘干机呢&#xff1f;我们试试哈&#xff0c;比如[5,8]&#xff0c;每秒晒干1我们给8衣服一直用烘干机是需要4秒的&#xff0c;4秒后8这个…...

英伟达“AI 超级碗”开幕

Nvidia的AI和机器人技术进展 2025年03月19日 | AI日报 ![](https://i-blog.csdnimg.cn/direct/e7838b88f17f40c9a435f6dc48d26c59.jpeg#pic_center) 欢迎各位人工智能爱好者。 Nvidia的CEO Jensen Huang刚刚拉开了他的“AI超级碗”&#xff0c;并发表了关于该公司最新芯片、…...

Java使用FFmpegFrameGrabber进行视频拆帧,结合Thumbnails压缩图片保存到文件夹

引入依赖 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.17</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ja…...