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

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;支持发布-订阅模式的消息传递…...

OpenHarmony 开源鸿蒙北向开发——3.配置SDK

安装、配置完成之后我们就要配置SDK。 我们创建工程后&#xff0c;点击右上角设置 进入设置 进入OpenHarmony SDK&#xff0c;选择编辑 这里配置一下SDK安装位置 点击完成 这里我们API版本勾选第一个即可 确认安装 勾选接受 这里要等一会 安装完成后&#xff0c;点击完成...

电子工程师转战汽车OEM主机厂之路

文章目录 1 电子工程师2 汽车系统工程师 第一篇分享一个笔者2018年的一个心得文章&#xff0c;回头想想从事汽车行业也小8年了&#xff0c;从懵懂稚嫩到所谓的老油条&#xff0c;也是难忘的经历&#xff0c;希望我的经历对从事电子行业和汽车行业的小伙伴有所帮助。 1 电子工程…...

vulhub Matrix-Breakout

1.下载靶机&#xff0c;打开靶机和kali虚拟机 2.查询kali和靶机ip 3.浏览器访问 访问81端口有登陆界面 4.扫描敏感目录 kali dirb 扫描 一一访问 robot.txt提示我们继续找找&#xff0c;可能是因为我们的字典太小了&#xff0c;我们换个扫描器换个字典试下,利用kali自带的最大…...

Unity3D开发AI桌面精灵/宠物系列 【二】 语音唤醒 ivw 的两种方式-Windows本地或第三方讯飞等

Unity3D 交互式AI桌面宠物开发系列【二】ivw 语音唤醒 该系列主要介绍怎么制作AI桌面宠物的流程&#xff0c;我会从项目开始创建初期到最终可以和AI宠物进行交互为止&#xff0c;项目已经开发完成&#xff0c;我会仔细梳理一下流程&#xff0c;分步讲解。 这篇文章主要讲有关于…...

三月九次前端面试复盘:当场景题成为通关密钥

三月初集中面了包括字节、美团、滴滴在内的9家公司&#xff0c;经历7场技术面2场Leader面后&#xff0c;发现如今的面试逻辑已发生根本转变。这里分享真实经历与题目&#xff0c;供近期求职者参考。 一、面试形态变化&#xff1a;从理论背诵到实战推演 1. 八股文边缘化&#…...

STM32 —— 嵌入式系统、通用计算机系统、物联网三层架构

目录 一、嵌入式系统的概念 二、通用计算机系统与嵌入式系统的比较 用途 硬件 软件 性能与功耗 开发与维护 三、嵌入式系统与物联网的关系 四、物联网的三层架构 1. 感知层&#xff08;Perception Layer&#xff09; 2. 网络层&#xff08;Network Layer&#xff09; …...

如何选择合适的 AI 模型?(开源 vs 商业 API,应用场景分析)

1. 引言 在 AI 迅猛发展的今天&#xff0c;各类 AI 模型层出不穷&#xff0c;从开源模型&#xff08;如 DeepSeek、Llama、Qwen&#xff09;到商业 API&#xff08;如 OpenAI 的 ChatGPT、Anthropic 的 Claude、Google Gemini&#xff09;&#xff0c;每种方案都有其优势与适用…...

视频对讲系统中,强插和强拆;视频分发功能

强插和强拆 在视频对讲系统中&#xff0c;强插和强拆是两个具有特定功能的操作&#xff0c;具体含义如下&#xff1a; 强插功能&#xff1a;指在视频对讲过程中&#xff0c;具有更高权限的用户或管理员可以强行插入正在进行的通话或视频连接。例如&#xff0c;当小区保安室监控…...

C++输入输出流第一弹:标准输入输出流 详解(带测试代码)

目录 C输入输出流 流的四种状态&#xff08;重点&#xff09; 标准输入输出流 标准输入流 逗号表达式 1. 逗号表达式的基本规则 示例 2. 图片中的代码分析 关键点解析 3. 常见误区 误区 1&#xff1a;逗号表达式等同于逻辑与 && 误区 2&#xff1a;忽略输入…...

