消息队列学习 | 青训营笔记

97 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

KAFKA

使用场景

离线的处理业务
如日志信息、Metrics数据(对程序状态的采集)、用户行为(搜索、点赞、评论、收藏)

使用Kafka

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

Kafka中的基本概念

  • Topic:Kafak中的逻辑队列,可以理解成每一个不同的业务场景就是一个不同的topic,对于这个业务来说,所有的数据都存储在这个topic中

  • Cluster:Kafka的物理集群,每个集群中可以新建多个不同topic

  • Producer:消息的生成端,负责将业务消息发送到Topic当中

  • Consumer:消息的消费端,负责消费已经发送到topic中的消息

  • Partition:一个topic会有多个分片,不同分片直接消息是可以并发处理,提高单个Topic的吞吐

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

  • Offset:一个Partition存储了多个消息,每个消息都有一个Offset作为partition内的相对位置信息

  • Replica Partition的副本,一个Partition具有多个不同的副本,分布在集群不同的机器上,达到容灾的作用 Leader:对外进行写入和读取生产者的信息,Follower:不断地从Leader拉取消息,尽量保持于Leader同步

  • ISR(In-Sync Replicas) 一个Partition中存在一个ISR,与Leader的信息大致保持同步的Follower会存放在ISR中,如果Follower的信息与Partition差距较大,则被踢出ISR。以前是通过OFFSET差距进行判断,现在是通过时间差距进行判断。假设Leader所在的机器发生了宕机,那么可以在ISR中选择一个Follower副本提升为Leader

增加带宽

  • 批量发送 减少IO次数,加强发送能力
  • 如果消息量很大,网络带宽不够用,可以通过压缩,减少消息大小

Broker

image.png

  • 在消息写入磁盘的过程中,我们需要移动磁头找到对应磁道,磁盘转动,找到对应扇区,最后写入。在此过程中,寻道的成本比较高,因此顺序写可以减少寻道所带来的时间成本,提高写入效率

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

  • Kafka的文件索引采用稀疏索引进行构建

  • Broker文件的两种索引方式:偏移量索引,时间戳索引

  • 数据拷贝 对于传统方式来说,我们从磁盘中读出数据,通过内核态得到内核空间,再拷贝到用户态(应用空间)再传输给SocketBuffer 和NIC Buffer最后发送给消费者进程
    在Broker中,我们从磁盘中读出数据,通过内核态得到内核空间,并将数据传送给ReadBuffer,Read Buffer直接将数据发送到NIC Buffer最后发送给消费者进程

Partition在Consumer Group的分配方式

1.手动分配(Low Level)
哪一个Consumer消费哪一个Partition 完全由业务来决定 好处:启动比较快 缺点:(1)如果某一个Consumer失效了,对应的Partition也会停止消费(2)新增一个Consumer,我们需要进行重新配置

image.png
2. 自动分配(High Level) 对于不同的Consumer Group虚都会选取一台Broker当作Coordinator,Coordinator可以帮助Consumer Group进行分片的分配 好处:如果ConsumerGroup中有发生宕机,或者有新的Consumer加入,整个partition和consumer都会重新进行分配来达到一个稳定的消费状态 image.png