Kafka核心概念与架构解析

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)(进阶篇)、(架构篇)、《解密程序员的思维密码——沟通、演讲、思考的实践》作者、清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

📙不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

Java程序员廖志伟

💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

优快云

🌟 Kafka知识点

🍊 Kafka概述

Apache Kafka是一个分布式流处理平台,它能够处理高吞吐量的数据流,广泛应用于日志收集、事件源、流处理等领域。Kafka以其高吞吐量、持久性、可扩展性和容错性而著称。

🎉 Kafka核心概念

以下是对Kafka核心概念的详细描述:

概念技术原理应用场景优势与局限实际案例
Topic消息分类,类似于数据库中的表,用于将消息进行分类存储日志收集、事件源、流处理等高吞吐量、可扩展性、持久性和容错性日志收集、实时分析、消息队列等
PartitionTopic的分区,用于并行处理消息,提高吞吐量提高吞吐量、实现负载均衡需要考虑分区策略、分区数等消息队列、实时分析等
BrokerKafka集群中的节点,负责存储数据、处理请求等分布式存储、负载均衡、容错性需要考虑集群规模、节点配置等分布式日志收集、实时分析等
Producer生产者,负责向Kafka发送消息日志收集、事件源等高吞吐量、可扩展性日志收集、实时分析等
Consumer消费者,负责从Kafka读取消息日志收集、事件源、流处理等高吞吐量、可扩展性日志收集、实时分析、消息队列等

🎉 Kafka架构

Kafka采用分布式架构,由多个Broker组成,每个Broker负责存储一部分数据。生产者和消费者通过Zookeeper进行协调,实现分布式系统的负载均衡和容错性。

🍊 Kafka安装与配置

🎉 安装Kafka

  1. 下载Kafka安装包。
  2. 解压安装包到指定目录。
  3. 配置环境变量。

🎉 配置文件解析

Kafka的配置文件主要包括server.propertiesproducer.properties等。

  • server.properties:配置Broker的参数,如端口、日志目录、集群配置等。
  • producer.properties:配置生产者的参数,如消息格式、压缩方式、重试策略等。

🎉 集群搭建

  1. 启动Zookeeper集群。
  2. 启动Kafka集群。

🍊 Kafka生产者

🎉 生产者配置

生产者配置主要包括消息格式、压缩方式、重试策略等。

配置项说明示例
key.serializer消息键的序列化方式org.apache.kafka.common.serialization.StringSerializer
value.serializer消息值的序列化方式org.apache.kafka.common.serialization.StringSerializer
bootstrap.serversKafka集群地址localhost:9092
retries重试次数3
batch.size批量发送大小16384
linger.ms等待时间100

🎉 生产者API使用

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

Producer<String, String> producer = new KafkaProducer<>(props);

producer.send(new ProducerRecord<String, String>("test", "key", "value"));
producer.close();

🎉 异常处理

生产者在发送消息时可能会遇到各种异常,如连接异常、序列化异常等。需要根据实际情况进行处理。

🍊 Kafka消费者

🎉 消费者配置

消费者配置主要包括消息格式、消费模式、分区分配策略等。

配置项说明示例
bootstrap.serversKafka集群地址localhost:9092
group.id消费者组IDtest-group
key.deserializer消息键的反序列化方式org.apache.kafka.common.serialization.StringDeserializer
value.deserializer消息值的反序列化方式org.apache.kafka.common.serialization.StringDeserializer
auto.offset.reset消费者启动时偏移量重置策略earliest

🎉 消费者API使用

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");

Consumer<String, String> consumer = new KafkaConsumer<>(props);

while (true) {
    ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
    for (ConsumerRecord<String, String> record : records) {
        System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
    }
}
consumer.close();

🎉 消费者组

消费者组是一组消费者,它们共同消费同一个Topic的消息。消费者组内部会进行负载均衡,确保每个消费者消费的消息量大致相等。

🍊 Kafka主题管理

🎉 创建主题

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

AdminClient adminClient = AdminClient.create(props);
NewTopic newTopic = new NewTopic("test-topic", 1, (short) 1);
adminClient.createTopics(Arrays.asList(newTopic));
adminClient.close();

🎉 删除主题

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

AdminClient adminClient = AdminClient.create(props);
adminClient.deleteTopics(Arrays.asList("test-topic"));
adminClient.close();

🎉 修改主题

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

AdminClient adminClient = AdminClient.create(props);
ModifyTopicConfig modifyTopicConfig = new ModifyTopicConfig();
modifyTopicConfig.setPartitions(2);
adminClient.modifyTopic("test-topic", modifyTopicConfig);
adminClient.close();

🍊 Kafka消息存储与索引

🎉 消息存储机制

Kafka使用日志文件存储消息,每个日志文件包含多个Segment,Segment由多个Log Entry组成。

🎉 索引机制

Kafka使用索引文件存储Segment的起始位置,以便快速定位消息。

🎉 消息持久化

Kafka将消息写入磁盘,并定期进行压缩,以提高存储效率和性能。

🍊 Kafka事务

🎉 事务概述

