• 整体架构

    image.png

    • 没有推荐系统,不能成为互联网公司
    • 类似京东公司,每一个页面操作都要埋点,实现闭环
    • 双十一 21秒PB; 在线计算、离线计算
    • kafka设计思想:
      • 生产者扩展
      • 消费者扩展
      • broker扩展
    • 核心:topic
      • 主题划分分区,为了横向扩展
      • 通过副本实现高可用
    • AR = ISR + OSR
      • AR: 所有副本
      • ISR: 同步副本 ; 保持一定同步
      • OSR: 非同步副本
    • 没有过半机制
      • 剩一个就可以升级
      • 过半机制: 网络繁忙、减轻网络负担
      • zookeeper最多一个node里面有1M
    • HW和LEO
      • 高水位:ISR里面最低的那一个: 整体的长度
      • LEO: 下一条写入的偏移量: 本broker的长度
    • 生产流程
      • 拦截器;序列化器;分区器

    image.png

    • 分区可以压缩分区;批处理
      • acks
    • -1: all ; 所有ISR确认
    • 0: 不需要确认 ; 用户收集
    • 1: leader分区确认;
      • 大数据允许数据不完整
      • 消费者和消费组
    • 同一消费组只有一个消费进度
      • 基于这点,一个topic最多只能被同一个组的一个消费者消费
        • 消费组再平衡问题
    • topic或者消费者变化
      • 消费者偏移量问题
    • 存在哪里? 存在kafka的offset主题里面; 老版本是zk里面,zk不适合高并发读写
      • 消费组的心跳机制
    • 消费者和分区有心跳
    • 一旦消费者变化需要再平衡
    • 有一个broker专门用来作为消费者协调器

      • image.png
      • 拦截器
      • 收到消息后需要反序列化
    • image.png
      • 消息只有拉取方式
    • 考虑背景: 大数据
    • 如果有推,会很轻松的压垮消费者
    • 更加方便控制数据流
    • rocket模拟了一个推模式: 每次拉取玩就发送一个请求
      • 位移提交
    • 自动提交
      • 每隔5秒
    • 手动
      • 同步:
        • 消息失败可以控制不提交
        • 等确认后再继续,会很慢
      • 异步:
        • 为了提高效率

    image.png

    • 异步提交最佳实践

    image.png

    • 消费者有API可以手动修改偏移量: seek
    • 可以手动指定分区吗?
      • 自定义分片策略:可以手动指定分区
      • image.png
      • 如何指定分区:
        • API里面有分区参数
    • KafkaAdminClient
      • 管理分区
    • 偏移量管理
      • 一个offset主题里面
      • 早期用的zk
    • 选举leader
      • 在zk上维护了ISR,随机选一个
      • ISR都没了,可以配置
        • 等待ISR;
        • 找一个OSR;消息可能流失
    • 分区分配策略
      • Range: 有偏向
      • 轮训: 有偏向
      • sticky: 根据上一次分配;更均衡
    • 日志文件
      • .index
      • .log
      • .timeindex
    • 索引分为: 偏移量和时间戳
      • 不是每一条,而是每4k创建一个
    • 清理策略:
      • 删除: 默认七天
      • 压缩: 只留下某一个key最新的数据
    • 磁盘存储
      • 零拷贝
        • 面试问的比较多
        • image.png
        • broker内部直接发出去,不需要拷贝到JVM里面
        • image.png
      • 页缓存
        • 操作系统不用拷贝
        • image.png
      • 顺序写
      • 批处理
    • 事务
      • 两次提交
    • 失效副本: ISR变成OSR
    • 延时、重试自身不支持;用的不多
    • 集群没啥好说的
    • zookeeper作用
      • 元信息存储
      • consumer的消费状态
      • group的管理
      • 选举和检测broker存活
    • kefka支持精确一次;最多一次;最少一次