Kafka 核心设计原理
Kafka 设计架构
- Message System -> Streaming Platform (但业界现在仍以Message 为主 )
- 特点
- 低延迟
- 高吞吐
- 水平扩展 (支持在线扩展)
- 顺序性
- 多场景 (离线,实时)
- 架构:
- Producer
- Broker
- Consumer
- Zookeeper (严格上说,不属于Kafka架构,但是为了支持分布式集群,必须使用ZK)
- 在架构设计时,应该保证Consumer的消费能力大于Producer。
- Producer在发送数据时,会有一个待发送队列(在内存中),达到一定数据量后,批量向Broker推送。
- Topic & Parition & Segment
- Record
- Key - Value
- Timestamp(流处理中使用)
- Topic
- 逻辑概念
- 发布 - 订阅 均基于Topic
- Partition
- 一个Topic 包含一个或多个Partition
- 每个Partition 物理上对应一个文件夹
- 均匀分布在各个Broker上
注: 数据写入是Append-Only的。有Paper表明,磁盘的顺序访问速度甚至大于内存的随机访问速度。
- Segment
- Partition可以认为是文件夹,Segment就可以认为是文件。
- 删除时,删除Segment,速度较快。
- Record
- Producer
- 消息发送
- 同步
- 异步
- 消息顺序性
- Queue
- Retry
- 消息路由 - Partition
- 同一用户采用同一Key,对Key取Hash,就可保证同一用户的数据都进同一Partition
- 消息发送
- Consumer API
- Low Level API / Assign (存在种种问题)
- 指定Partition
- 指定起始消费Offset
- 指定消息长度
- High Level API / Subscribe
- 引入了Consumer Group,解决问题
- Low Level API / Assign (存在种种问题)
- Consumer Group
- 以Partition划分,任何一个Partition只会被一个Consumer消费
- Rebalance
Kafka Rebalance 机制:
- 每加入/删除一个Consumer,就会触发Revoke
- 自治式 Rebalance
- 集中式 Rebalance:基于Coordinate
Kafka 高可用原理
- CAP 理论:分布式系统中,一致性、可用性、分区容忍性最多只可同时满足两个
- 一般分区容忍性都要求有保障,因此很多时候是在可用性与一致性之间做权衡
- ISR (In-Sync Replicas):
- 数据被所有Follower同步后,才Commit
- Follower一定时间不同步数据,会被踢除ISR。
- 当Follower同步速度提升到一定程度,又会被加入ISR中。
- Failover
- 旧主挂掉,随机选新主。
- 旧主恢复,不会变成Leader。会将自己最后一次Commit之后的数据全部删除,再同步。
Kafka Consumer Exactly Once
- 两阶段提交
- At least once + 下游幂等处理
- Offset 更新与数据处理放在同一事务中