曹耘豪的博客

Kafka基础

  1. 服务端
    1. 注册
    2. 多副本(Replica)
      1. ISR(In-sync replicas)
      2. HW(High Watermark)
      3. 同步机制
    3. 日志
      1. 日志清除
      2. 日志Compact
    4. Controller
  2. 客户端
    1. Producer
      1. 基本功能
      2. 重要参数
      3. 分区分配策略
      4. 幂等功能(0.11.0.0)
    2. Consumer
      1. offset
      2. 反序列化
      3. Consumer Group的rebalance
        1. 触发时机
        2. 分配策略
    3. 如何保证消息不丢失
      1. producer配置
      2. consumer配置

服务端

下载地址:https://kafka.apache.org/downloads

注册

broker向ZK注册:$chroot/brokers/ids/{broker.id}

多副本(Replica)

每个分区有多个副本。一个是leader,其他是follower,follower只能被动的向leader请求同步数据,不提供读写服务

ISR(In-sync replicas)

只有ISR集合内的follower才有资格竞选leader,和leader保持相同的HW

1
2
3
0  1  2  3  4  5  6  7  8  9  10  11  12  13
| | |
base offset high watermark(HW) log end offset(LEO)

HW(High Watermark)

同步机制

日志

以partition为单位,每个partition有自己的日志(partition log),如果topic名为test,则其第0个分区的文件目录类似如下:

1
2
3
4
5
6
> ls xxx/kafka_1/test-0
00000.index
00000.log // 真实kafka记录
00000.timeindex
01000.log // 文件命名为第一条记录的offset,也就是说00000.log文件里包含1000个记录(0-999)
01000.timeindex

日志清除

日志Compact

对于一个partition内的相同key的记录,仅保存最新的值,没有key的无法compact

Controller

某个broker会被选举成为controller,用于管理每个broker上的分区副本和每个分区的leader副本信息

客户端

Gradle配置:org.apache.kafka:kafka-clients:3.4.0

Producer

基本功能

  1. 序列化
  2. 分区
    • 如果没有设置partition,则轮询(peekCurrentPartitionInfo
    • 如果有Key,则使用murmur2算法计算hash值
    • 自定义
  3. 拦截器
    • Properties配置项:interceptor.classes
    • 接口:ProducerInterceptor
    • onSend:发送前调用
    • onAcknowledgement:broker返回后调用
    • close:执行一些清理动作
  4. 压缩
    • GZIP
    • Snappy
    • LZ4
    • Zstd
  5. Sender发送
    • 将消息放入缓冲区,由IO线程发送
    • 收到response后,依次调用回调方法

重要参数

分区分配策略

幂等功能(0.11.0.0)

Consumer

offset

消费的offset保存在__consumer_offsets topic下

offset的维度:每个独立的consumer或者Consumer Group,在每个topic的partition上有一个offset

反序列化

org.apache.kafka.clients.consumer.internals.Fetcher#parseRecord

Consumer Group的rebalance

触发时机
分配策略

如何保证消息不丢失

producer配置

consumer配置

   / 
  ,