kafka 3.x

背景

官网: https://kafka.apache.org

Kafka 传统定义: Kafka 是一个分布式的基于发布/订阅模式的消息队列(MessageQueue),主要应用于大数据实时处理领域。

发布/订阅: 消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息分为不同的类别,订阅者只接收感兴趣的消息。

Kafka 最新定义: Kafka 是一个开源的分布式事件流平台(Event StreamingPlatform),被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。

传统的消息队列的主要应用场景

包括: 缓存/消峰、解耦和异步通信。

缓冲/消峰:有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。

解耦:允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

异步通信:允许用户把一个消息放入队列,但并不立即处理它,然后在需要的时候再去处理它们。

消息队列的两种模式

(1) 点对点模式
消费者主动拉取数据,消息收到后清除消息

(2) 发布/订阅模式
可以有多个 topic 主题(浏览、点赞、收藏、评论等)
消费者消费数据之后,不删除数据
每个消费者相互独立,都可以消费到数据

基础架构

发送流程

Kafka分区好处

(1)便于合理使用存储资源,每个Partition在一个Broker上存储,可以把海量的数据按照分区切割成一块一块数据存储在多台Broker上。合理控制分区的任务,可以实现负载均衡的效果。
(2)提高并行度,生产者可以以分区为单位发送数据;消费者可以以分区为单位进行消费数据。

生产者发送消息的分区策略

(1) 指明 partition 的情况下,直接将指明的值作为 partition 值;例如 partition=0,所有数据写入分区O
(2) 没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition 数进行取余得到 partition 值;
例如:key1 的 hash 值=5,key2 的 hash 值=6 ,topic 的 partition 数=2,那么key1对应的value1写入1号分区,key2对应的value2写入0号分区。
(3)既没有 partition 值又没有 key 值的情况下,Kafka 采用 Sticky Partition(黏性分区器),会随机选择一个分区,并尽可能一直使用该分区,待该分区的 batch 已满或者已完成,Kafka 再随机一个分区进行使用(和上一次的分区不同)。
例如:第一次随机选择0号分区,等0号分区当前批次满了(默认16k)或者linger.ms设置的时间到 Kafka再随机一个分区进行使用(如果还是0会继续随机)。

生产者如何提高吞吐量

batch.size: 批次大小,默认16k
linger.ms: 等待时间,修改为 5-100ms

Kafka事务原理

开启事务,必须开启幂等性

数据乱序

kafka 在1.x版本之前保证数据单分区有序,条件如下:
max.in.flight.requests.per.connection=1 (不需要考虑是否开启幂等性)。

kafka在1.x及以后版本保证数据单分区有序,条件如下:
(1)未开启幂等性
max.in.flight.requests.per.connection需要设置为1。
(2)开启幂等性
max.in.flight.requests.per.connection需要设置小于等于5少
原因说明:因为在 kafka1.x 以后,启用幂等后,kafka服务端会缓存 producer 发来的最近5个request的元数据,故无论如何,都可以保证最近5个request的数据都是有序的。

Kafka Broker总体工作流程

Kafka 副本

(1) Kafka 副本作用: 提高数据可靠性。
(2) Kafka 默认副本1个,生产环境一般配置为2个,保证数据可靠性;太多副本会增加磁盘存储空间,增加网络上数据传输,降低效率。
(3) Kafka 中副本分为: Leader 和 Follower。Kafka 生产者只会把数据发往 Leader,然后 Follower 找 Leader 进行同步数据。
(4) Kafka 分区中的所有副本统称为 AR (Assigned Repllicas)。
AR=ISR + OSR
ISR,表示和 Leader 保持同步的 Follower 集合。如果 Follower 长时间未向 Leader 发送通信请求或同步数据,则该 Follower 将被踢出 ISR 。该时间阈值由 replica.lag.time.max.ms 参数设定,默认30s。Leader 发生故障之后,就会从 ISR 中选举新的 Leader。
OSR,表示 Follower 与 Leader 副本同步时,延迟过多的副本。

Follower 故障处理细节

Leader故障处理细节

Kafka 文件存储机制

可靠性总结

acks=0,生产者发送过来数据就不管了,可靠性差,效率高;
acks=1,生产者发送过来数据 Leader 应答,可靠性中等,效率中等;
acks=-1,生产者发送过来数据 Leader 和 ISR 队列里面所有 Follwer 应答,可靠性高,效率低;
在生产环境中,acks=0 很少使用; acks=1,一般用于传输普通日志,允许丢个别数据; acks=-1,一般用于传输和钱相关的数据,对可靠性要求比较高的场景。

数据完全可靠条件:
ACK级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2

自动提交offset

为了使我们能够专注于自己的业务逻辑,Kafka 提供了自动提交 offset 的功能。自动提交 offset 的相关参数:
enable.auto.commit: 是否开启自动提交 offset 功能,默认是true
auto.commit.interval.ms: 自动提交 offset 的时间间隔,默认是5s

posted @   klvchen  阅读(78)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示