{瞎掰} 手机安装app问题:app签名,手机 or OS官方商店 其他非官方app源,安全防护 突破限制

以下&#xff0c;在华为安卓系统手机中&#xff0c;在安装app过程中得到的一些可能是错误的经验。 商品化 app 的收钱方式&#xff1a;通过商店来收钱&#xff0c;通过 app 本身提供的注册码功能来收钱&#xff0c;或是其他的收钱方式。 手机安装 app的特点 从官方商店里安装…...

鸿蒙NEXT项目实战-百得知识库05

代码仓地址&#xff0c;大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点&#xff1a; 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…...

记录一次,rabbitmq开启stomp插件之后,还是连不上15674端口的问题

原因是装在docker 里面的rabbitmq 没有映射15674端口&#xff0c;需重新删除容器之后重新运行 docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -p 15674:15674 -p 1883:1883 -p 15675:15675 rabbitmq:版本号 进入docker容器开启插件 docker exec -it rabbitm…...

黑马node.js教程(nodejs教程)——AJAX-Day01-04.案例_地区查询——查询某个省某个城市所有地区(代码示例)

文章目录 代码示例效果 代码示例 axiosTest.html <!DOCTYPE html> <!-- 文档类型声明&#xff0c;告诉浏览器这是一个HTML5文档 --> <html lang"en"> <!-- HTML根元素&#xff0c;设置文档语言为英语 --><head> <!-- 头部区域&am…...

vue 自制列表,循环滚动

需求人员表示&#xff0c;超过高度的表格内容需要滚动展示&#xff0c;所以效果图如下&#xff1a; 自定义列表样式&#xff0c;主要是通过flex布局&#xff0c;控制 类th 与 类td 的宽度保持一致&#xff0c;标签结构还是参考了table的结构&#xff0c;由thead与tbody包裹tr再…...

【QA】模板方法模式在Qt中有哪些应用?

在 Qt 框架中&#xff0c;模板方法模式&#xff08;Template Method Pattern&#xff09;被广泛应用于框架的设计中&#xff0c;通过定义算法骨架并允许子类在不改变结构的情况下重写部分步骤。以下是 Qt 中典型的应用场景及示例&#xff1a; 1. 事件处理&#xff08;Event Ha…...

图论——kruskal算法

53. 寻宝(第七期模拟笔试) 题目描述 在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。 不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通…...

Windows主机、虚拟机Ubuntu、开发板,三者之间文件互传

以下内容源于日常学习的整理&#xff0c;欢迎交流。 下图是Windows主机、虚拟机Ubuntu、开发者三者之间文件互传的方式示意图&#xff1a; 注意&#xff0c;下面谈及的所有方式&#xff0c;都要求两者的IP地址处于同一网段&#xff0c;涉及到的软件资源见felm。 一、Windows主…...

Flutter Dart 泛型详解

引言 在 Flutter 开发中&#xff0c;Dart 语言的泛型是一项强大且实用的特性。泛型允许我们在定义类、方法或接口时使用类型参数&#xff0c;这样可以编写更加灵活、可复用且类型安全的代码。下面将详细介绍 Dart 泛型的各个方面&#xff0c;并结合代码示例进行说明。 1. 泛型…...

Windows Docker 报错: has no HTTPS proxy,换源

pull python 3.7报错&#xff1a; 尝试拉取Docker 测试库hello world也失败 尝试使用临时镜像源&#xff0c;可以成功拉取&#xff1a; sudo docker pull docker.m.daocloud.io/hello-world说明确实是网络问题&#xff0c;需要配置镜像源&#xff0c;为了方便&#xff0c;在d…...

Java:Arrays类:操作数组的工具类

