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

相关推荐
郝学胜-神的一滴2 小时前
Leetcode 969 煎饼排序✨:翻转间的数组排序艺术
数据结构·c++·算法·leetcode·面试
NocoBase8 小时前
【2.0 教程】第 1 章:认识 NocoBase ,5 分钟跑起来
数据库·人工智能·开源·github·无代码
颜酱9 小时前
DFS 岛屿系列题全解析
javascript·后端·算法
发现一只大呆瓜10 小时前
React-彻底搞懂 Redux:从单向数据流到 useReducer 的终极抉择
前端·react.js·面试
零雲10 小时前
java面试:了解抽象类与接口么?讲一讲它们的区别
java·开发语言·面试
小码哥_常10 小时前
Java后端定时任务抉择:@Scheduled、Quartz、XXL - Job终极对决
后端
uzong10 小时前
Skill 被广泛应用,到底什么是 Skill,今天详细介绍一下
人工智能·后端·面试
小码哥_常10 小时前
Kafka平替!SpringBoot+Redis Stream+消费组打造极致消息队列
后端
发现一只大呆瓜11 小时前
React-路由监听 / 跳转 / 守卫全攻略(附实战代码)
前端·react.js·面试
IT_陈寒12 小时前
Redis缓存击穿:3个鲜为人知的防御策略,90%开发者都忽略了!
前端·人工智能·后端