Kafka从入门到精通

本文详细介绍了Kafka的基础知识,包括MQ的作用、Kafka架构、启动配置、命令行操作,以及生产者、Broker和消费者的工作原理。重点讨论了Kafka的开发入门,如异步和同步发送消息、分区策略、数据可靠性和顺序性。同时,涵盖了Kafka的监控、集成外部系统(如Flume、Flink和Spark)以及调优策略。
摘要由CSDN通过智能技术生成

一. MQ基础知识

1. 常见的MQ

Kafka, ActiveMQ, RabbitMQ, RocketMQ

在大数据场景下,主要使用Kafka,在javaee中主要采用ActiveMQ, RabbitMQ, RocketMQ

2. MQ作用

(1)削峰

(2)解耦

(3)异步

3. 消息队列的模式

(1)点对点模式

(2)发布订阅模式

二. Kafka基础架构

1. 在同一个消费者组中(每条消息只能被该组中的一个消费者消费),每个分区只能由一个固定消费者进行处理,否则后续很难维护;

2. 分区有leader和follower之分,读写只在leader副本上进行,follower副本(HA)只负责数据同步;

3. zk记录集群节点状态,记录副本的leader信息,leader选举。由于zk逐渐成为了kafka的瓶颈,去除zk是后续的方向

三. Kafka开发入门

1. 启动配置

(1)broker.id:集群中每个节点的唯一编号,不能重复

(2)log.dir:日志存储目录

(3)zookeeper.connect:zk连接信息,而且建议创建指定目录存放,否则kafka信息会打散到各个地方

2. 命令行

(1)topic:

1)create: 1个分区,3个副本

bin/kafka-topics.sh --bootstrap-server server01:8081 --topic demo --create --partitions 1 --replication-factor 3

2)list:

bin/kafka-topics.sh --bootstrap-server server01:8081 --list

3)describe:

bin/kafka-topics.sh --bootstrap-server server01:8081 --describe

4)alter: 将分区数改成3,分区数只能增加,因为如果减少的话,合并后的分区无法确定消费者的offset。副本数无法通过命令行进行修改

bin/kafka-topics.sh --bootstrap-server server01:8081 --alter --partition 3

(2)producer:

bin/kafka-console-producer.sh --bootstrap-server server01:8081 --topic demo

(3)consumer:

bin/kafka-console-consumer.sh --bootstrap-server server01:8081 --topic demo --from-beginning

3. Kafka生产者

3.1 原理

    涉及两个线程:main线程和sender线程,main线程中创建了一个双端队列RecordAccumulator,main线程将消息发送给RecordAccumulator,RecordAccumulator中的消息达到指定大小或者等待指定时长后,通过sender线程从RecordAccumulator中将消息取出来发送到Kafka broker。

   发送后,默认可以最多有5个批次的数据不进行应答,超过后不再向kafka发送数据。

3.2 Kafka异步发送消息

异步发送是指:

    外部数据发送到kafka client的RecordAccumulator队列中就算发送完毕,对后续的数据从RecordAccumulator队列发送到Kafka broker不再关心。

同步发送是指:

    外部数据发送到kafka broker之后才算完成,才会发送下一批数据。

代码:

1. 依赖

org.apache.kafka:kafka-clients:3.0.0

2. 逻辑代码

(1)普通异步发送代码

 (2)带回调方法的异步发送代码

回调方法获取到的返回的元数据信息是从RecordAccumulator中返回的。

3.3 Kafka同步发送消息 

3.4 生产者分区 

1. 分区好处

 2. 分区策略

1)默认分区器:DefaultPartitioner 

3. 自定义分区策略

1)编写自定义分区器

2)将自定义分区器注册到properties中

 

3.5 提高生产者吞吐量 

    batch.size: 批次大小,默认16K,可以修改为32K;

    linger,ms: 等待时间,修改为5-100ms;

    compression.type: 压缩,例如snappy;

    RecordAccumulator: 缓冲区大小,修改为64M。

    注意吞吐量与消息延时的权衡。

3.6 生产者数据可靠性 

 

代码:

3.7 生产者数据重复性 

1. 数据传递语义

 (1)幂等性原理

开发方法:enable.idempotence,默认为true,关闭时设置为false

(2)生产者事物

 代码:

3.8 生产者数据有序性 

 

3.9 生产者数据乱序问题解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值