Apache Kafka 4.0:简化部署、提升性能

Apache Kafka 的最新版本 4.0 于 2025 年 3 月 18 日发布,带来了多项重要的新能力和改进。以下是其中一些关键特性:

1. 无 ZooKeeper 模式(KRaft 模式)

  • 简化部署和管理:Kafka 4.0 默认运行在 KRaft 模式下,这意味着它不再需要 Apache ZooKeeper。这种变化使得部署和管理变得更简单,降低了运营复杂性,提高了可扩展性,并简化了管理任务。

2. 新消费者组协议(KIP-848)

  • 提高消费者组性能:引入了一种新的消费者组协议,旨在显著改善重新平衡性能。这种优化通过将逻辑转移到代理端,减少了停机时间和延迟,提高了消费者组的可靠性和响应速度,尤其是在大规模部署中。

3. 队列功能(KIP-932)

  • 支持传统队列语义:提供了对传统队列语义的支持,允许多个消费者协同处理同一个分区。这扩展了 Kafka 的适用范围,使其成为更通用的消息平台,特别适用于需要点对点消息模式的场景。

4. Java 版本要求

  • Java 版本升级:Kafka 客户端和 Kafka Streams 需要 Java 11,而 Kafka 代理、Connect 和工具现在需要 Java 17。

5. API 更新

  • 简化平台:删除了至少 12 个月前被废弃的 API,以简化平台并鼓励采用新功能。

示例代码:使用 Kafka 4.0 的 KRaft 模式

以下是一个简单的示例,展示如何在 KRaft 模式下创建 Kafka 主题:

java 复制代码
java
import org.apache.kafka.clients.admin.AdminClient;
import org.apache.kafka.clients.admin.CreateTopicsResult;
import org.apache.kafka.clients.admin.NewTopic;

import java.util.Collections;
import java.util.Properties;

public class KafkaTopicCreator {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("acks", "all");

        AdminClient adminClient = AdminClient.create(props);

        NewTopic newTopic = new NewTopic("my-topic", 1, (short) 1);
        CreateTopicsResult result = adminClient.createTopics(Collections.singleton(newTopic));

        System.out.println("Topic created: " + result.all().get());
    }
}

示例代码:使用新消费者组协议

以下是使用新消费者组协议的基本示例:

arduino 复制代码
java
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.StringDeserializer;

import java.time.Duration;
import java.util.Collections;
import java.util.Properties;

public class KafkaConsumerExample {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(ConsumerConfig.GROUP_ID_CONFIG, "my-group");
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());

        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
        consumer.subscribe(Collections.singleton("my-topic"));

        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
            for (ConsumerRecord<String, String> record : records) {
                System.out.println(record.value());
            }
            consumer.commitSync();
        }
    }
}

队列功能示例

队列功能允许多个消费者处理同一个分区,这在需要点对点消息模式的场景中尤其有用。以下是一个基本的示例,展示如何在 Kafka 中实现类似队列的行为:

arduino 复制代码
java
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.StringDeserializer;

import java.time.Duration;
import java.util.Collections;
import java.util.Properties;

public class KafkaQueueExample {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(ConsumerConfig.GROUP_ID_CONFIG, "my-queue-group");
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());

        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
        consumer.subscribe(Collections.singleton("my-queue-topic"));

        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
            for (ConsumerRecord<String, String> record : records) {
                System.out.println(record.value());
                // 处理消息后,手动确认以避免重复消费
                consumer.commitSync(Collections.singleton(record));
            }
        }
    }
}

这些示例展示了如何在 Kafka 4.0 中利用新特性进行开发。

相关推荐
念何架构之路1 分钟前
Go reflect包值操作 Value 的读写、可设置性与 interface 布局
开发语言·后端·golang
小林ixn4 分钟前
用 FastAPI + SQLAlchemy 从零手搓一个博客系统:一套能落地、能讲清楚的 RESTful 后端
后端·python·fastapi
不识君12 分钟前
esl-client 2.0.0 发布:Java 项目接入 FreeSWITCH,从引入到使用
spring boot·后端·开源
牧瀬クリスだ28 分钟前
Redis五大数据类型全解析:从入门到实战
java·数据库·redis·后端·缓存
j7~36 分钟前
IT 面试指南:从准备到 Offer 的完整路线图(校招 / 实习通用
面试·职场和发展·秋招·春招·实习面试·it后端
Rain的Java大神之路1 小时前
北漂 13 年,我把 Java 家底钉成了这张知识图谱(全站免费)
java·后端·程序员
u1301301 小时前
GitHub 热榜项目:日榜(2026-10-25)
人工智能·github
Amos_Web1 小时前
通过 Rspack 源码学 Rust(一):`mod`、`pub` 与 `use crate`/`use super`
后端
张彦峰ZYF1 小时前
拆得开不等于该拆开:微服务与模块化单体的边界判据、规模阈值、团队适配与一致性代价
后端·微服务·边界是否稳定·扩展天花板是否到顶·有无小组能独立值班·独立部署的自由会否被用上·这一刀是否切断不可降级的不变量
小淮AI1 小时前
面试前 48 小时,怎样练表达和复盘:一份个人准备记录
面试·职场和发展