一、Kafka的结构

查看kafka队列中的消息 kafka消息队列数据结构_观察者模式

重点在于Broker的结构。每一个消息归宿于特定的Broker下的特定的Topic下特定的Partion。而这些对应关系则被ZooKeeper记录下来。

查看kafka队列中的消息 kafka消息队列数据结构_解耦_02

 二、特点

异步通信

查看kafka队列中的消息 kafka消息队列数据结构_查看kafka队列中的消息_03

一种典型的观察者模式的实现。

观察者模式—菜鸟教程

解耦

查看kafka队列中的消息 kafka消息队列数据结构_解耦_04

 可以并行的任务可以作为不同的消息放进消息队列,由多个系统并行处理。如上图当支付完成后,向消息队列中放入多个不同的任务(消息),后台系统通过订阅拉取对应的任务进行处理。即可做到解耦和异步通信。

削峰

查看kafka队列中的消息 kafka消息队列数据结构_观察者模式_05

 类似于延迟满足,通过拖延消息处理来缓解消息压力。

三、原理(细节)

由上面可以看出来,Kafka的结构可以理解为一个列表(Broker)套列表(Topic)套队列(Partion)。而消息本身就像树节点一样不具备记录自身路径的能力,记录树这个数据结构的就是ZooKeeper。

这里比较特殊的一点是:Kafka中的分区(Partion)可以分布在不同的服务器(broker)上,即一个主题可以跨越多个broker。Kafka保证的是分区有序而不是主题有序。分区(Partion)还有多个副本(Replica)用来进行容灾备份。多个副本之间是一主多从结构。

查看kafka队列中的消息 kafka消息队列数据结构_观察者模式_06

假设有三个主题P1-3,每个主题有1个分区,每个分区有三个备份(Kafka中的备份即是全部的主+从数目)。分布在4个Broker上。

查看kafka队列中的消息 kafka消息队列数据结构_异步通信_07

 分区(Partion)由偏移量(Offset)进行指示:

查看kafka队列中的消息 kafka消息队列数据结构_观察者模式_08

 Last Committed Offset:Consumer最后提交的位置。

Current Position:Consumer当前读取的位置,但是还没有提交给broker。提交之后就变成Last Commit Offset。

High Watermark(HW):consumer不能读取超过HW的消息,因为这意味着读取到未完全同步(因此没有完全备份)的消息。

Log End Offset:当前的最新日志写入(或者同步)位置。

一个Leader,多个Follower。那么肯定有些和Leader完全同步,构成ISR集合。有些没有完全同步,构成OSR集合。所有的副本(Replica)即Total(Leader+Follower) 统称为AR,即AR=ISR+OSR。