【2024项目实训】消息中间件篇-Kafka

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的零拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值