admin 管理员组

文章数量: 1087139


2024年6月12日发(作者:linux找回误删的文件)

—————————————————————————————

尚硅谷大数据技术之Kafka

第3章 Kafka工作流程分析

Kafka集群管理消息

消费者消费消息

Kafka核心组成

Kafka Cluster

Broker1

message

from A-0

生产者生产消息

message to A-0

Topic A

Partition 0

Leader

ReplicationA/0

Topic A

Partition 1

Follower

ReplicationA/1

Broker2

Consumer A

Zookeeper

注册消息

Producer A

message to A-1

Consumer group

Zookeeper

message

from A-1

Topic A

Partition 0

Follower

message to B-0

Partition0

message0

Topic A

Partition 1

Leader

Consumer B

Broker3

message1

message

from B-0

Producer BConsumer C

3.1 Kafka生产过程分析

3.1.1 写入方式

producer采用推(push)模式将消息发布到broker,每条消息都被追加(append)到分

区(patition)中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障kafka吞吐率)。

3.1.2 分区(Partition)

消息发送时都被发送到一个topic,其本质就是一个目录,而topic是由一些Partition

Logs(分区日志)组成,其组织结构如下图所示:

更多Java –大数据 –前端 –python人工智能资料下载,可百度访问:尚硅谷官网

—————————————————————————————

尚硅谷大数据技术之Kafka

我们可以看到,每个Partition中的消息都是有序的,生产的消息被不断追加到Partition

log上,其中的每一个消息都被赋予了一个唯一的offset值。

1)分区的原因

(1)方便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个

topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了;

(2)可以提高并发,因为可以以Partition为单位读写了。

2)分区的原则

(1)指定了patition,则直接使用;

(2)未指定patition但指定key,通过对key的value进行hash出一个patition

(3)patition和key都未指定,使用轮询选出一个patition。

DefaultPartitioner类

public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[]

valueBytes, Cluster cluster) {

List partitions = ionsForTopic(topic);

int numPartitions = ();

if (keyBytes == null) {

int nextValue = nextValue(topic);

List availablePartitions =

blePartitionsForTopic(topic);

if (() > 0) {

int part = tive(nextValue) % ();

return (part).partition();

} else {

// no partitions are available, give a non-available partition

return tive(nextValue) % numPartitions;

}

} else {

// hash the keyBytes to choose a partition

return tive(2(keyBytes)) % numPartitions;

更多Java –大数据 –前端 –python人工智能资料下载,可百度访问:尚硅谷官网


本文标签: 消息 组成 集群