Kafka事务用于确保消息的原子性,即要么全部成功,要么全部失败。

🎉 事务API使用

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

KafkaProducer<String, String> producer = new KafkaProducer<>(props);
TransactionManager transactionManager = producer.initTransactions();

try {
    transactionManager.beginTransaction();
    producer.send(new ProducerRecord<String, String>("test", "key", "value"));
    transactionManager.commitTransaction();
} catch (KafkaException e) {
    transactionManager.abortTransaction();
}
producer.close();

🎉 事务状态管理

Kafka事务状态包括未提交、提交、失败等。可以通过Kafka命令行工具或API查询事务状态。

🍊 Kafka连接器

🎉 连接器概述

Kafka连接器是一种用于连接Kafka与其他系统的工具,如数据库、消息队列等。

🎉 连接器配置

连接器配置主要包括源配置、目标配置、转换规则等。

🎉 连接器使用

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

SourceConnector sourceConnector = new SourceConnector();
sourceConnector.start(props);
sourceConnector.stop();

🍊 Kafka监控与运维

🎉 监控工具

Kafka提供JMX、Prometheus、Grafana等监控工具,用于监控集群状态、性能指标等。

🎉 运维策略

  1. 定期检查集群状态。
  2. 监控性能指标,如吞吐量、延迟等。
  3. 定期备份数据。
  4. 处理故障。

🎉 故障排查

  1. 查看日志文件。
  2. 使用监控工具分析性能指标。
  3. 根据故障现象进行排查。

🍊 Kafka与Spring Boot集成

🎉 集成概述

Spring Boot集成Kafka可以简化开发过程,提高开发效率。

🎉 生产者集成

@Configuration
public class KafkaProducerConfig {

    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() {
        return new KafkaTemplate<>(kafkaProducer());
    }

    @Bean
    public ProducerFactory<String, String> kafkaProducer() {
        Map<String, Object> props = new HashMap<>();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        return new DefaultKafkaProducerFactory<>(props);
    }
}

🎉 消费者集成

@Configuration
public class KafkaConsumerConfig {

    @Bean
    public ConsumerFactory<String, String> kafkaConsumer() {
        Map<String, Object> props = new HashMap<>();
        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");
        return new DefaultKafkaConsumerFactory<>(props);
    }

    @Bean
    public Consumer<String, String> kafkaConsumer(ConsumerFactory<String, String> kafkaConsumer) {
        return kafkaConsumer.createConsumer();
    }
}

🍊 Kafka与Spring Cloud集成

🎉 集成概述

Spring Cloud集成Kafka可以实现服务注册与发现、负载均衡等功能。

🎉 服务注册与发现

@Configuration
@EnableDiscoveryClient
public class KafkaDiscoveryClientConfig {

    @Bean
    public KafkaDiscoveryClient autoDiscoverClient(DiscoveryClient discoveryClient) {
        return new KafkaDiscoveryClient(discoveryClient);
    }
}

🎉 负载均衡

@Configuration
public class KafkaLoadBalancerConfig {

    @Bean
    public LoadBalancerClient loadBalancerClient() {
        return new KafkaLoadBalancerClient();
    }
}

🍊 Kafka与大数据生态圈

🎉 Kafka与Hadoop

Kafka可以与Hadoop生态圈中的工具进行集成,如Hive、Spark等。

🎉 Kafka与Spark

Kafka可以与Spark进行集成,实现实时数据处理和分析。

🎉 Kafka与Flink

Kafka可以与Flink进行集成,实现实时数据处理和分析。

优快云

博主分享

📥博主的人生感悟和目标

Java程序员廖志伟

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。

面试备战资料

八股文备战
场景描述链接
时间充裕(25万字)Java知识点大全(高频面试题)Java知识点大全
时间紧急(15万字)Java高级开发高频面试题Java高级开发高频面试题

理论知识专题(图文并茂,字数过万)

技术栈链接
RocketMQRocketMQ详解
KafkaKafka详解
RabbitMQRabbitMQ详解
MongoDBMongoDB详解
ElasticSearchElasticSearch详解
ZookeeperZookeeper详解
RedisRedis详解
MySQLMySQL详解
JVMJVM详解

集群部署(图文并茂,字数过万)

技术栈部署架构链接
MySQL使用Docker-Compose部署MySQL一主二从半同步复制高可用MHA集群Docker-Compose部署教程
Redis三主三从集群(三种方式部署/18个节点的Redis Cluster模式)三种部署方式教程
RocketMQDLedger高可用集群(9节点)部署指南
Nacos+Nginx集群+负载均衡(9节点)Docker部署方案
Kubernetes容器编排安装最全安装教程

开源项目分享

项目名称链接地址
高并发红包雨项目https://gitee.com/java_wxid/red-packet-rain
微服务技术集成demo项目https://gitee.com/java_wxid/java_wxid

管理经验

【公司管理与研发流程优化】针对研发流程、需求管理、沟通协作、文档建设、绩效考核等问题的综合解决方案:https://download.youkuaiyun.com/download/java_wxid/91148718

希望各位读者朋友能够多多支持!

现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值