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 中利用新特性进行开发。

相关推荐
qianmoQ3 小时前
GitHub 趋势日报 (2025年05月12日)
github
炒空心菜菜4 小时前
SparkSQL 连接 MySQL 并添加新数据:实战指南
大数据·开发语言·数据库·后端·mysql·spark
蜗牛沐雨6 小时前
Rust 中的 `PartialEq` 和 `Eq`:深入解析与应用
开发语言·后端·rust
Python私教6 小时前
Rust快速入门:从零到实战指南
开发语言·后端·rust
秋野酱7 小时前
基于javaweb的SpringBoot爱游旅行平台设计和实现(源码+文档+部署讲解)
java·spring boot·后端
小明.杨7 小时前
Django 中时区的理解
后端·python·django
有梦想的攻城狮7 小时前
spring中的@Async注解详解
java·后端·spring·异步·async注解
qq_12498707537 小时前
原生小程序+springboot+vue医院医患纠纷管理系统的设计与开发(程序+论文+讲解+安装+售后)
java·数据库·spring boot·后端·小程序·毕业设计
lybugproducer8 小时前
浅谈 Redis 数据类型
java·数据库·redis·后端·链表·缓存
焚 城8 小时前
.NET8关于ORM的一次思考
后端·.net