kafka 消息分发原理

Topic 和 Partition

Topic
在 kafka 中,topic 是一个存储消息的逻辑概念,可以认为是一个消息集合。每条消息发送到 kafka 集群的消息都有一个类别。物理上来说,不同的 topic 的消息是分开存储的,每个 topic 可以有多个生产者向它发送消息,也可以有多个消费者去消费其中的消息

Partition
每个 topic 可以划分多个分区(每个 Topic 至少有一个分区),同一 topic 下的不同分区包含的消息是不同的。每个消息在被添加到分区时,都会被分配一个 offset(称之为偏移量),它是消息在此分区中的唯一编号,kafka 通过 offset保证消息在分区内的顺序,offset的顺序不跨分区,即kafka只保证在同一个分区内的消息是有序的
在这里插入图片描述
创建一个带分区的topic testp 并且备份数为2

[root@zk03 bin]# ./kafka-topics.sh --create --zookeeper zk01:2181,zk02:2181,zk03:2181 --replication-factor 2 --partitions 3 --topic testp
Created topic "testp".

可以看到三台kafka服务器上 每台服务器上 都有 两个testp的分片文件。三个分片 每个分片两份,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

kafka消息分发策略

消息是 kafka 中最基本的数据单元,在 kafka 中,一条消息由 key、value 两部分构成,在发送一条消息时,我们可以指定这个 key,那么 producer 会根据 key 和 partition 机制来判断当前这条消息应该发送并存储到哪个partition中。我们可以根据需要进行扩展 producer 的 partition 机制。
代码演示:

默认情况下,kafka 采用的是 hash 取模的分区算法。如果Key 为 null,则会随机分配一个分区。这个随机是在这个参数”metadata.max.age.ms”的时间范围内随机选择一个。对于这个时间段内,如果 key 为 null,则只会发送到唯一的分区。这个值默认情况下是 10 分钟更新一次。

Metadata

Metadata,是Topic/Partition 和 broker 的映射关系,每一个 topic 的每一个 partition,需要知道对应的 broker 列表是什么,leader是谁、follower 是谁。这些信息都是存储在 Metadata 这个类里面

猜你喜欢

转载自blog.csdn.net/zhangxm_qz/article/details/87634000