Kafka的工作原理

这篇具有很好参考价值的文章主要介绍了Kafka的工作原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Kafka是什么?

Kafka是一个分布式的基于发布/订阅模式的消息队列。分布式消息队列可以看成是将这种先进先出的数据结构独立部署在服务器上,应用程序可以通过远程访问接口使用它。

二、Kafka的工作机制是什么?

1.基本概念

kafka工作原理,kafka,java,分布式

 kafka工作原理,kafka,java,分布式

 

2.消息模型

发布订阅模式:一对多,消费者消费数据之后不会清除消息

一次消息写入多次消费,当然前提是消费者位于不同的消费者组。
kafka工作原理,kafka,java,分布式 

3.存储机制

Kafka的消息是存储在磁盘的,所以数据不易丢失。

kafka工作原理,kafka,java,分布式

 

 4.生产流程

1)主线程首先将业务数据封装成ProducerRecord对象

2)调用send方法将消息放入消息收集器RecordAccumlator中暂存

3)Sender线程将消息信息构成请求

4)执行网络IO的线程从RecordAccumlator中将消息取出并批量发送出去

kafka工作原理,kafka,java,分布式 5.消费流程

Kafka消费者从属于消费者组。消费者组内的消费者订阅的是相同主题,每个消费者接收主题的一部分分区的消息。
kafka工作原理,kafka,java,分布式

 

三、Kafka常见面试题

1.Kafka的多分区多副本机制有什么好处?

 1)Kafka通过将特定topic指定到多个partition,各个partition分布到不同的Broker上,这样能够提供比较好的并发能力。

2)Partition可以指定对应的replica数,这也极大地提高了消息存储的安全性和容灾能力。

2.Kafka如何实现高效读写?

1)顺序写入磁盘:在日志文件尾部追加,顺序写入且不允许修改。

2)页缓存:每次从磁盘中加载一页的数据到内存中这样可以减少IO次数。

3)零拷贝技术:只用将磁盘中的数据复制到页面缓存中一次,然后将数据从页面缓存中发送到网络中,避免了重复复制操作。

常规数据交互模式:

kafka工作原理,kafka,java,分布式

 零CPU拷贝模式:

splice系统调用可以在内核缓冲区和socket缓冲区之间建立管道来传输数据,避免了两者之间的CPU拷贝操作。

 kafka工作原理,kafka,java,分布式

 3.为什么消费者用pull模式从broker中读取数据?

 pull模式可以根据消费者的能力以适当的消费速率消费消息,避免造成网络拥塞。pull模式的不足之处在于,如果kafka没有数据,消费者会陷入空循环中,针对这一点,Kafka的消费者会在消费时传入timeout参数,如果当前Kafka中没有数据,消费者会等待一个timeout时长再返回。

4.Kafka如何保证消息的顺序消费呢?

1)当partition只有一个时可以做到全局有序,Kafka只能保证分区内部消息消费的有序性。

2)在发送消息时指定key和postion,从而可以保证间隔有序。

5.Kafka如何保证消息不丢失?

1)生产者确认

topic的每个partition收到producer发送的数据后,都需要向producer发送ack,如果producer收到ack,就会进行下一轮发送,否则重新发送数据。

Leader维护了一个动态的ISR(in-sync replica),它是一个保持同步的follower集合。当ISR中的follower完成数据的同步之后,leader就会给follower发送一个ack。如果follower长时间未从leader同步数据,则该follower将被踢出ISR,该时间由阈值replica.lag.max.ms参数设定。Leader发生故障后,ISR将会重新选举新的Leader。

Kafka为用户提供了三种可靠性级别,用户可根据对可靠性和延迟的要求权衡。

ack=0,生产者在成功写入消息之前不会等待任何来自服务器的响应,如果出现问题生产者感知不到,但能够以网络支持的最大速度发送消息。

ack=1,默认值,只要集群的首领节点leader收到消息,生产者就会收到一个来自服务器的成功响应。如果消息无法到达首领节点,生产者会收到一个错误响应,为了避免数据丢失,生产者将重发消息。如果收到写成功通知,但首领节点还没来的及同步follower节点就崩溃了,也会造成数据丢失。

ack=-1,只有当所有所有参与复制的节点收到消息后,生产者会收到一个来自服务器的成功确认。如果在follower同步完成之后,broker返回ack之前,leader发生故障,那么会造成数据重复。

2)消费者确认

一次poll会拉取一批消息,对应的消费位移是一个区间,如果是拉取信息之后进行位移提交,在消费中间中间发生了故障,会造成消息丢失现象。如果是消费完成之后进行位移提交,在消费中间发生了故障,会造成重复消费现象。

将位移提交方式改为手动提交,即每次消费完成之后提交,可以避免因为消费未完成出现异常导致的消息丢失。

6.Kafka如何保证消息不重复消费?

自动提交offset,在下一次提交位移之前消费者崩溃了,那么又会从上一次位移提交的地方重新开始消费,这样便造成了重复消费。

使用异步提交方式,此时可以设置一个递增的序号来维护异步提交的顺序,每次位移提交之后就增加对应的序号值。在遇到位移提交失败需要重试的时候,可以检查所需要提交的位移和序号值的大小,如果前者的值大于后者,则说明有更大的位移已经提交了,不需要进行本次重试;如果前者等于后者,则进行重试。除非编码错误,否则不会出现前者大于后者的情况。

7.broker宕机后如何保证副本间数据的一致性?

kafka工作原理,kafka,java,分布式

 1)follower发生故障后,会被临时踢出ISR,待该follower恢复后,follower会读取本地磁盘记录的HW,并将log文件高于HW的部分截取掉,从HW开始向leader进行同步,等该follower大于partition的HW时,即follower追上leader时,就可以重新加入ISR了。

