Kafka的工作原理和过程

本文详细介绍了Kafka的生产消息过程,包括消息写入算法、路由策略、HW截断机制和可靠性机制。在消费消息部分,解析了消费者消费流程、Partition Leader选举以及重复消费的解决方案。

目录

 

第1章 生产消息

1.1 消息写入算法

1.2 消息路由策略

1.3 HW截断机制

1.4 消息发送的可靠性机制

第2章 消费消息

2.1 消费者消费过程解析

2.2 Partition Leader选举范围

2.3 重复消费问题及解决方案


第1章 生产消息

1.1 消息写入算法

消息生产者将消息发送给broker,并形成最终可供消费者消费的log,是个比较复杂的过程。

  • producer向broker集群提交消息发送请求
  • broker controller接受该请求,并根据消息路由策略计算出该消息要写入的partition
  • broker controller根据 topic 和 partition 去 zookeeper 中找对应的znode状态中该partition的leader。
  • broker controller 向producer反馈消息要写入的partition leader。
  • producer发送消息给该leader。
  • leader接受消息并将该消息写入本地log,通知ISR中的followers进行消息同步。
  • ISR中的followers从leader同步消息完成后,向leader发送ACK
  • leader收到所有ISR中的follower的ACK后,增加HW表示消费者已经可以消费到该位置了。

1.2 消息路由策略

在通过API方式发送消息时,生产者是以record为消息进行发布的。record中包含keyvalue,value才是真正的消息本身,而key由于路由消息所有存放的partition。消息要写入到哪个partition并不是随机的,而是有路由策略的。

  1. 若指定了partition,则直接写入到指定的partition。
  2. 若未指定partition但指定了key,则通过对key的hash值与partition数量取模,该取模结果就是要选出的partition索引。
  3. 若 partition 和 key 都未指定,则使用轮询算法选出一个partition。

1.3 HW截断机制

如果partition leader接收到了新的消息,ISR中其它Follower正在同步过程中,还未同步完毕时leader宕机了。。此时就需要重新选举出新的leader。这时就需要HW拦截机制了,若没有HW拦截机制,将会导致partition中leader与follower数据的不一致。

1.4 消息发送的可靠性机制

生产者向kafka发送消息是,可以选择需要的可靠性级别。通过acks参数的值进行设置。

  • 0 值
    异步发送。生产者想kafka发送消息儿不需要kafka反馈成功ack。该方式效率最高,但可靠性最低。可能会存在消息丢失的情况。
  • 1 值
    同步发送,默认值。生产者发送消息给kafka,broker的partition leader在收到消息后马上发送成功ack,生产者收到后知道消息发送成功,然后会再发送消息;如果一直未收到kafka的ack,则生产者会认为消息发送失败,会重发消息。
  • -1 值
    同步发送。生产者发送消息给kafka,kafka收到消息后要等到ISR列表中的所有副本都同步消息完成后,才向生产者发送成功ack。如果生产者一直未收到kafka的ack,则认为消息发送失败,会自动重发消息。

第2章 消费消息

2.1 消费者消费过程解析

生产者将消息发送到topic中,消费者即可对其进行消费,其消费过程如下:

  • 消费者订阅指定topic的消息。
  • broker controller 会为消费者分配partition,并将该partition的当前offset发送给消费者。
  • 当broker接收到生产者发送的消息时,broker会将消息推送给消费者。
  • 消费者接收到broker推送的消息后,对消息进行消费。
  • 当消费者消费完该条消息后,消费者会向broker发送一个该消息已被消费的反馈,即该消息的offset。
  • 当broker接到消费者的offset后,会更新到相应的_consumer_offset中。
  • 以上过程一直重复,直到消费者停止消费消息。
  • 消费者可以重置offset,从而可以灵活消费存储在broker上的消息。

 

2.2 Partition Leader选举范围

当leader宕机后broker controller会从ISR中选一个follower成为新的leader。但若ISR中没有其他的副本怎么办?可以通过unclean.leader.election.enable的取值来设置leader选举的范围。

  1. false
    必须等待ISR列表中有副本活过来才进行新的选举。改厕罗可靠性有保证,但可用性低。
  2. true 
    在ISR中没有可用副本的情况下,可以选择任何一个没有宕机的主机作为新的leader,该策略可用性高,但可靠性没有保证。

2.3 重复消费问题及解决方案

//TODO

 

 

 

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值