消息队列之Kafka | 青训营笔记

101 阅读5分钟

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

一、本堂课重点内容

  1. 消息队列的前世今生
  2. 消息队列-Kafka

二、详细知识点介绍:

前世今生

  1. TIB
  2. IBM MQ/WebSphere
  3. MSMQ
  4. JMS
  5. AMQP/RabbitMQ
  6. kafka
  7. RocketMQ
  8. Pulsar

kafka

使用场景

Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。

如何使用kafka

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

基本概念

  • Topic:逻辑队列,不同Topic可以建立不同的Topic
  • Cluster:物理集群,每个集群中可以建立多个不同的Topic
  • Producer:生产者,负责将业务消息发送到Topic中
  • Consumer:消费者,负责消费Topic中的消息
  • ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉
  • Offset:消息在partition内的相对位置信息,可以理解为唯一ID,在 partition内部严格递增。
  • Replica:每个分片有多个 Replica, Leader Replica将会从ISR中选出。
  • Partition:通常topic会有多个分片,不同分片直接消息是可以并发来处理的,这样提高单个Topic的吞吐

数据复制

kafka的topic被分成多个分区,分区是基本的数据块。每个分区可以有多个副本,其中一个是首领。所有事件都是发给首领副本,或者直接从首领副本读取事件。其他副本只需要与首领副本保持同步,并及时复制最新的事件。

kafka架构

image.png

批量发送

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

Producer数据压缩

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

Broker顺序写

采用顺序写的方式进行写入,以提高写入效率

Broker如何找到消息

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

Broker偏移量索引文件

二分找到小于目标 offset的最大索引位置

时间戳索引文件

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

Broker零拷贝

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

Counsumer 消息的接收端

对于一个Consumer Group来说,多个分片可以并发的消费,这样可以大大提高消费的效率,但需要解决的问题是,Consumer和Patition的分配问题,也就是对于每一个Partition来讲,该由哪一个Consumer来消费的问题。对于这个问题,我们一般有两种解决方法,手动分配和自动分配

CounsumerReBlanced

image.png

数据复制问题

对于kafka来说,每一个Broker上都有不同topic分区的不同队本,而每一个副本,会将其数据存储到放kafka节点上面,对于不同的节点之间,通过副本直接的数裾复制,来保证数据的最终一致性,与集群的高可用.

重启操作

如果我们对一个机器进行重启 首先,我们会关闭一个Broker,此时如果该Broker上存在副本的Leader,那么该副本将发生leader切换,切换到其他节点上面并且在ISR中的Follower副本,可以看到图中是切换到了第二个Broker上面 而此时,因为数据在不断的写入,对于刚刚关闭重启的Broker来说,和新Leader之间一定会存在数据的滞后,此时这个Broker会追赶数据,重新加入到ISR当中 当数据追赶完成之后,我们需要回切leader,这一步叫做prefer leader,这一步的目的是为了避免,在一个集群长期运行后,所有的leader都分布在少数节点上,导致数据的不均衡

替换、扩容、缩容

  • 替换,和刚刚的重启有什么区别,其实替换,本质上来讲就是一个需要追更多数据的重启操作,因为正常重启只需要追一小部分,而替换,则是需要复制整个leader的数据,时间会更长
  • 扩容,当分片分配到新的机器上以后,也是相当于要从0开始复制一些新的副本
  • 缩容,缩容节点上面的分片也会分片到集群中剩余节点上面,分配过去的副本也会从0开始去复制数据

问题

  • 运维成本高
  • 对于负载不均衡的场景,解决方案复杂
  • 没有自己的缓存完个依格PageCache
  • Controller 和Coordinator和Broker在同一进程中,大量IO会造成其性能下降

三、实践练习例子

暂无

四、课后个人总结

kafka是开发过程中经常用到的分布式消息队列,其中,需要我重点再去理解数据的复制,Broker如何找到消息,零拷贝机制,自动分配机制,重启、替换、扩容缩容,负载不均衡等问题,这对于深入理解kafka运行机制有很大帮助。