[ 消息队列-Kafka | 青训营笔记 ]

121 阅读3分钟

一. 使用场景

  1. 日志信息
  2. Metrics数据
  3. 用户行为

二. 如何使用Kafka

  1. 创建集群
  2. 新增Topic
  3. 编写生产者逻辑
  4. 编写消费者逻辑

三. 基本概念

  1. Topic:逻辑队列,不同Topic可以建立不同的Topic(不同的业务场景)
  2. Cluster:物理集群,每个集群中可以建立多个不同的Topic
  3. Producer:生产者,负责将业务消息发送到Topic中
  4. Consumer:消费者,负责消费Topic中的消息
  5. ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉(消费顺序独立)
  6. Partition:通常topic会有多个分片,不同分片的直接消息是可以并发来处理的,以此提高单个Topic的吞吐
  7. Offset:消息在partition内的相对位置信息,可以理解为唯一ID, 在partition内部严格递增
  8. Broker:代表每一个Kafka的节点,所有的Broker节点最终组成了一个集群。中间有一个Broker同时也扮演了Controller的角色,Controller是整个集群的大脑,负责对副本和Broker进行分配

四. Kafka的优点

  • Producer-批量发送

批量发送可以减少I0次数,从而加强发送能力

  • Producer-数据压缩

通过压缩,减少消息大小,目前支持Snappy、 Gzip、 LZ4、ZSTD压缩算法

  • Broker-磁盘结构、顺序写

移动磁头找到对应磁道,磁盘转动,找到对应扇区,最后写入。寻道成本比较高,因此顺序写可以减少寻道所带来的时间成本。采用顺序写的方式进行写入,以提高写入效率

  • Broker-如何找到消息

Consumer通过发送FetchRequest请求消息数据,Broker会将指定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer

  • Broker偏移量索引文件

二分找到小于目标offset的最大文件

  • Broker时间戳索引文件

二分找到小于目标时间戳最大的索引位置,通过寻找offset的方式找到最终数据

  • Broker-零拷贝

Consumer从Broker中读取数据,通过sendfile的方式,将磁盘读到os内核缓冲区后,直接转到socket buffer进行网络发送 Producer生产的数据持久化到broker,采用mmap文件映射,实现顺序的快速写入

  • Consumer-High Level

在Broker集群中,对于不同的Consumer Group来讲,都会选取一台Broker当做Coordinator, 而Coordinator的作用就是帮助Consumer Group进行分片的分配,也叫做分片的rebalance,使用这种方式,如果ConsumerGroup中有发生宕机,或者有新的Consumer加入,整个partition和Consumer都会重新进行分配来达到一个稳定的消费状态

  1. Producer:批量发送、数据压缩
  2. Broker:顺序写,消息索引,零拷贝
  3. Consumer: Rebalance

五. Kafka的缺点

  • 重启操作
  • 替换、扩容、缩容
  • 负载不均衡
  1. 运维成本高
  2. 对于负载不均衡的场景,解决方案复杂
  3. 没有自己的缓存,完全依赖Page Cache
  4. Controller和Coordinator和Broker在同一进程中,大量I0会造成其性能下降

六. 个人感悟

1.还有很多要学习消化的知识,记得复习 2.多敲代码