文章目录 Arrays类常见方法SetAll(); 代码排序如果数组中存储的是自定义对象 Arrays类 常见方法 SetAll(); 注意&#xff1a; 不能用新的数组接是因为修改的是原数组&#xff0c;所以完了要输出原数组发现会产生变化参数是数组下标变成灰色是因为还能简化&#xff08;Lambda…...

【面试场景题-Redis中String类型和map类型的区别】

今天在面试中碰到一个场景题&#xff1a;在 Redis 中存储 100 万用户数据时&#xff0c;使用 String 类型和 Hash&#xff08;Map&#xff09;类型的主要区别是什么&#xff1f;体现在以下几个方面&#xff1a; 1. 存储结构与内存占用 String 类型 存储方式&#xff1a;每个用…...

List附加对象

List里面的某个对象需要修改&#xff0c;赋值 可以使用ALL或者ForEach&#xff0c;All的话&#xff0c;不能直接使用赋值对象只能赋值对象的某个字段 static void Main(string[] args){List<UserData> UserDatas new List<UserData>{new UserData { Id 1, Name …...

VLLM专题(三十六)—自动前缀缓存

PagedAttention 的核心思想是将每个请求的 KV 缓存划分为 KV 块。每个块包含固定数量的标记(tokens)对应的注意力键(keys)和值(values)。PagedAttention 算法允许将这些块存储在非连续的物理内存中,从而通过按需分配内存来消除内存碎片。 为了自动缓存 KV 缓存,我们利…...

相机光学(四十七)——相纸材质

1. 光面相纸 光面相纸表面光滑&#xff0c;亮度高&#xff0c;反光性好&#xff0c;能够呈现出清晰、鲜艳的图像效果&#xff0c;适合用于表现色彩艳丽、反差要求较高的题材&#xff0c;如产品照、艺术照和风景照。然而&#xff0c;这种相纸容易沾上指纹和灰尘。 2. 绒面相纸…...

数据表100多字段如何写mapper文件的xml

编写一个包含100多个字段的插入语句通常涉及到使用<mapper>标签来定义映射规则&#xff0c;特别是在使用MyBatis这样的持久层框架时。 1. 定义<mapper>命名空间 order表 <mapper namespace"com.example.mapper.orderMapper"><!-- 插入语句 --…...

只是“更轻更薄”?不!遨游三防平板还选择“更强更韧”

当消费电子领域普遍追求“更轻更薄”的设计美学时&#xff0c;遨游三防平板不止于此&#xff0c;还选择了另一条道路——“更强更韧”。在智能制造的复杂场景中&#xff0c;三防平板需直面高温、油污、撞击与极端气候的考验。普通消费级平板因防护性能不足&#xff0c;常因环境…...

拉取镜像太慢?一文解决!

# 拉取 Docker 镜像太慢&#xff1f;一文解决&#xff01;&#x1f680;在国内使用 Docker 拉取镜像时&#xff0c;可能会遇到速度慢甚至失败的情况。别担心&#xff01;本文带你快速优化 Docker 拉取方法&#xff01;&#x1f525;01 | 确保 Docker Hub 登录认证 &#x1f510…...

基于RAGFlow本地部署DeepSeek-R1大模型与知识库:从配置到应用的全流程解析

作者&#xff1a;后端小肥肠 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; DeepSpeek服务器繁忙&#xff1f;这几种替代方案帮你流畅使用&#xff01;&#xff08;附本地部署教程&#xff09;-CSDN博客 10分钟上手…...

(分块)洛谷 P2801 教主的魔法 题解

之前学过 莫队 算法&#xff0c;其运用了分块思想&#xff1b;但是我居然是第一次写纯种的分块题目。 题意 给你一个长度为 n n n 的序列 a a a&#xff08;一开始 ∀ a i ∈ [ 1 , 1000 ] \forall a_i\in[1,1000] ∀ai​∈[1,1000]&#xff09;。要求执行 q q q 次操作&…...