0%

算法简介:特性、性能分析与复杂度表示

算法是计算机科学的核心,是为解决特定问题而设计的一系列明确、可执行的步骤。一个高效的算法能显著提升程序性能,而理解算法的基本特性和性能分析方法,是设计和优化算法的基础。

算法的五大基本特性

算法必须满足以下五个核心特征,缺一不可:

  1. 有穷性
    算法必须在有限步骤内结束,不能无限循环。例如,求解斐波那契数列的算法需在计算到第 n 项后终止,而不是永远运行。
  2. 确定性
    算法的每一步操作必须无歧义,对于相同的输入,只能产生唯一的输出。例如,“将变量 a 的值增加 1” 是确定的,而 “将 a 的值稍微增加一点” 则不符合确定性。
  3. 输入
    算法可以有0 个或多个输入(从外部获取的数据)。例如,计算两个数的和需要 2 个输入,而打印 “Hello World” 则不需要输入。
  4. 输出
    算法必须有1 个或多个输出(与输入相关的结果)。输出是算法解决问题的体现,例如排序算法的输出是有序数组。
  5. 可行性
    算法的每一步操作必须能够通过有限次基本运算实现(如算术运算、逻辑判断等)。例如,“一步登天” 在现实中不可行,同理算法中不能包含无法执行的步骤。

算法性能分析:时间与空间复杂度

评价算法的优劣主要看其对时间和空间资源的占用,即时间复杂度和空间复杂度。它们不依赖具体硬件环境,而是通过数学模型描述算法的效率。

阅读全文 »

Kafka 核心 API 详解与实践:主题管理

Kafka 提供了四类核心 API 用于消息生产、消费、流处理和外部系统集成。其中,通过 kafka-clients 库的 AdminClient API 可实现对 Kafka 主题(Topic)的全生命周期管理,包括创建、查询、修改、删除及分区调整等操作。本文将详细介绍这些操作的实现方式,并提供完整代码示例。

Kafka 核心 API 概述

Kafka 的四类核心 API 分别面向不同场景:

API 类型 作用描述
Producer API 用于生产者发送消息到 Kafka 集群,支持自定义分区策略、消息压缩等特性。
Consumer API 用于消费者从 Kafka 集群拉取消息,支持消费组管理、偏移量控制等功能。
Streams API 用于构建流处理应用,实现对实时数据流的转换、聚合等操作。
Connect API 用于连接 Kafka 与外部系统(如数据库、文件系统),实现数据导入 / 导出。

本文重点介绍基于 AdminClient 的主题管理操作,需引入以下依赖:

1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.3.1</version> <!-- 版本可根据实际需求调整 -->
</dependency>
</dependencies>

主题管理实践

初始化 AdminClient

所有主题操作均需通过 AdminClient 完成,其初始化需要指定 Kafka 集群的 bootstrap 服务器地址:

阅读全文 »

Kafka 生产者 API 详解与实践

Kafka 生产者(Producer)是消息的发送端,负责将业务数据发送到 Kafka 集群。通过 Kafka 提供的 Producer API,我们可以灵活配置生产者行为,支持同步 / 异步发送、自定义分区策略、消息压缩等功能。本文将详细介绍生产者的实现步骤、核心配置及不同发送方式的代码示例

生产者核心概念与配置

核心配置参数

创建生产者时,需通过 Properties 对象配置关键参数,其中必选参数有三个:

参数名 作用 示例值
bootstrap.servers 指定 Kafka 集群地址(多个用逗号分隔) localhost:9092
key.serializer 消息键(Key)的序列化类(需实现 Serializer 接口) org.apache.kafka.common.serialization.StringSerializer
value.serializer 消息值(Value)的序列化类 org.apache.kafka.common.serialization.StringSerializer

常用可选参数(参考 ProducerConfig 类):

参数名 作用 默认值
acks 消息确认级别(0:不确认;1:Leader 确认;-1/all:Leader + 所有 ISR 副本确认) 1
retries 发送失败后的重试次数 0
batch.size 批次大小(达到该值后批量发送,单位:字节) 16384(16KB)
linger.ms 批处理等待时间(若未达 batch.size,超时后也会发送) 0(立即发送)
buffer.memory 发送缓冲区大小(消息暂存此处等待发送) 33554432(32MB)
compression.type 消息压缩算法(none/gzip/snappy/lz4) none