2)leader发生故障后,会从ISR重新选举一个新的leader,为了保证多个副本之间数据的一致性,所有follower会先将各自的log文件高于HW的部分截取掉,重新从新的leader同步数据。

注意,这只能保证副本之间数据的一致性,不能保证数据不丢失或者不重复。

8.Zookeeper在kafka中的作用?

Broker注册:在Zookeeper上有个专门记录broker服务器列表的节点,每个broker启动时,都会在/brokers/ids下创建属于自己的节点,每个broker会将自己的IP地址和端口信息记录到节点上去。

Topic注册:同一个topic的消息会被分成多个分区并分布在多个broker上,这些分区和broker的对应关系也都是Zookeeper在维护,对应到Zookeeper中可能会创建文件/brokers/topics/my-topic/partitions/0,/brokers/topics/my-topic/partitions/1。

负载均衡:为了提供更好的并发能力,Kafka会尽力将同一个topic的partition分布到不同的broker,当Consumer消费的时候,Zookeeper可以根据当前的partition数量和Consumer数量进行动态负载均衡。文章来源地址https://www.toymoban.com/news/detail-721777.html

到了这里,关于Kafka的工作原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式 - 消息队列Kafka:Kafka消费者的分区分配策略

    Kafka 消费者负载均衡策略? Kafka 消费者分区分配策略? 1. 环境准备 创建主题 test 有5个分区,准备 3 个消费者并进行消费,观察消费分配情况。然后再停止其中一个消费者,再次观察消费分配情况。 ① 创建主题 test,该主题有5个分区,2个副本: ② 创建3个消费者CustomConsu

    2024年02月13日
    浏览(47)
  • 分布式 - 消息队列Kafka:Kafka生产者架构和配置参数

    生产者发送消息流程参考图1: 先从创建一个ProducerRecord对象开始,其中需要包含目标主题和要发送的内容。另外,还可以指定键、分区、时间戳或标头。在发送ProducerRecord对象时,生产者需要先把键和值对象序列化成字节数组,这样才能在网络上传输。 接下来,如果没有显式

    2024年02月13日
    浏览(49)
  • 分布式 - 消息队列Kafka:Kafka生产者发送消息的方式

    不管是把Kafka作为消息队列、消息总线还是数据存储平台,总是需要一个可以往Kafka写入数据的生产者、一个可以从Kafka读取数据的消费者,或者一个兼具两种角色的应用程序。 Kafka 生产者是指使用 Apache Kafka 消息系统的应用程序,它们负责将消息发送到 Kafka 集群中的一个或多

    2024年02月13日
    浏览(44)
  • 分布式 - 消息队列Kafka:Kafka消费者和消费者组

    1. Kafka 消费者是什么? 消费者负责订阅Kafka中的主题,并且从订阅的主题上拉取消息。与其他一些消息中间件不同的是:在Kafka的消费理念中还有一层消费组的概念,每个消费者都有一个对应的消费组。当消息发布到主题后,只会被投递给订阅它的每个消费组中的一个消费者

    2024年02月13日
    浏览(45)
  • 分布式 - 消息队列Kafka:Kafka 消费者消费位移的提交方式

    最简单的提交方式是让消费者自动提交偏移量,自动提交 offset 的相关参数: enable.auto.commit:是否开启自动提交 offset 功能,默认为 true; auto.commit.interval.ms:自动提交 offset 的时间间隔,默认为5秒; 如果 enable.auto.commit 被设置为true,那么每过5秒,消费者就会自动提交 poll() 返

    2024年02月12日
    浏览(48)
  • 分布式 - 消息队列Kafka:Kafka消费者分区再均衡(Rebalance)

    01. Kafka 消费者分区再均衡是什么? 消费者群组里的消费者共享主题分区的所有权。当一个新消费者加入群组时,它将开始读取一部分原本由其他消费者读取的消息。当一个消费者被关闭或发生崩溃时,它将离开群组,原本由它读取的分区将由群组里的其他消费者读取。 分区

    2024年02月12日
    浏览(40)
  • 分布式 - 消息队列Kafka:Kafka 消费者消息消费与参数配置

    01. 创建消费者 在读取消息之前,需要先创建一个KafkaConsumer对象。创建KafkaConsumer对象与创建KafkaProducer对象非常相似——把想要传给消费者的属性放在Properties对象里。 为简单起见,这里只提供4个必要的属性:bootstrap.servers、key.deserializer 和 value.deserializer。 ① bootstrap.servers 指

    2024年02月12日
    浏览(45)
  • 分布式 - 消息队列Kafka:Kafka生产者发送消息的分区策略

    01. Kafka 分区的作用 分区的作用就是提供负载均衡的能力,或者说对数据进行分区的主要原因,就是为了实现系统的高伸缩性。不同的分区能够被放置到不同节点的机器上,而数据的读写操作也都是针对分区这个粒度而进行的,这样每个节点的机器都能独立地执行各自分区的

    2024年02月13日
    浏览(54)
  • 分布式应用之Zookeeper和Kafka

    1.定义 2.特点 3.数据结构 4.选举机制 第一次选举 非第一次选举 5.部署 1.概念 中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。 2.消息队列型 3.Web应用型(代理服务器) 1.为什么需要MQ 2.消息队列作用 3.消息队列模式 ①点对

    2024年02月15日
    浏览(45)
  • 分布式 - 消息队列Kafka:Kafka生产者发送消息的3种方式

    不管是把Kafka作为消息队列、消息总线还是数据存储平台,总是需要一个可以往Kafka写入数据的生产者、一个可以从Kafka读取数据的消费者,或者一个兼具两种角色的应用程序。 Kafka 生产者是指使用 Apache Kafka 消息系统的应用程序,它们负责将消息发送到 Kafka 集群中的一个或多

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包