Kafka 工作原理

一、消息路由策略

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

1) 若指定了 partition,则直接写入到指定的 partition;

2) 若未指定 partition 但指定了 key,则通过对 key 的 hash 值与 partition 数量取模,该取模

结果就是要选出的 partition 索引;

3) 若 partition 和 key 都未指定,则使用轮询算法选出一个 partition。

二、消息写入算法

 

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

1) producer 向 broker 集群提交连接请求,其所连接上的任意 broker 都会向其发送 broker

controller 的通信 URL,即 broker controller 主机配置文件中的 listeners 地址

2) 当 producer 指定了要生产消息的 topic 后,其会向 broker controller 发送请求,请求当前

topic 中所有 partition 的 leader 列表地址

3) broker controller在接收到请求后,会从 zk中查找到指定 topic的所有 partition的 leader,

并返回给 producer

4) producer 在接收到 leader 列表地址后,根据消息路由策略找到当前要发送消息所要发送

的 partition leader,然后将消息发送给该 leader

5) leader 将消息写入本地 log,并通知 ISR 中的 followers

6) ISR 中的 followers 从 leader 中同步消息后向 leader 发送 ACK

7) leader 收到所有 ISR 中的 followers 的 ACK 后,增加 HW,表示消费者已经可以消费到该位置

HW 截断机制

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

2.2.4 消息发送的可靠性机制

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

10

异步发送。生产者向 kafka 发送消息而不需要 kafka 反馈成功 ack。该方式效率最高,但可靠性最低。其可能会存在消息丢失的情况。

21

同步发送,默认值。生产者发送消息给 kafka,broker 的 partition leader 在收到消息后马上发送成功 ack(无需等待 ISR 中的 follower 同步完成),生产者收到后知道消息发送成功,然后会再发送消息。如果一直未收到 kafka 的 ack,则生产者会认为消息发送失败,会重发消息。

3-1

同步发送。其值等同于 all。生产者发送消息给 kafka,kafka 收到消息后要等到 ISR 列表中的所有副本都同步消息完成后,才向生产者发送成功 ack。如果一直未收到 kafka 的 ack,则认为消息发送失败,会自动重发消息。

2.2.5 消费者消费过程解析

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

1) consumer 向 broker 集群提交连接请求,其所连接上的任意 broker 都会向其发送 broker

controller 的通信 URL,即 broker controller 主机配置文件中的 listeners 地址

2) 当 consumer 指定了要消费的 topic 后,其会向 broker controller 发送 poll 请求

3) broker controller 会为 consumer 分配一个或几个 partition leader,并将该 partitioin 的当

前 offset 发送给 consumer

4) consumer 会按照 broker controller 分配的 partition 对其中的消息进行消费

5) 当消费者消费完该条消息后,消费者会向 broker 发送一个该消息已被消费的反馈,即

该消息的 offset

6) 当 broker 接到消费者的 offset 后,会更新到相应的__consumer_offset 中

7) 以上过程一直重复,直到消费者停止请求消息

8) 消费者可以重置 offset,从而可以灵活消费存储在 broker 上的消息

2.2.6 Partition Leader 选举范围

当 leader 挂了后 broker controller 会从 ISR 中选一个 follower 成为新的 leader。但,若 ISR中的所有副本都挂了怎么办?可以通过 unclean.leader.election.enable 的取值来设置 Leader选举的范围。

1false

必须等待 ISR列表中有副本活过来才进行新的选举。该策略可靠性有保证,但可用性低。

2true

在 ISR 中没有副本的情况下可以选择任何一个没有宕机主机中该 topic 的 partition 副本作为新的 leader,该策略可用性高,但可靠性没有保证。

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

最常见的重复消费有两种:

1) 同一个 consumer 重复消费

当 Consumer 由于消费能力较低而引发了消费超时时,则可能会形成重复消费。

2) 不同的 consumer 重复消费

当 Consumer 消费了消息但还未提交 offset 时宕机,则这些已被消费过的消息会被重复消费。

2.3 Kafka 集群搭建

在生产环境中为了防止单点问题,Kafka 都是以集群方式出现的。下面要搭建一个 Kafka集群,包含三个 Kafka 主机,即三个 Broker。 待下章节

2.3.1 Kafka 的下载

 

猜你喜欢

转载自blog.csdn.net/superiorpengFight/article/details/109270723