生产者工作原理

Kafka 生产者发送消息的流程如下:

阅读全文 »

Kafka 消费者 API 详解与实践

Kafka 消费者(Consumer)是消息的接收端,负责从 Kafka 集群拉取并处理消息。与生产者相比,消费者的核心挑战在于可靠地消费消息(避免丢失或重复)、高效地分配分区负载以及灵活地管理消费位置。本文将详细解析 Kafka 消费者 API 的使用方法,包括配置、订阅方式、偏移量管理及多线程消费等关键场景。

消费者核心配置与初始化

必选配置参数

创建消费者时,需通过 Properties 配置以下核心参数:

参数名 作用 示例值
bootstrap.servers Kafka 集群地址 localhost:9092
group.id 消费者组 ID(同一组内的消费者共同消费主题,避免重复) order-consumer-group
key.deserializer 消息键(Key)的反序列化类 org.apache.kafka.common.serialization.StringDeserializer
value.deserializer 消息值(Value)的反序列化类 org.apache.kafka.common.serialization.StringDeserializer

关键可选配置

参数名 作用 默认值
enable.auto.commit 是否自动提交偏移量 true(自动提交)
auto.commit.interval.ms 自动提交偏移量的间隔(毫秒) 5000
auto.offset.reset 偏移量无效时的重置策略(earliest:从最早消息开始;latest:从最新消息开始) latest
fetch.min.bytes 拉取消息的最小字节数(不足时等待) 1
fetch.max.wait.ms 拉取消息的最大等待时间(毫秒) 500
max.poll.records 一次 poll() 调用返回的最大消息数 500

初始化消费者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.Properties;

public class KafkaConsumerDemo {
private static KafkaConsumer<String, String> initConsumer() {
Properties props = new Properties();
// 必选配置
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "test-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

// 可选配置:关闭自动提交,使用手动提交
props.put("enable.auto.commit", "false");
// 偏移量无效时从最早消息开始消费
props.put("auto.offset.reset", "earliest");

return new KafkaConsumer<>(props);
}
}

订阅主题的四种方式

Kafka 提供了灵活的主题订阅方式,支持按主题名、正则表达式订阅,还可指定重平衡监听器。

按主题名订阅(基础方式)

通过 subscribe(Collection<String> topics) 订阅一个或多个主题:

阅读全文 »

Spring 集成 Kafka 详解:生产者、消费者与监听机制

Spring Kafka 是 Spring 生态对 Kafka 的集成封装,简化了 Kafka 生产者和消费者的配置与使用。它通过注解驱动、模板类(KafkaTemplate)和监听容器(MessageListenerContainer),实现了与 Spring 应用的无缝对接。本文将详细介绍 Spring Kafka 的核心组件、生产者 / 消费者实现及监听器生命周期管理。

Spring Kafka 核心组件

Spring Kafka 的设计遵循 Spring 一贯的 “模板 + 注解” 风格,核心组件包括:

组件 作用描述
KafkaTemplate 生产者模板类,封装了 Kafka 生产者 API,提供同步 / 异步发送消息的方法。
@KafkaListener 消费者注解,标注在方法上即可监听指定主题,自动接收并处理消息。
MessageListenerContainer 消息监听容器,管理消费者线程和生命周期,有单线程(KafkaMessageListenerContainer)和多线程(ConcurrentMessageListenerContainer)两种实现。
KafkaListenerEndpointRegistry 监听器容器的注册表,用于控制监听器的启动、暂停、恢复等生命周期操作。
ConsumerFactory/ProducerFactory 消费者 / 生产者工厂,负责创建 Kafka 消费者 / 生产者实例,封装配置参数。

环境配置

引入依赖

在 Maven 项目中添加 spring-kafka 依赖(需与 Kafka 版本兼容,如 Kafka 2.3.x 对应 Spring Kafka 2.3.x):

阅读全文 »