Kafka 工作流程分析
1、Kafka生产过程分析
(1)写入方式
producer采用推(push)模式将消息发布到broker,每条消息都被追加(append)到分区(patition)中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障kafka吞吐率)
(2)partition
说明:
- 消息发送时都被发送到一个topic,其本质就是一个目录,而topic是由一些Partition Logs(分区日志)组成.
- 每个Partition中的消息都是有序的,生产的消息被不断追加到Partition log上,其中的每一个消息都被赋予了一个唯一的offset值。
分区原因:
- 提升拓展性:每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了
- 提高吞吐能力:在进行数据写入时以 Partition 为单位进行写入。
分区依据:
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
// (1) 指定了patition,则直接使用该 Partition
int numPartitions = partitions.size();
if (keyBytes == null) {
int nextValue = nextValue(topic);
List<PartitionInfo> availablePartitions = cluster.availablePartitionsForTopic(topic);
if (availablePartitions.size() > 0) {
int part = Utils.toPositive(nextValue) % availablePartitions.size();
return availablePartitions.get(part).partition();
} else {
// no partitions are available, give a non-available partition
return Utils.toPositive(nextValue) % numPartitions;
}
} else {
// hash the keyBytes to choose a partition
return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
}
}
- 对于已经指定了 partition 的,则直接使用该partition;
- 未指定patition但指定key,通过对key的value进行hash出一个patition;
- patition和key都未指定,使用轮询选出一个patition;
(3)Replica(副本)
Replica流程(4)写入流程
流程图:
流程描述:
- producer先从zookeeper的 "/brokers/.../state"节点找到该partition的leader
- producer将消息发送给该leader
- leader将消息写入本地log
- followers从leader pull消息
- Follower将 pull到的消息写入本地log
- Follower 写入成功值后向leader发送ACK
- leader收到所有ISR中的replication的ACK后,增加HW
- 向producer发送ACK
2、 Broker 保存消息
(1)存储说明
- 物理上把topic分成一个或多个patition,每个patition物理上对应一个文件夹(该文件夹存储该patition的所有消息和索引文件)
- Kafka读取特定消息的时间复杂度为O(1);
- 消息数据是存储在partition文件夹下的*.log文件中的;
- 消息存储时常有两个策略,分别为:
基于时间存储策略:默认保留168小时(log.retention.hours=168)
基于大小保留策略:默认保留 1G(log.retention.bytes=1073741824)
(2)Zk存储结构
Zk存储结构3、consumer flow
(1) 高级API与低级API
- kafka提供了两套consumer API:高级Consumer API和低级Consumer API。
- 高级API不需要自行去管理offset,partition replica等,系统通过Zk自行管理。(低级 API反之)
(2)Consumer Group(消费者组)
流程图:
描述说明:
- Consumer Group 由多个Consumer 组成,同时一个Consumer只有属于一个Consumer Group。
- Consumer Group 保证了其订阅的Topic partition 会被该Consumer Group 中的Consumer消费。对于多个Consumer Group订阅了同一个Topic,每个Consumer Group之间互不影响。
- 如果要实现一个消息被多个 consumer 消费,则可以将当consumer 单独添加到单独的Consumer Group中(反之,如果要实现一个消息 被一个 consumer 消费,则可以将当consumer 添加到同一个Consumer Group中)
网友评论