Kafka消息队列 | 青训营笔记

30 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第14天

只不过是字节给我的任务罢了

消息队列

  • 删库跑路,系统崩溃

    • 解耦,将待处理任务放入消息队列
  • 服务能力有限

    • 削峰,将请求放入消息队列,每次只获取10个请求进行处理
  • 链式耗时长尾

    • 异步,将订单请求放入消息队列,显示订单正在处理,库存处理完毕后,用户方再显示已经处理的订单
  • 日志存储

    • 先存入消息队列,再存储

消息队列,是保存消息的一个容器,本质是一个队列,但是这个队列需要支持高吞吐、高并发、并且高可用

  • kafka:分布式、分区的、多副本的日志提交任务,高吞吐场景很出色
  • RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,实时场景应用
  • Pulsar:下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用存算分离的架构设计
  • BMQ:和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群

Kafka

使用

  • 创建集群
  • 新增Topic
  • 编写生产者逻辑
  • 编写消费者逻辑

基本概念

  • Topic:逻辑队列,不同的Topic可以建立不同的Topic

    • Partition,Topic内部分片,可以并发

      • Offset,消息在Partition内部的相对位置信息

      • Replica,每个分片都有多个Replica副本

        • Leader,负责读写,从ISR中选出
        • Follower,一个Replica有多个Follower,Follower与Leader保持一致,如果与Leader的差距过大(可配置差距),则会被踢出
        • ISR(In-Sync Replicas)
  • Cluster:物理集群,每个集群中可以建立多个不同的Topic

  • Producer:生产者,负责将业务消息发送到Topic中

  • Consumer:消费者,负责消费Topic中的消息

  • ConsumerGroup:消费者组,不同组的Consumer消费进度互不干涉

  • Controller负责告知其他Broker某Topic的分片所在位置

Kafka架构

image.png

Producer

  • 批量发送,减少IO次数,加强发送能力
  • 数据压缩,减少消息大小,目前支持Snappy、Gzip、LZ4、ZSTD压缩算法,推荐ZSTD

Broker

  • 数据存储

    • Replica

      • Log

        • LogSegment

          • .log日志文件
          • .index偏移量索引文件
          • .timeIndex时间戳索引文件
          • 其他文件
  • 磁盘结构

    • 采用顺序写的方式,提高写入效率
  • 如何找到消息?

    • Consumer通过发送FetchRequest请求消息数据,Broker会指定Offset处的消息,按时间窗口和消息大小窗口发送给Consumer
  • Broker偏移量文件

    • 二分找到小于Offset的最大文件
  • Broker时间戳索引文件

    • 在偏移量文件的基础上添加一层二级索引
  • 传统数据拷贝

    • 调用系统调用不经过应用空间和SocketBUffer,零拷贝

Consumer

消息的接收端

解决Partition在ConsumerGroup中的分配问题

  • 手动分配:哪一个Consumer消费哪一个Partition完全由业务决定

    • 优点:快速
    • 缺点:不能容灾
  • High Level,Coordinator感知Consumer状态,自动分配

  • Rebalance,选取一个Consumer当Leader,推导出分配方案,Consumer发送心跳

问题

  • 数据复制

  • 重启操作

    • 关闭重启
    • 切换Leader
    • 数据同步
    • Leader回切
  • 替换、扩容、缩容

  • 负载不均衡

参考

juejin.cn/post/719632…