kafka的一些核心理论知识
Agenda
Apache Kafka: Core Concepts
- Kafka Record
- Topic and partition
- Segments
- Replication Factor
- Producer
- Consumer
- Rebalance
- Consumer Offsets
- Commit
- Delivery semantics for consumers
1. Kafka Record
每一条发布到Kafka的消息被称为 “Record”
Record包含两个部分:
- Key
- Value
2. Topic and partition
Topic
- 主题,kafka中的消息以topic进行分类,生产者将消息发送到特定的主题,而消费者则订阅特定的主题;
- 类似于数据库中没有任何约束的表
Partition
- 物理上的概念,一个topic可以分为多个partition,每个partition内部是有序的
- 分区内的每个消息将获得一个递增id,叫做offset
- 所有具有相同key的消息会被分到同一个partition
Partitions Count
- 越多的partition可以提供更高的吞吐量
- 越多的partition意味着需要更多的硬盘空间
- 越多的partition增加了复制的延迟
Guidelines
- Partitions per topic = (1 to 2) x (# of brokers), max 10 partitions
- Example: in a 3 brokers setup, 3 or 6 partitions is a good number to start with
Offset
一个消息最终存储到某个主题的某个分区中,分区在存储层面是一个可追加的日志文件,消息被追加到分区日志时会分配一个偏移量(offset),offset是消息在分区中的唯一标识,通过它可以保证消息在分区内有序。
3. Segments
每个partition的文件夹由segment文件组成,segment文件包含.index文件、.log文件、.timeindex文件(早期版本中没有)三个文件, log文件就实际是存储message的地方,而index和timeindex文件为索引文件,用于检索消息。
4. Replication Factor
replication指的是消息的备份,为了保证kafka的高可用(当leader节点挂了之后,kafka依然能提供服务)kafka提供了备份的功能。这个备份是针对partition的。
配置数量:
应该至少是2,最大是3
如果有3个broker,设置为2
如果broker数量大于5,设置为3
5. Producer
6. Consumer
- 多个消费者可以组成一个消费者组(consumer group),每个消费者组都有一个group.id,同一个消费组者的消费者可以消费同一topic下不同分区的数据,但是不会组内多个消费者消费同一分区的数据
- 如果consumer group的消费者数量多于partition的数量,多出来的消费者不消费任何partition的数据。所以在实际的应用中,建议消费者组的consumer的数量与partition的数量一致
7. Rebalance
Rebalance会发生在:
- 一个消费者加入这个组
- 一个消费者挂掉了
- 添加新的分区
8. Consumer Offsets
- Kafka把consumer group提交的offsets保存在“__consumer_offsets”文件夹里
- 这样consumer就可以记住消费到了哪里
- 更新分区当前位置的操作叫作提交
9. Commit
Kafka Consumer API提供了多种方式提交偏移量:
自动提交
手动提交
- 同步提交, commitSync()
- 异步提交, commitAsync()
- 同步和异步混合提交
- 提交特定的偏移量
10. Delivery semantics for consumers
Kafka有3种交付语义:
- At most once(最多一次): 消息可能会丢,但绝不会重复传输
- At least once(至少一次):消息绝不会丢,但可能会重复传输
- Exactly once(精确一次):每条消息肯定会被传输一次且仅传输一次