01-Kafka-消息不丢失
与RabbitMQ情况类似,但是解决方案略有不同。
1、生产者的消息丢失
对于生产者来说,我们采用异步的消息发送
offset偏移量,partition分区,topic
解决方案:
2、消息存储丢失
Kafka集群:只有一个leader,可能有多个follower
解决方案:发送确认机制acks
如果想要数据不丢失,可以选择acks = all,但是它的性能很低;
一般在具体项目中,至少要保证消息不丢失,即acks = 1。
3、消费者从Brocker接收消息丢失
Topic 划分为多个分区
如上图所示topic1 存在四个分区p1-p4
其中消费者1消费p1、p2
消费者2消费p3 消费者3消费p4
那么在这个过程中哪里会丢失消息呢?
对于偏移量的解释:
如上图,p1分区中我们已经消费了0-4的消息,那么此时的偏移量就是5,所以我们继续从5获取消息。
如果出现了重平衡的情况,可能会重复消费或丢失数据。
重平衡后:
即:如果消费者2消费到5,但是只提交到了3,中间的消息就会被重复消费。
产生消息丢失的原因:消费者自动提交偏移量
解决方法:
项目中多数采用同步+异步组合提交。
方法:在消费完消息后,设置异步提交;
在finally中,设置同步提交。
面试题总结:
02-Kafka-消费的顺序性
topic分区中的消息只能由一个消费者进行消费,所以消息肯定是按顺序处理的。
现在我们对一个topic只设置一个partition就可以达成顺序消费消息了。
解决代码:
key可以决定消息存储在哪个分区,我们只需要将key设置为相同的值就可以了。
面试题总结:
03-Kafka-高可用机制
实现方案:
1、集群模式
Kafka集群是由多个broker组成的,而每一个broker都是一个Kafka的实例
2、分区备份机制(类似于RabbitMQ镜像集群)
保证了系统的容错性和高可用性
当leader宕机,我们先选择ISR副本
ISR副本全部宕机的话,我们再选择普通副本。
ISR副本通过同步复制保存,普通副本通过异步复制保存。
这既保证了数据的高可用性和容错性,也保证了系统的性能。
04-Kafka-数据清理机制
本节内容:
.index 索引文件
.log 数据文件
.timeindex 时间索引文件
对于topic中的分区,他们也是分段的 segment。
为什么要分段?
数据清理原则:
1、时间 2、存储
05-Kafka-高性能设计
以上是Kafka高性能的支撑
重点:零拷贝
零拷贝实现了 1、减少上下文切换 2、减少数据拷贝
首先看kafka保存消息的过程:
1、生产者发送消息,从linux的用户空间发起,但是用户空间没有权限对硬件进行操作
2、因此把数据拷贝到内核空间中去处理,内核空间中存在页缓存,消息到达一定的批次后,批量发送给磁盘
3、将数据写入到磁盘上
消费过程:
1、先到页缓存中找
2、在磁盘中读取,放到页缓存中
3、从页缓存拷贝到kafka中
4、数据从kafka到socket缓冲区(内核空间)
5、从缓冲区再到网卡(硬件)
6、网卡传送给消费者
你看,在这个过程中经过了4次数据拷贝,性能不好。
所以kafka内部选择使用了零拷贝机制,减少了数据拷贝的次数。
系统直接从页缓存中把数据拷贝给了网卡
只拷贝了两次
我感觉
这里的零拷贝说是kafka的零拷贝